C++类间使用重载赋值运算符报错:vec3的operator=为私有成员
为什么会出现“operator =是vec3的私有成员”的编译错误?
先看你给出的代码:
class vec3{ float x; float y; float z; const vec3 & operator= (const vec3 &rvec3) { x = rvec3.x; y = rvec3.y; z = rvec3.z; return *this; } }; class vec2{ vec3 vetex; vec3 normal; const vec2 & operator = (const vec2 &rvec2) { vetex = rvec2.vetex; normal= rvec2.normal; return *this; } };
编译器抛出的错误是:
“operator =”是“vec3”的私有成员
错误原因分析
在C++里,类的所有成员(包括成员函数)默认的访问权限是private(私有)。你在vec3里手动定义的operator=没有加任何访问修饰符,所以它默认是私有成员函数。
而vec2的赋值运算符里,你尝试执行vetex = rvec2.vetex,本质是调用vec3的operator=来完成赋值。但vec2既不是vec3的友元类,也不是vec3的成员函数,完全没有权限访问vec3的私有成员,这就触发了编译器的权限检查错误。
另外多说一句:其实你手动写的这个vec3::operator=和编译器自动生成的默认赋值运算符逻辑完全一样——就是逐个成员变量赋值。如果你不手动定义它,编译器会自动给你生成一个public权限的默认版本,反而不会有这个问题。
解决办法
这里有两个简单的修复方案,选一个就行:
方案1:把vec3的operator=设为public权限
给vec3的operator=加上public修饰符,让外部类可以访问:
class vec3{ float x; float y; float z; public: // 添加公有权限修饰 const vec3 & operator= (const vec3 &rvec3) { x = rvec3.x; y = rvec3.y; z = rvec3.z; return *this; } };
方案2:移除手动定义的vec3::operator=
既然你写的赋值运算符和编译器默认生成的完全一致,直接删掉这个函数就好。编译器会自动生成一个public的默认赋值运算符,vec2就能正常调用了:
class vec3{ float x; float y; float z; // 删掉手动定义的operator=,用默认版本 };
内容的提问来源于stack exchange,提问作者hahahaha
相关产品推荐
相关产品推荐

