奇怪的多重定义错误
Strange multiple definition error
vio@!@#$:~/cpp/OOP/6$ g++ -o main main.o NormalAccount.o HighCreditAccount.o Account.o AccountHandler.o
AccountHandler.o:(.bss+0x0): multiple definition of `AccountHandler::account_number'
main.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
我得到了上面的错误信息。但是我找不到它是乘法定义的代码,所以我在'account.h'和'AccountHandler.cpp'中将所有account_number更改为number_of_account。和
vio@!@#$:~/cpp/OOP/6$ vi AccountHandler.cpp
vio@!@#$:~/cpp/OOP/6$ g++ -c AccountHandler.cpp
vio@!@#$:~/cpp/OOP/6$ g++ -o main main.o NormalAccount.o HighCreditAccount.o Account.o AccountHandler.o
vio@!@#$:~/cpp/OOP/6$
它编译得很好。
之后,我对main.cpp做了一点修改
vio@!@#$:~/cpp/OOP/6$ g++ -c main.cpp
vio@!@#$:~/cpp/OOP/6$ g++ -o main main.o NormalAccount.o HighCreditAccount.o Account.o AccountHandler.o
AccountHandler.o:(.bss+0x0): multiple definition of `AccountHandler::number_of_account'
main.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
和错误信息再次出现。
我使用#ifndef #define #define在所有的头文件和当我改变AccountHandler.cpp和accounthandler.h中的变量时,它又编译好了,所以我想知道为什么会发生
代码如下:
#ifndef __ACCOUNTHANDLER_H__
#define __ACCOUNTHANDLER_H__
#include "account.h"
class AccountHandler
{
private:
Account* account[100];
static int number_of_account;
public:
AccountHandler(){}
void show_menu();
void make_account();
void deposit_money();
void withdraw_money();
void show_all_account_info();
~AccountHandler();
};
int AccountHandler::number_of_account=0;
#endif
如果您在头文件中定义了某些内容,那么它将在包含该头文件的每个翻译单元中定义-在您的情况下,包括AccountHandler
和main
。您应该在头文件中声明它(如果需要从多个单元访问它),并且在一个源文件中定义它。
假设它是一个静态类成员(我不得不猜测,因为您忘记向我们展示代码),您需要这样的内容:
// header
class AccountHandler
{
public:
static size_t number_of_account; // declaration
// other members...
};
// source file
size_t AccountHandler::number_of_account; // definition
在你的代码中,这个定义大概在头文件中。
这是假设它是静态的;它独立于任何特定的帐户(例如,它表示存在的帐户数量),而不是与每个帐户相关联(例如,它表示一个帐户号码)。如果它不应该是静态的,那么确保它没有声明为static
。
Include保护不能解决这个问题;它们可以防止头信息在每个翻译单元中被包含多次,但仍然允许它们从多个单元中被包含。
相关文章:
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件