'多重定义'错误

时间:2018-03-07 23:05:33

标签: c++

我试图创建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;

的多重定义

为什么它会给我这个错误信息?

2 个答案:

答案 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;
}

multiple definition in header file