我在运行需要运行的 C++ 程序时遇到了一些困难。问题本身不是我的,我必须让它编译。该算法非常庞大,因此对于我当前的错误消息,我将演示我生成的代码的更简化版本,它给出了完全相同的错误。这是代码:
class_1.h(class_1.cpp为空)
class class_1 {
public:
class_1();
virtual ~class_1();
virtual void function() =0;
};
class_2.h(class_2.cpp为空)
include"class_1.h";
class class_2 : public class_1{
public:
class_2();
virtual ~class_2();
virtual void function();
};
class_2a.h(class_2a.cpp为空)
include"class_2.h";
class class_2a : public flos2{
public:
class_2a();
virtual ~class_2a();
};
class_3.h
include "class_2a.h"
include "class_1.h" //I tried unsuccesfully without including class_1.h as well
class class_3 {
public:
class_3();
virtual ~class_3();
virtual void function();
private:
class_2a my_class_2a;
};
class_3.cpp
#include "class_3.h"
class_3::class_3()
:my_class_2a()
{
}
class_3::~class_3()
{
this->function();
}
void flos3::function()
{
my_class_2a.function();
/***Main Body of function***/
}
};
我收到的错误是链接器错误:
undefined reference to `class_2::function()'
我知道,总的来说,整个算法似乎很愚蠢,但或多或少这就是我所得到的,我不允许改变结构本身,只是为了让它工作。正如您在
class_1
中看到的,函数被定义为纯虚函数,然后通过其他类调用。我真的不知道如何让这件事发挥作用,所以任何帮助将非常感激......
您需要添加:
class_1.cpp:
class_1::~class_1() = default;
class_2.cpp:
class_2::~class_2() = default;
void class_2::function() {
// add code here (or not)
}
...等等。
您收到链接器错误,因为您的函数
class_2::function()
没有实现。你需要添加它,最好是在class_2.cpp文件中。
void class_2::function()
{
// Implementation goes here
}
所有虚拟析构函数都存在类似问题。他们也需要实施。
当您将析构函数声明为纯虚拟时,您仍然需要为其提供定义。
// MyAbstractClass.h
class MyAbstractClass
{
public:
virtual ~MyAbstractClass() = 0;
};
// MyAbstractClass.cpp
// Put in the implementation, otherwise the linker will complain about the multiple definitions.
MyAbstractClass::~MyAbstractClass() = default;
否则,如果您尝试销毁
MyAbstractClass
的子类,链接器会抱怨,因为根本没有基类的析构函数的定义。
有关此问题的更多信息可以在
Effective C++: 55 Specific Ways to Improve Your Programs, Item 7
中找到。