C ++重载操作符=指针不能正常工作/编译

时间:2014-09-01 12:47:57

标签: c++ pointers operator-overloading

我正在尝试实现一个带有运算符重载的模板类= 到目前为止它适用于非指针元素。对于指针元素,它并不像我期望的那样完成,所以我的问题是为什么这是母猪,我如何强迫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示例只是我试图实现的代码的简化。)

非常感谢,

2 个答案:

答案 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。例如。通过接口删除对象,或动态转换为其他接口或实现类。