我试图创建User
类,但是每当我尝试编译此代码时,我都会收到错误输出:
#ifndef LOGIN_H
#define LOGIN_H
#include <string>
/* Classes */
class User {
std::string username, password;
public:
void set_user_username (std::string);
void set_user_password (std::string);
};
// Sets the User's username
void User::set_user_username (std::string input) {
username = input;
}
// Sets the User's password
void User::set_user_password (std::string input) {
password = input;
}
#endif // LOGIN_H
`User :: set_user_username(std :: string)&#39;
的多重定义
为什么它会给我这个错误信息?
答案 0 :(得分:3)
您正在定义头文件中.className {
background: url(../../../dir1/dir2/images/imageName.jpg) no-repeat; }
和set_user_username()
方法的主体,但在类声明之外。因此,如果将此头文件包含在多个转换单元中,则无论使用标头保护,链接器都将看到定义相同方法的多个目标文件,并且由于违反One Definition Rule而失败。 / p>
您需要:
将定义移至自己的翻译单元,然后在项目中链接该单元:
Login.h
set_user_password()
Login.cpp
#ifndef LOGIN_H
#define LOGIN_H
#include <string>
/* Classes */
class User {
std::string username, password;
public:
void set_user_username (std::string);
void set_user_password (std::string);
};
#endif // LOGIN_H
在类声明中移动内联定义:
Login.h
#include "Login.h"
// Sets the User's username
void User::set_user_username (std::string input) {
username = input;
}
// Sets the User's password
void User::set_user_password (std::string input) {
password = input;
}
答案 1 :(得分:1)
定义位于标题中,没有inline关键字。使用inline关键字或将定义移动到.cpp文件中。
// Sets the User's username
inline void User::set_user_username (std::string input) {
username = input;
}
// Sets the User's password
inline void User::set_user_password (std::string input) {
password = input;
}