获取虚拟破坏者的重新定义错误
Getting the redefinition error for virtual destructor
我有以下C 片段:
#include <iostream>
using namespace std;
class A
{
public:
virtual ~A()
{
}
};
A::~A()
{
}
int main(int argc, char * argv [])
{
return 0;
}
为什么我会遇到这些错误?:
错误:重新定义'a :: 〜a()'a :: 〜a()
错误:'Virtual A :: 〜A()'先前在此处定义
virtual ~A()**
只需在类中使用以下内容
virtual ~A();
而不是
virtual ~A()
{
}
编译器实际上是在告诉您这里的问题是什么。您有两个实现 - 您的班级中有一个内联,另一个在这里
A::~A()
{
}
您不能同时拥有。
声明和定义之间存在差异。C 遵循ODR-一个定义规则,即:您只需要定义一次。
-
声明=您让世界知道某些东西存在以及参数/返回类型
-
定义=您为该功能/class/object/whything
编写实际代码
在您的代码中,您有两个定义和一个声明。违反了ODR:
#include <iostream>
using namespace std;
class A
{
public:
virtual ~A() < - declares a virtual destructor
{ <- defines the code (nothing) for the virtual destructor
}
};
A::~A() <- defines the code AGAIN for the virtual destructor of the class A
{
}
int main(int argc, char * argv [])
{
return 0;
}
这是不允许的,因此是错误。如果定义是:
#include <iostream>
using namespace std;
class A
{
public:
virtual ~A()
{
printf("World?");
}
};
A::~A()
{
printf("Hello?");
}
编译器不知道您是否要打印"你好?"还是"世界?"。
virtual 关键字在这里无济于事,因为它只会说:"如果一个类从该类衍生并具有驱动器,则使用多态性"。在这里谈论多态性的是,我会放手。
您将两次定义灾难 - 一次在班级中,一次外面。您需要,例如将内联定义更改为声明:
virtual ~A();
这是类定义内部灾难函数的定义
class A
{
public:
virtual ~A()
{
}
};
这也是班级定义以外的驱动器定义。
A::~A()
{
}
因此,您两次定义了破坏者,并报告了有关此错误的编译器。
您可以通过以下方式定义班级内部的破坏者
class A
{
public:
virtual ~A() = default;
};
相关文章:
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件