【问题标题】:Linkage of classes类的链接
【发布时间】:2011-12-01 10:09:56
【问题描述】:

类有外部链接吗?如果是这样,为什么我不能让以下内容在 gcc 上工作?

// mycpp1.cpp

class MyClass
{
    int x;
    // ......
};

`

// mycpp2.cpp

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

我已经做了一些谷歌搜索并解决了这个问题,

C++ 标准

(3.5/4) 命名类(第 9 条),或定义在 typedef 声明,其中类具有 typedef 名称 链接目的 (7.1.3);

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

【问题讨论】:

  • why doesn't this work 是什么意思?
  • @Nawaz:这意味着如果我尝试在mycpp.cpp 中声明它的对象,MyClass 是未声明的
  • @user974191:我猜到了。所以我发布了关于你应该如何做的答案。

标签: c++


【解决方案1】:

为什么我有一半同意 Nawez 你不应该太担心 链接,很好理解,所以你知道为什么编码模式 您正在使用作品(以及为什么其他模式不使用)。链接定义了如何 名称(符号)绑定到实体(变量、函数、类型、 ETC。)。外部链接意味着名称(或限定版本 其中)绑定到所有翻译单元中的同一实体:在您的 在这种情况下,MyClass 在所有翻译单元中都是同一个类。 这并不意味着所有的翻译单元都会自动知道它是怎样的 定义;只是mycpp1.cpp 中的MyClassMyClassmycpp2.cpp。由于与编译器和 链接器技术,您仍然必须在每个源中提供定义 (最好通过包含)使用它,但是这些定义 必须是相同的(这就是为什么首选包含), 因为编译器会生成将它们视为相同的代码。

【讨论】:

  • 我有一半不同意这一点:“为什么我一半同意 Nawez 你不应该太担心链接”。我不仅这么说,我还补充了一句,“暂时”。至于“很好理解”,对于C++程序员来说,C++中的一切都很好理解。
  • @Nawaz:你为什么认为我不知道你在回答中展示了什么?无论如何,如果你不能或可以或者你不想解释,我不会争论:-)
  • @user974191:很明显你不知道基础知识。
【解决方案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++ 好书的综合列表:

【讨论】:

  • 类的联动呢?
  • @user974191:我建议你暂时不要担心这个。先学基础;之后你应该了解这些细节。
  • 谢谢,我想我不应该担心链接并坚持你展示的方式。
【解决方案3】:
class MyClass; // why doesn't this work?

这是一个前向声明 - 它声明该类存在,但不提供对其进行大量操作所需的信息。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多