永发信息网

非静态成员函数非法调用如何解决

答案:2  悬赏:70  手机版
解决时间 2021-03-18 07:51
  • 提问者网友:愿为果
  • 2021-03-18 00:44
非静态成员函数非法调用如何解决
最佳答案
  • 五星知识达人网友:煞尾
  • 2021-03-18 00:54
不太清楚你想干什么。。不过你的程序里错误很多。
error C2352: “std::vector<_Ty>::size”: 非静态成员函数的非法调用
这个错误是 i=vector::size();要改成 i=v.size();

v的初始化应该用push_back。并在while语句里提供退出条件。

if ((it+1) == v.end())
break;
这个应该放在前面判断
全部回答
  • 1楼网友:你可爱的野爹
  • 2021-03-18 02:29
代码一: [cpp] view plaincopyprint? class point{ public: void output() { } static void init() { } }; int main() { point pt; pt.init(); pt.output(); } class point{ public: void output() { } static void init() { } }; int main() { point pt; pt.init(); pt.output(); }代码二: [cpp] view plaincopyprint? class point{ public: void output() { } static void init() { } }; int main() { point::init(); point::output();//报错 } class point{ public: void output() { } static void init() { } }; int main() { point::init(); point::output();//报错 } 两个代码编译运行,代码一成功,代码二报错。错误信息: test1.cpp(16) : errorc2352: “point::output”: 非静态成员函数的非法调用。 错误信息提示:非法调用非静态成员函数point::output。但为什么init函数的调用没有错呢?该函数是一个静态函数。静态成员函数和静态成员变量属于类本身,在类加载的时候,即为他们分配了空间,所以可以通过类名::函数名或类名:变量名来访问。而非静态成员函数和非静态成员变量属于对象的方法和数据,也就是应该首先产生类的对象,然后通过类的对象去引用。 代码三: [cpp] view plaincopyprint? #include using namespace std; class point{ public: void output() { } static void init() { x = 0; y = 0; } private: int x,y; }; int main() { point::init(); //point::output();//报错 } #include using namespace std; class point{ public: void output() { } static void init() { x = 0; y = 0; } private: int x,y; }; int main() { point::init(); //point::output();//报错 }运行报错: 1>e:\学习\程序练习\test1\test1\test1.cpp(11): error c2597: 对非静态成员“point::x”的非法引用 1>e:\学习\程序练习\test1\test1\test1.cpp(12): error c2597: 对非静态成员“point::y”的非法引用 在静态成员函数中非法引用point对象的x和y数据成员。因为init是静态函数,不属于某个具体的对象,也就是说在还没有产生point类的任一个具体的对象时,该函数就已经存在于程序的代码区了。但是,point类的数据成员x和y还没有分配内存空间,这样,在init函数中对他们进行赋值操作会失败。也就是说,在静态成员函数中不能调用非静态成员,包括非静态成员函数和非静态成员变量。静态成员函数只能访问静态成员变量。 如果把上述代码中对x、y的赋值操作放在非静态函数中,就会成功。 但是,在非静态成员函数中可以调用静态成员函数。 在上述代码中,将point类的数据成员x和y的定义之前加上static限定符,使他们成为静态成员变量。 staticintx,y; 编译运行,程序报错。错误信息: 1>test1.obj: error lnk2001: 无法解析的外部符号"private:static int point::y" (?y@point@@0ha) 1>test1.obj: error lnk2001: 无法解析的外部符号"private:static int point::x" (?x@point@@0ha) 这是链接时发生的错误。出错的原因是对于静态成员变量,必须对他们进行初始化,并且应在类的定义之外进行此操作。我们在point类的定义之外,加上如下两条初始化语句: [cpp] view plaincopyprint? intpoint::x = 0; intpoint::y = 0; intpoint::x = 0; intpoint::y = 0; 则运行成功。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯