由类中未实例化的静态成员变量引起的未定义引用C++

Undefined reference caused by uninstantiated static member variables in C++ class

本文关键字:未定义 C++ 引用 变量 静态成员 实例化      更新时间:2023-10-16
class User
{
public:
    User(char *name,char *pass)
    {
        strncpy(username[num],name,strlen(name));
        username[num][strlen(name)]='';
        for(int i=0;i<strlen(pass);i++)
            password[num][i]=(i+pass[i])%256;
        password[num][strlen(pass)+1]='';
        num++;
    }
    static void AddUser(char *name,char *pass)
    {
        strncpy(username[num],name,strlen(name));
        username[num][strlen(name)]='';
        for(int i=0;i<strlen(pass);i++)
            password[num][i]=(i+pass[i])%256;
        password[num][strlen(pass)+1]='';
        num++;
    }
    static int loggin(char *name,char *pass)
    {
        for(int i=0;i<num;i++)
            if(strcmp(username[i],name)==0)
            {
                for(int j=0;pass[j]!='';j++)
                    if(password[i][j]!=(j+pass[j])%256)
                        return -1;
                return i;
            }
        return -1;
    }
private:
    static char username[10][20];
    static char password[10][20];
    static int num;
};
int User::num=0;
int main()
{
    char name[20],pass[20];
    User u1("LiWei","liwei99");
    u1.AddUser("ChenHanfu","20090911");
    User::AddUser("Zhanggaolin","198845");
    cout<<"Input username:";
    cin>>name;
    cout<<"Input password:";
    cin>>pass;
    if(User::loggin(name,pass)>=0)
        cout<<"success login!"<<endl;
    else
        cout<<"login fail!"<<endl;
    return 0;
}

以上是我的 cpp 文件的代码。当我编译它时,

Compiling source file(s)...
    4.cpp
    4.cpp: In constructor `User::User(char*, char*)':
    4.cpp:13: warning: comparison between signed and unsigned integer expressions
    4.cpp: In static member function `static void User::AddUser(char*, char*)':
    4.cpp:22: warning: comparison between signed and unsigned integer expressions
    Linking...
    A:HomeworkCPPStuDebug4.o: In function `ZN4UserC1EPcS0_':
    A:HomeworkCPPStu4.cpp:(.text$_ZN4User6logginEPcS0_[User::loggin(char*, char*)]+0x2b): undefined reference to `User::username'
    A:HomeworkCPPStu4.cpp:(.text$_ZN4User6logginEPcS0_[User::loggin(char*, char*)]+0x65): undefined reference to `User::password'
    A:HomeworkCPPStu4.cpp:(.text$_ZN4User7AddUserEPcS0_[User::AddUser(char*, char*)]+0x2d): undefined reference to `User::username'
    A:HomeworkCPPStu4.cpp:(.text$_ZN4User7AddUserEPcS0_[User::AddUser(char*, char*)]+0x59): undefined reference to `User::username'
    A:HomeworkCPPStu4.cpp:(.text$_ZN4User7AddUserEPcS0_[User::AddUser(char*, char*)]+0x8b): undefined reference to `User::password'
    A:HomeworkCPPStu4.cpp:(.text$_ZN4User7AddUserEPcS0_[User::AddUser(char*, char*)]+0xf2): undefined reference to `User::password'
    A:HomeworkCPPStu4.cpp:(.text$_ZN4UserC1EPcS0_[User::User(char*, char*)]+0x2d): undefined reference to `User::username'
    A:HomeworkCPPStu4.cpp:(.text$_ZN4UserC1EPcS0_[User::User(char*, char*)]+0x59): undefined reference to `User::username'
    A:HomeworkCPPStu4.cpp:(.text$_ZN4UserC1EPcS0_[User::User(char*, char*)]+0x8b): undefined reference to `User::password'
    A:HomeworkCPPStu4.cpp:(.text$_ZN4UserC1EPcS0_[User::User(char*, char*)]+0xf2): undefined reference to `User::password'
    collect2: ld returned 1 exit status
    Student.exe - 10 error(s), 2 warning(s)

这些错误是由类中未实例化的静态成员变量引起的,所以我想知道如何解决这个问题。

解决方案:C++静态成员变量及其初始化

您应该像为 num 所做的那样显式实例化静态变量:

private:
    static char username[10][20];
    static char password[10][20];
    static int num;
};
int User::num=0;
char User::username[10][20];
char User::password[10][20];