Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌套类和对外部类的引用(c+;+;)_C++ - Fatal编程技术网

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

C++ 嵌套类和对外部类的引用(c+;+;),c++,C++,这非常简单-gcc无法编译此示例代码(c++) 它告诉我 字段“某物”的类型不完整 我可能错过一些琐碎的事情,因为我在C++中是很新的,但是为什么我不能用外部类的引用来嵌套类/结构?< /p> 你不能把一个对象放到它自己里面去。也许您想要一个指向myclass的指针。您不能将对象放入自身。也许您想要一个指向myclass的指针。myclass尚未完全定义,您已经在使用它了。您可以使用指向myclass的指针来解决此问题。myclass尚未完全定义,您已经在使用它了。您可以通过使用指向myclas

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

它告诉我

字段“某物”的类型不完整


我可能错过一些琐碎的事情,因为我在C++中是很新的,但是为什么我不能用外部类的引用来嵌套类/结构?< /p> 你不能把一个对象放到它自己里面去。也许您想要一个指向myclass的指针。

您不能将对象放入自身。也许您想要一个指向myclass的指针。

myclass
尚未完全定义,您已经在使用它了。您可以使用指向
myclass
的指针来解决此问题。

myclass
尚未完全定义,您已经在使用它了。您可以通过使用指向
myclass
的指针来解决此问题。

为了创建
myclass
对象,您需要一个
mystruct
对象,该对象反过来需要一个
myclass
对象,因此。。。你明白了。链表是一种常见的情况,在这种情况下,您会遇到此类问题。你试过指针吗

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

为了创建一个
myclass
对象,您需要一个
mystruct
对象,它反过来需要一个
myclass
对象,所以。。。你明白了。链表是一种常见的情况,在这种情况下,您会遇到此类问题。你试过指针吗

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

好的,当你放置这个成员时,嵌套类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)
  • 嵌套类和嵌套类的自动友谊-嵌套类可以访问嵌套类的非公共成员。(二)
  • 将嵌套类从外部隐藏或封装到嵌套类中
以下是一个例子:

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习语中非常常用。我强烈建议您看看它。

好吧,在您放置该成员时,嵌套类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)
  • 嵌套类和嵌套类的自动友谊-嵌套类可以访问嵌套类的非公共成员。(二)
  • 将嵌套类从外部隐藏或封装到嵌套类中
以下是一个例子:

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习语中非常常用。我强烈建议你看看。

好的,可能就是这样。坏的java习惯。你也可以放置一个引用,但是你需要在参数化的constr中初始化它