6

こんにちは、C ++の初心者です。静的メソッドを持つクラスがあり、それらにアクセスできず、エラーがスローされます

    1>------ Build started: Project: CPractice, Configuration: Debug Win32 ------
1>  Source.cpp
1>Source.obj : error LNK2001: unresolved external symbol "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > CPractice::name" (?name@CPractice@@0V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A)
1>c:\users\innersoft\documents\visual studio 2012\Projects\CPractice\Debug\CPractice.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

ここに私のコードがあります

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <string>

using namespace std;

class CPractice
{
    public:
        static void setName(string s)
        {
            name = s;
        }
        static string getName()
        {
            return name;
        }
    private:
        static string name;
};


int main()
{


    CPractice::setName("Name");
    cout << "\n" << CPractice::getName();
    system("PAUSE");
    return EXIT_SUCCESS;
}
4

4 に答える 4

18
static string name;

そのままではstatic、この行は宣言 nameするだけです。これも定義する必要があります。これをクラス定義の下に配置するだけです。

string CPractice::name;

クラスを対応するヘッダーと実装ファイルに移動することになった場合は、この定義を実装ファイルに配置してください。単一の翻訳単位でのみ定義する必要があります。

于 2013-03-12T19:20:09.347 に答える
1

name は静的データ メンバーであるため、初期化する必要があります :)。デフォルトのインスタンス関連のコンストラクターに頼らないでください。

これをクラス定義の後に追加します(はい、あなたのメンバーはプライベートメンバーであるため混乱を招くことは知っていますが、これは初期化にすぎません):

string CPractice::name;
于 2013-03-12T19:24:31.967 に答える
1

gccでコンパイルする必要があるときに、 でコンパイルしようとしていると思いますg++g++ と gcc の違いを参照してください。詳細については。

string CPractice::name;クラス定義の下にも追加する必要があります。

于 2013-03-12T19:22:06.607 に答える
1

クラスでのみ宣言nameします。静的変数は、クラスの外で次のように定義する必要があります。

string CPractice::name ="hello" ;
于 2013-03-12T19:22:10.920 に答える