我创建了一个名为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中的Client名为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
这是我的main.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'
有人可以帮我解决这个问题吗?非常感谢您的时间。
答案 0 :(得分:2)
除了在类定义中声明静态成员之外,还需要在一个源文件中定义它们:
#include "admin.h"
int Admin::n = 0;
Admin* Admin::admin = 0;
您应该从标题中删除n
的定义;如果您包含来自多个源文件的标头,则会出现“多重定义”错误。 = 0
位是可选的,因为默认情况下静态对象是零初始化的。
您还应该从包含警卫的开头删除下划线;这些是保留的,使用它们可能会导致与标准库实现使用的名称冲突。
答案 1 :(得分:2)
这里有两个问题,到目前为止只看到一个错误。
您需要在单个源文件中定义Admin::n
和Admin::admin
。目前,前者是在标题中定义的(一旦多个源文件包含该标题,将导致多重定义错误),而后者根本没有定义。
从admin.h中删除Admin::n
的定义,并将以下内容添加到单个源文件中:
#include "admin.h"
int Admin::n = 0;
Admin* Admin::admin = 0;
答案 2 :(得分:1)
您已声明admin
,但未对其进行定义(但您已定义n
):
int Admin::n = 0;
Admin* Admin::admin; // <-- add this
答案 3 :(得分:1)
您需要在课堂外定义Admin
,因为它是静态的。
Admin* Admin::admin = NULL;