2013-04-12 21 views
0

爲什麼下面的用法給我一個錯誤:未定義引用「Environment :: self」 所以下面是我的測試用例和類是正好在它下面,標題和CPP: 測試:C++ int包裝類有不同的值比較不起作用

Environment bla; 
bla=Environment::CTE; 
if(bla==1){ 
    printf("CTE!"); 
}else if(bla==Environment::PPE){ 
    printf("NO: its ppe"); 
} 

頁眉:

class Environment{ 
public: 
enum{CTE, PTE, PPE, LOCALHOST}; 
static int self; 
bool operator==(const int& rhs)const; 
Environment& operator=(const int &rhs); 
}; 

而CPP:

#include "Environment.h" 

bool Environment::operator==(const int& rhs)const{ 
if (this->self ==rhs) 
    return true; 
return false; 
} 

Environment& Environment::operator=(const int &rhs) { 
    if (this->self != rhs) { 
    this->self=rhs; 
} 

    return *this; 
} 

回答

1

您聲明selfstatic。這意味着:

  1. 您必須在某處定義它。也就是說,把int Environment::self;放到一個.cpp文件中。此填充修復了「Unresolver reference」鏈接器錯誤。

  2. 正在static意味着整個班級只有一個self實例。因此,通過this->self訪問它不是必需的,而且實際上令人困惑。這似乎意味着Environment類的每個實例都有自己的副本,但實際上並非如此。

如果你想的Enviornment每個實例有它自己的self值,簡單地丟棄從self的聲明static關鍵字。

+0

是不是由行設置:bla = Environment :: CTE; – Anna

+0

@Anna在類中聲明的'static'成員只有*聲明*存在,而不是*定義。*您仍然需要爲某個地方的變量(在.cpp文件中)定義(分配空間)。 C++不是Python,變量不會通過分配名稱而「彈入」。 – Angew