课程的联系

时间:2011-12-01 10:09:56

标签: c++

班级有外部联系吗?如果是这样,为什么我不能让以下内容在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);

我可以只包含该文件,但链接的目的是什么?

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在所有翻译单元中都是同一个类。 这并不意味着所有翻译单元都会自动知道它是如何形成的 定义;只是MyClassmycpp1.cpp的类型与。{1}}相同 MyClass中的mycpp2.cpp。由于与编译器和。相关的各种原因 在链接器技术中,您仍然需要在每个源中提供定义 (优选通过包括)使用它,但这些定义 要求是相同的(这是优选包含的原因), 因为编译器会生成将它们视为相同的代码。

答案 2 :(得分:1)

class MyClass; // why doesn't this work?

这是一个前向声明 - 它声明该类存在,但不提供使用它所需的信息。

只需要一个前向声明,你就可以做一些事情,包括声明一个指针或对它的引用,并用它作为参数或返回值声明一个函数。您无法实例化它,继承它,访问其任何成员,或者在没有完整定义的情况下执行各种其他操作,您需要包含头文件。

  

我可以只包含该文件,但链接的目的是什么?

头文件通常包含函数和对象的声明,然后可以在单独的源文件中完全定义,而不是使用它们的文件。这是链接的目的,但它没有扩展到允许类定义在单独的源文件中。