将对象引用赋值给类实例变量报no viable overloaded '='错误如何解决
问题根因
你遇到的报错本质是C++引用类型的语法规则和Java完全不同导致的:
- C++的引用类型(带
&修饰的变量)一旦绑定到某个对象后就不可重新绑定到其他对象,必须在类构造函数的初始化列表阶段完成绑定,不能放在构造函数的函数体内做赋值操作。 - 你代码里尝试给已经进入构造函数体、未初始化的引用变量赋值,编译器找不到引用类型对应的赋值运算符重载,就会抛出
no viable overloaded '='错误。
同时你的ofApp类里的mesh引用成员也存在同样的初始化错误,还会额外出现临时对象销毁后引用悬空的问题。
修复步骤
1. 修复MyMesh类的构造函数
修改mesh.cpp中的MyMesh构造函数,用初始化列表完成context引用的绑定:
// 删掉构造函数体内的context赋值语句,改用初始化列表 MyMesh::MyMesh(ofApp& acontext) : context(acontext) { // 其他初始化逻辑放在这里即可 }
2. 修复ofApp类的mesh成员问题
你当前ofApp里的mesh是引用类型,直接赋值临时MyMesh对象会导致引用悬空,合理的修改方案是把引用改为普通成员对象:
首先修改ofApp.h中的成员声明:
// 把原来的MyMesh &mesh;改为普通对象 MyMesh mesh;
然后修改ofApp.cpp中的构造函数,用初始化列表初始化mesh:
ofApp::ofApp() : mesh(*this) { // 其他初始化逻辑放在这里即可 }
补充说明
- 你当前两个类互相依赖的前置声明写法是正确的,只要保证cpp文件中引入了对应类的完整头文件,不会出现类型不完整的编译错误。
- 如果有特殊要求必须让ofApp中的mesh是引用类型,可以改用指针实现:将成员声明改为
MyMesh* mesh;,构造函数中执行mesh = new MyMesh(*this);,并在ofApp的析构函数中执行delete mesh;避免内存泄漏,这种方案不如普通成员对象安全,非必要不推荐。
内容的提问来源于stack exchange,提问作者zychin
相关产品推荐
相关产品推荐

