在 c++ 中对错误的未定义引用(使用单例类)



我做了一个名为 Client 的类,定义在 client.h 中如下:

#ifndef __CLIENT_H__
#define __CLIENT_H__
#include <string>
using namespace std;
class Client {
public:
    Client(string n, string p) : name(n), password(p) {logged_in = true;}
    void set_name(string n, string p) {name=n; password=p; }
private:
    string name;
    string password;
    bool logged_in;
};
#endif

然后我从 admin.h 中名为 Admin 的客户端继承了一个单例类:

#ifndef __ADMIN_H__
#define __ADMIN_H__
#include "client.h"
using namespace std;
class Admin : public Client {
public:
    static Admin* get_admin(string n, string p)
    {
        if (Admin::n == 0)
            Admin::admin = new Admin(n, p);
        else
            Admin::admin->set_name(n, p);
        return Admin::admin;
    }
private:
    Admin(string n, string p) : Client(n, p) {Admin::n++;}
    static int n;
    static Admin* admin;
};
int Admin::n = 0;
#endif

这是我的主要.cpp:

#include <iostream>
#include <string>
#include "client.h"
#include "admin.h"
using namespace std;
int main()
{
    Admin* administrator = Admin::get_admin("ghamar", "utcom90");
}

问题是,当我想使用 g++ (g++ main.cpp 编译 main.cpp 时,我收到以下错误:

/tmp/cc15VnHc.o: In function `Admin::get_admin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
main.cpp:(.text._ZN5Admin9get_adminESsSs[Admin::get_admin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x5f): undefined reference to `Admin::admin'
main.cpp:(.text._ZN5Admin9get_adminESsSs[Admin::get_admin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0xa0): undefined reference to `Admin::admin'
main.cpp:(.text._ZN5Admin9get_adminESsSs[Admin::get_admin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0xd1): undefined reference to `Admin::admin'

错误的重要部分说:

undefined reference to 'Admin::admin'

有人可以帮助我解决这个问题吗?非常感谢您的时间。

除了在类定义中声明静态成员外,还需要在一个源文件中定义它们:

#include "admin.h"
int Admin::n = 0;
Admin* Admin::admin = 0;

您应该从标头中删除n的定义;如果包含来自多个源文件的标头,这将给出"多重定义"错误。= 0位是可选的,因为默认情况下静态对象初始化为零。

还应从包含保护的开头删除下划线;这些下划线是保留的,使用它们可能会导致与标准库实现使用的名称发生冲突。

您在这里有两个问题,到目前为止只看到一个错误。

您需要在单个源文件中定义Admin::nAdmin::admin。目前,前者是在标头中定义的(一旦多个源文件包含该标头,这将导致多定义错误),而后者根本没有定义。

从 admin.h 中删除Admin::n的定义,并将以下内容添加到单个源文件中:

#include "admin.h"
int Admin::n = 0;
Admin* Admin::admin = 0;

你已经声明了admin,但还没有定义它(但你已经定义了n):

int Admin::n = 0; 
Admin* Admin::admin;    // <-- add this
您需要

在类外部定义Admin,因为它是静态的。

Admin* Admin::admin = NULL;

最新更新