繁体   English   中英

C ++重载运算符=指针无法正常工作/编译

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM