【问题标题】:Including multiple classes within a .h file在 .h 文件中包含多个类
【发布时间】:2015-05-26 22:56:04
【问题描述】:

假设我有 4 个类 A、B、C 和 D,我想在一个实现来自另一个 .h 文件用户的纯虚函数的类中使用所有 4 个类。我的问题是如何将这 4 个类包含在一个 .h 中,这样 .h 的 .cpp 将允许我在类中调用这些函数。

这是我迄今为止尝试过的:

#include "User.h"
#include "A.h"
#include "B.h"
#include "C.h"
#include "D.h"

Class create : public User, public A, public B, public C, public D
{
public:
    create();
    virtual ~create();

    bool a1();
    bool b1();
    bool c1();
    bool d1();

    int a2();
    int b2();
    int c2();
    int d2();
};

然后,当我尝试在 create.cpp 中调用这些函数(在 A.cpp、B.ccp、C.cpp、D.cpp 中声明)时,我被告知“未定义对 A::a1( ) 的引用。 ..等等。

这有意义吗?

【问题讨论】:

  • 您是否链接到来自 A.cpp 等的已编译对象?
  • 在 C++ 术语中,文件内容与其名称之间没有必要存在关联。你可以安全地做任何你喜欢的事情。在 Animal.h 中定义 Plant 类是完全安全的。只要您正确链接文件,它就会起作用。
  • 请做一个简短的例子,我们可以复制并粘贴到我们的开发环境中,看看这个“未定义的参考”。
  • 我很抱歉我或多或少是 C++ 的初学者。基本上eclipse在我的create.cpp文件中给了我错误“未定义的A:a1()引用”。所以它连接了 a1( ) 函数来自 A 类的事实,所以我的问题是如何“定义”对该函数的引用。
  • @GWW 如何链接那些已编译的对象?

标签: c++


【解决方案1】:

undefined reference to ... 错误不是编译错误。这是一个链接器错误。

基本上,链接器是将多段目标代码(即编译代码)组合在一起以创建可执行文件的程序。在您的情况下,编译器知道方法 A::a1() 必须存在,同意它的声明(名称和参数)并且不抱怨它的使用。但是,liker 找不到它的定义(基本上,它的编译实现)。

您提供的详细信息太少,无法解释如何正确编译和链接代码,但该过程应包括编译每个包含类实现的 .cpp 文件。可以在以下问题中找到有关链接的一些详细信息:

C++ linking object's files (G++)

Linking files in g++

你可能需要做这样的事情:

g++ source_code.cpp A.cpp B.cpp C.cpp D.cpp

或类似的东西。如果需要链接目标代码, 将每个单独的 .cpp 文件编译成 .o 文件后,将 .cpp 扩展名替换为 .o

【讨论】:

  • 所以我需要用 .o 文件替换 .cpp 文件?
  • @FreddyRoller:正如我在回答中所说,您的问题中的信息太少,无法准确告诉您该怎么做。但主要思想是 GCC 需要了解所有类(它们的实现),或者通过提供它们的源代码或它们的 .o 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多