嵌套类和对外部类的引用(c ++)

时间:2009-02-17 06:19:12

标签: c++

这非常简单 - gcc无法编译此示例代码(c ++)。

class myclass {
    struct mystruct {
        myclass something;
        int something_else;
    };
};

它告诉我,那

  

字段'某事'的类型不完整。

我可能会错过一些微不足道的东西,因为我在c ++中很新,但为什么我不能使用对外部类的引用来创建嵌套的类/结构?

4 个答案:

答案 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 ++中的嵌套类会给你带来什么(可能还有更多 - 这是我的最爱):

  • 将外部类的成员包含在通常的非限定名称查找(1)
  • 嵌套类和嵌套类的自动友谊 - 嵌套类可以访问嵌套类的非公共成员。 (2)
  • 将嵌套类从外部隐藏或封装到嵌套类中。

以下是一个例子:

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;
    }
};