班级有外部联系吗?如果是这样,为什么我不能让以下内容在gcc上工作?
// mycpp1.cpp
class MyClass
{
int x;
// ......
};
`
// mycpp2.cpp
class MyClass; // why doesn't this work?
我已经做了一些谷歌搜索并来到这里,
C ++标准
(3.5 / 4)命名类(第9节),或者在a中定义的未命名类 typedef声明,其中类具有typedef名称 联系目的(7.1.3);
我可以只包含该文件,但链接的目的是什么?
答案 0 :(得分:2)
你应该这样做:
标题文件:声明应该放在.h
文件
// mycpp1.h
class MyClass
{
int x;
void f(); //only declaration
};
源文件::定义应该放在.cpp
文件
// mycpp1.cpp
#include "mycpp1.h"
void MyClass::f() //definition of member function
{
//code
}
然后使用MyClass
作为
// mycpp2.cpp
#include "mycpp1.h"
MyClass instance; // it should work!
我建议你选一本关于C ++的好的入门书。以下是关于C ++的好书的全面列表:
答案 1 :(得分:2)
为什么我一半同意Nawez你不应该太担心
联系,很高兴理解它,所以你知道为什么编码模式
你正在使用作品(以及为什么其他图案没有)。 Linkage定义了如何
名称(符号)绑定到实体(变量,函数,类型,
等等。)。外部链接表示名称(或合格版本)
它)绑定到所有翻译单元中的同一实体:在你的
例如,MyClass
在所有翻译单元中都是同一个类。
这并不意味着所有翻译单元都会自动知道它是如何形成的
定义;只是MyClass
中mycpp1.cpp
的类型与。{1}}相同
MyClass
中的mycpp2.cpp
。由于与编译器和。相关的各种原因
在链接器技术中,您仍然需要在每个源中提供定义
(优选通过包括)使用它,但这些定义
要求是相同的(这是优选包含的原因),
因为编译器会生成将它们视为相同的代码。
答案 2 :(得分:1)
class MyClass; // why doesn't this work?
这是一个前向声明 - 它声明该类存在,但不提供使用它所需的信息。
只需要一个前向声明,你就可以做一些事情,包括声明一个指针或对它的引用,并用它作为参数或返回值声明一个函数。您无法实例化它,继承它,访问其任何成员,或者在没有完整定义的情况下执行各种其他操作,您需要包含头文件。
我可以只包含该文件,但链接的目的是什么?
头文件通常包含函数和对象的声明,然后可以在单独的源文件中完全定义,而不是使用它们的文件。这是链接的目的,但它没有扩展到允许类定义在单独的源文件中。