我正在尝试实现一个带有运算符重载的模板类= 到目前为止它适用于非指针元素。对于指针元素,它并不像我期望的那样完成,所以我的问题是为什么这是母猪,我如何强迫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示例只是我试图实现的代码的简化。)
非常感谢,
答案 0 :(得分:1)
IBag<QString*> pbag = new QString("Blub");
这实际上并没有调用赋值运算符,而是调用构造函数。你需要定义类似的东西:
template <class T>
class IBag {
public:
IBag( const IBag& rhs )
{
// ....
}
};
或:
IBag( const T& rhs )
{
// ....
}
答案 1 :(得分:0)
作业不是施工。复制赋值运算符不处理构造(即使赋值中的=
看起来与复制初始化的声明中的=
一样可疑。定义合适的构造函数或使用C ++ 11括号初始化,例如
auto pbag2 = IBag<QString*>{ new QString("Blub") };
免责声明:编码器未触及代码。
代码问题:
setter和getter一般都是设计气味,Java-ism,即使它们有时很有用,
公共数据成员也是具有不变量(如非空指针)的类的设计气味,
带有setter和getter的公共数据成员,没有意义,
你需要负责复制(三条规则,零规则),
你需要做出支持constness的决定,并做正确的事情™(无论它是什么)。
对于逻辑接口,也可以考虑添加虚拟析构函数。这通过接口启用RTTI。例如。通过接口删除对象,或动态转换为其他接口或实现类。