1

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

ここに私の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'

誰でもこれで私を助けることができますか? お時間をいただきありがとうございます。

4

4 に答える 4

2

クラス定義で静的メンバーを宣言するだけでなく、厳密に 1 つのソース ファイルでそれらを定義する必要もあります。

#include "admin.h"

int Admin::n = 0;
Admin* Admin::admin = 0;

nヘッダーからの定義を削除する必要があります。複数のソース ファイルのヘッダーを含めると、「複数の定義」エラーが発生します。= 0静的オブジェクトはデフォルトでゼロ初期化されるため、ビットはオプションです。

また、インクルード ガードの先頭からアンダースコアを削除する必要があります。これらは予約されており、それらを使用すると、標準ライブラリの実装で使用される名前と競合する可能性があります。

于 2012-05-17T15:30:23.780 に答える
2

ここには 2 つの問題があり、これまでのところ 1 つのエラーしか表示されていません。

Admin::nAdmin::adminを 1 つのソース ファイルで定義する必要があります。現在、前者はヘッダーで定義されており (複数のソース ファイルにそのヘッダーが含まれていると、複数定義エラーが発生します)、後者はまったく定義されていません。

Admin::nadmin.h からの定義を削除し、以下を 1 つのソース ファイルに追加します。

#include "admin.h"

int Admin::n = 0;
Admin* Admin::admin = 0;
于 2012-05-17T15:31:11.343 に答える
1

を宣言しadminましたが、定義していません (まだ定義していますn):

int Admin::n = 0; 
Admin* Admin::admin;    // <-- add this
于 2012-05-17T15:29:19.880 に答える
1

Admin静的であるため、クラスの外部で定義する必要があります。

Admin* Admin::admin = NULL;
于 2012-05-17T15:29:52.567 に答える