Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++_Class_Visual Studio 2012_Prototyping - Fatal编程技术网

C++ C++;类原型

C++ C++;类原型,c++,class,visual-studio-2012,prototyping,C++,Class,Visual Studio 2012,Prototyping,我是不是遗漏了什么 class Foo; class Bar { public: Foo foo; }; class Foo { }; 错误: 错误C2079:“Bar::foo”使用未定义的类“foo” 当您正向声明一个类时,您可以对它进行指针和引用,但不能成为正向声明类类型的成员:需要Foo的完整定义来决定外部类的布局(即Bar),否则编译器无法决定条的大小和结构 但这是允许的: class Foo; class Bar { public:

我是不是遗漏了什么

class Foo;

class Bar {
    public:
        Foo foo;
};

class Foo { };
错误:

错误C2079:“Bar::foo”使用未定义的类“foo”


当您正向声明一个类时,您可以对它进行指针和引用,但不能成为正向声明类类型的成员:需要
Foo
的完整定义来决定外部类的布局(即
Bar
),否则编译器无法决定
条的大小和结构

但这是允许的:

class Foo;

class Bar {
    public:
        Foo* fooPtr;
        Foo& fooRef;
};

允许向前声明类的指针和引用的原因是指针和引用的大小不取决于它们指向(或引用)的类的结构。

向前声明类时,可以对其进行指针和引用,但是您不能创建前向声明类的类型的成员:需要
Foo
的完整定义来决定外部类(即
Bar
)的布局,否则编译器无法决定
Bar
的大小和结构

但这是允许的:

class Foo;

class Bar {
    public:
        Foo* fooPtr;
        Foo& fooRef;
};

允许向前声明类的指针和引用的原因是指针和引用的大小不取决于它们所指向(或引用)的类的结构。

是的,您缺少一个重要的问题:一个问题

我假设您想知道代码中出现了什么错误,以及编译器为什么会发出错误


为了计算类栏的布局,编译器必须知道Foo的大小。Foo对象的大小由它们的布局决定,要知道布局,编译器必须知道类定义。在您声明成员变量foo时,它只知道foo存在,而不知道它的大小,因为您之前只给了它一个声明,而没有给它一个定义。

是的,您遗漏了一些重要的东西:一个问题

我假设您想知道代码中出现了什么错误,以及编译器为什么会发出错误


为了计算类栏的布局,编译器必须知道Foo的大小。Foo对象的大小由它们的布局决定,要知道布局,编译器必须知道类定义。在您声明成员变量foo时,它只知道foo存在,而不知道它的大小,因为您以前只给它一个声明,而没有给它定义。

您应该使用指针foo*foo,因为在定义foo之前,编译器不知道foo的大小,因此无法决定Bar的大小。“…使用不完整的类型“Foo”“将是一条更清晰的错误消息。在定义
Bar
时,Foo未定义。编译器需要能够确定一个
将占用多少内存空间,并且它还不知道
Foo
有多大。关于不完整类型可以做什么和不能做什么的解释:这取决于你称之为“循环方法的相互依赖类”。基本上,您唯一不能做的事情就是让一个类
a
具有
B
类型的成员,该类本身具有
a
类型的成员(这似乎是合理的,因为这将是一个无限的数据结构)。其他一切都是可能的,只要您将声明与定义分开(即,只要您使用实现文件)。您应该使用指针Foo*Foo,因为在定义Foo之前,编译器不知道Foo的大小,因此无法确定条的大小。“…使用不完整的类型“Foo”这将是一条更清晰的错误消息。在定义
Bar
时,Foo未定义。编译器需要能够确定一个
将占用多少内存空间,并且它还不知道
Foo
有多大。关于不完整类型可以做什么和不能做什么的解释:这取决于你称之为“循环方法的相互依赖类”。基本上,您唯一不能做的事情就是让一个类
a
具有
B
类型的成员,该类本身具有
a
类型的成员(这似乎是合理的,因为这将是一个无限的数据结构)。其他一切都是可能的,只要您将声明和定义分开(即,只要您使用实现文件)。