[英]C++ Overload Operator = for Pointers does not work/compile properly
我正在尝试使用=的操作符重载实现模板类,到目前为止,它适用于非指针元素。 对于Pointer Elements,它不能完全按我的预期工作,所以我的问题是为什么要播种,以及如何强制c ++按我的意愿去做。
我的模板类:
template <class T>
class IBag {
public:
T _val;
void Set(T val) { _val = val; }
T Get() { return _val; }
IBag& operator=(T val) {
this->Set(val);
return *this;
}
operator T() {
return this->Get();
}
};
使用IBag类的工作方式:
class IBagExample
{
void showExample() {
IBag<QString*> pbag;
pbag = new QString("Blub"); // This works !
}
};
如何不编译:
class IBagExample
{
void showExample() {
IBag<QString*> pbag = new QString("Blub"); // This doesn't compile !
}
};
我得到的编译器错误是:
error: no viable conversion from 'QString *' to 'IBag<QString *>'
IBag<QString*> pbag2 = new QString("Blub");
^ ~~~~~~~~~~~~~~~~~~~
对我来说似乎是一样的,也许我需要告诉编译器一些东西,以了解现在将哪种类型的指针推入pbag中。 但是我不知道该怎么做。
使用像这样的运算符重载
IBag<QString*> pbag; pbag = new QString("Blub"); // This does compile !
似乎很荒谬。
(注意:IBag示例只是我尝试实现的代码的简化。)
非常感谢,
IBag<QString*> pbag = new QString("Blub");
这实际上并没有调用赋值运算符,而是调用了构造函数。 您需要定义如下内容:
template <class T>
class IBag {
public:
IBag( const IBag& rhs )
{
// ....
}
};
要么:
IBag( const T& rhs )
{
// ....
}
分配不是建设。 复制赋值运算符不处理工程(即使=
在分配中看上去非常像=
与拷贝初始化的声明)。 定义合适的构造函数或使用C ++ 11大括号初始化,例如
auto pbag2 = IBag<QString*>{ new QString("Blub") };
免责声明:编译器不动的代码。
代码有问题:
设置器和获取器通常具有设计味,是Java风格的,即使有时有用,
公共数据成员也是具有不变性(例如非空指针)的类的设计气味,
一个带有setter和getter的公共数据成员,这没有意义,
您需要负责复制(三个规则,零规则),并且
您需要就支持constness做出决定,然后进行“正确的事情”(无论如何)。
对于这样的逻辑接口,还可以考虑添加虚拟析构函数。 通过接口启用RTTI。 例如,通过接口删除对象,或动态转换为其他某个接口或实现类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.