關於錯誤:非靜態成員引用必須與特定對象相對


 1 #include<string>
 2 #include<iostream>
 3 using namespace std;
 4 class TextBlock
 5 {
 6 public:
 7     TextBlock():text("hello") {}
 8     const char& operator[](size_t position) const{ return text[position]; }
 9     char& operator[](size_t position){ return text[position]; }
10 
11     /* static */ void print(const TextBlock& tb){ cout << tb[0]; }
12 private:
13      string text;
14 };
15 
16 int main()
17 {
18     TextBlock B;
19 
20     TextBlock::print(B);
21     /* B.print(B); */
22     system("pause");
23 }

在VS2013里輸入以上代碼會報錯:非靜態成員引用必須與特定對象相對。

類的成員有兩種:靜態成員和實例成員(包括實例和函數)。實例成員的存儲空間屬於具體的實例,不同實例(對象)的同名成員擁有不同的存儲空間;靜態成員的存儲空間是固定的,與具體的實例(對象)無關,被該類的所有實例共享。

訪問靜態成員可以用ClassName::MemberName,也可以用ClassName.MemberNme,但最好用前者,因為很容易就可以判定成員是靜態成員。

訪問實例成員只能用ClassName.MemberName,不能用ClassName::MemberName.

本例中就是因為用ClassName::MemberName訪問實例變量出錯。

所以解決方法是:將以上類的成員函數print聲明為static。或者函數調用時用ClassName.MemberName的方式。

 

詳情:http://blog.csdn.net/shenqi67/article/details/7533094


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM