提问人:Hrant Nurijanyan 提问时间:3/9/2021 更新时间:3/9/2021 访问量:147
C++ 继承和赋值运算符
C++ inheritance and assignment operator
问:
我正在使用 CRTP 来实现 C++ 功能。
现在我遇到了这样的情况。
template<typename T>
struct A {
char a;
T operator+(const T& other){
T t;
t.a = a + other.a;
return t;
}
};
struct B : A<B>{
};
struct C : B {
C& operator=(const C& other){
a = other.a;
return *this;
}
};
int main() {
C c1,c2,c3;
c3 = c1 + c2;
return 0;
}
此代码不编译说no viable overloaded=
如何在不向 和 添加任何代码的情况下解决问题?struct A
struct B
答:
3赞
RoQuOTriX
3/9/2021
#1
您需要创建 assign 运算符,该运算符作为参考:B
struct C : B {
C& operator=(const C& other){
return *this = static_cast<const B&>(other);
}
C& operator=(const B& other){
a = other.a;
return *this;
}
};
简短解释为什么你需要这个(我希望我没有错):
返回一个引用,就像模板参数一样,而不是 .因此,忽略将有一个不可能的分配。需要明确的是,您不需要第一个赋值运算符来运行您的代码。+ operator
B
B
C
+
C = B
也许这也更清晰更好:
struct C : B {
B& operator=(const B& other){
a = other.a;
return *this;
}
};
现在,赋值运算符将作为输入和输出。B
1赞
Pat. ANDRIA
3/9/2021
#2
您还可以重载 for the 以允许代码返回对象而不是对象(由于类中定义了 而当前这样做)。这样,你就可以得到一个对象,因为该对象可以使用在类中定义来分配。operator+
C class
c1 + c2
C
B
operator+
B
C
c1+c2
operator=
C
例如,将此函数添加到以下内容中:C class
C& operator+(const C& other){
// for example add the two operands' characters
this->a += other.a;
return *this;
}
但要小心你选择背后的想法,因为它可能会编译,但不会做你想做的事情。
重载 或 可能取决于您要对代码执行的操作以及要从操作中获取的类型。+
=
c1+c2
上一个:对数组使用算术
下一个:C++:移动赋值运算符和继承
评论