2013-04-09 74 views
2

我想用一個公共枚舉和一個該枚舉類型的私有靜態成員變量編寫一個類。我可以初始化靜態變量的值,但是如果我嘗試在類成員函數中訪問它,我的代碼將不會鏈接。這裏有一個簡單的工作示例,將與編譯:類型枚舉的C++靜態成員變量將不會編譯

g++ -o TestClass.o TestClass.cpp 

但後來當我嘗試編譯/中主源文件,鏈接失敗:

g++ -o test TestClass.o testmain.cpp 

我得到的錯誤是:

Undefined symbols for architecture x86_64: 
    "TestClass::_enum", referenced from: 
     TestClass::printEnum()  in TestClass.o 
ld: symbol(s) not found for architecture x86_64 

我使用運行OSX 10.7.5的Mac,使用gcc 4.2.1。

TestClass.h:

#ifndef TEST_CLASS_H 
#define TEST_CLASS_H 

class TestClass 
{ 
public: 
    TestClass() {}; 
    void printEnum(); 

    typedef enum {A, B, C} MyEnum; 

private: 
    static MyEnum _enum; 


}; 

#endif 

TestClass.cpp:

#include "TestClass.h" 

#include <iostream> 
using namespace std; 

TestClass::MyEnum _enum = TestClass::A; 

void TestClass::printEnum() 
{ 
    cout << "Value of enum: " << _enum << endl; 
} 

testmain.cpp:

#include "TestClass.h" 

int main() 
{ 
    TestClass tc; 

    tc.printEnum(); 
} 

回答

3

下面的代碼聲明TestClass::MyEnum類型的文件局部變量_enum。它沒有提供靜態成員變量的定義。

TestClass::MyEnum _enum = TestClass::A; 

要做到這一點,你必須在適當的類範圍具體界定它,就像這樣:

TestClass::MyEnum TestClass::_enum = TestClass::A; 
+0

Ohhhh ....當然。謝謝! – rainbowgoblin 2013-04-09 03:50:55

0
課外

靜態成員沒有定義正確 正確的格式: 類名:: enumtype staticmember = value;

在你的例子中它是 TestClass :: MyEnum _enum = TestClass :: A;