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
时间: 2024-10-25 05:15:25