这非常简单 - gcc无法编译此示例代码(c ++)。
class myclass {
struct mystruct {
myclass something;
int something_else;
};
};
它告诉我,那
字段'某事'的类型不完整。
我可能会错过一些微不足道的东西,因为我在c ++中很新,但为什么我不能使用对外部类的引用来创建嵌套的类/结构?
答案 0 :(得分:3)
您无法将对象置于其中。也许你想要一个指向myclass的指针。
答案 1 :(得分:2)
那么,当你放置那个成员时,嵌套类myclass还没有完成。当myclass完成时,您可以在之后定义mystruct类型:
class myclass {
struct mystruct;
};
struct myclass::mystruct {
myclass something;
int something_else;
};
请注意,仅仅因为mystruct是myclass的嵌套类型,这并不意味着myclass包含mystruct的对象。所以这里的圆形收容没有问题。既然你提到你来自Java - 当我告诉你嵌套类就像Java中的静态嵌套类时,它可能会有所帮助。事实上,C ++没有像Java中那样存在的“非静态嵌套类”。因此,如果您创建一个myclass对象,则既不会自动创建和嵌入mystruct对象,也不会在可以创建的mystruct和嵌套类的任何创建对象之间存在特殊关系。 C ++中的嵌套类会给你带来什么(可能还有更多 - 这是我的最爱):
以下是一个例子:
class myclass {
typedef int test_type;
struct mystruct;
mystruct * s;
};
struct myclass::mystruct {
mystruct() {
// note, setting private member (2)
something.s = this;
// note, we don't have to type myclass::test_type (1)
test_type silly_integer = 42;
}
myclass something;
int something_else;
};
但是你可能想在代码中放置一个指向嵌套类的指针 - 这在嵌套类进入游戏时经常需要。你必须记住,当你有一个变量时,该变量就是对象本身的名称 - 而不仅仅是对它的引用(比如在java中)。但是,C ++指针的行为类似于Java引用 - 它可以在其生命周期内为空并指向不同的对象:
struct myclass::mystruct {
myclass *something;
int something_else;
};
这将使它仅仅引用myclass类型的对象,该对象将在其他地方创建,而不是该对象本身。所以,它就像一个可能拥有一个父节点(由某些东西指向)的节点 - 但不必如此。就像一个指向某个容器的迭代器,它正在迭代。
还有另一种方法,其中嵌套类有一个指向嵌套类的指针(除了我上面的愚蠢示例)。这在 pimpl成语中非常常用。我强烈建议你看一下。
答案 2 :(得分:1)
myclass
尚未完全定义,您已经在使用它了。您可以使用指向myclass
的指针来解决此问题。
答案 3 :(得分:0)
为了创建一个myclass
对象,你需要有一个mystruct
对象,而这个对象又需要一个myclass
对象,所以......你得到漂移。链接列表是您遇到此类问题的常见情况。你试过指针吗?
class myclass {
struct mystruct {
myclass* something;
int something_else;
}
};