c ++将全局对象完全替换为新对象

问题描述 投票:-1回答:1

假设我有一个类型为_ObjT的全局对象obj,并且_ObjT已定义了operator =我正在尝试用完整的新对象替换obj

obj=_ObjT([ constructor arguments])

这里=操作符在obj上被调用,而= operator通过获取新对象来完成它的工作(=操作符什么也做不了,所以我们的对象无法替换,甚至=操作符可能有一些错误...)

我想以obj析构函数被调用并销毁的方式替换并复制新对象来代替全局对象

我尝试手动调用obj.~_ObjT(); obj=_ObjT(),但获得例外,因为再次调用了= operator,这一次删除了原始对象,并尝试将其复制到未分配的内存中

我知道我可以将指针定义为全局值,并调用delete和new。但是只是想知道是否有任何方法可以替换对象(替换本地对象也有同样的问题,但是在本地,我们可以使用新名称而忽略原始值,因此我们不需要替换),我知道应该以= operator和copy构造函数完全替换对象的方式编写好的对象/类]

我问这个问题是因为您使用的是封闭源代码库,或者无论如何您都无法确定操作员是否正常运行

c ++标准还规定= operator必须用新对象完全替换对象吗?

c++ object constructor global-variables operators
1个回答
0
投票

为什么不使用移动?

#include <iostream>
#include <string>

class A
{
    public:
        A() : s("init") { }
        A(const A& a) : s(a.s) { }
        A(A&& a) : s(std::move(a.s)) { }
        A& operator=(const A& a) {
            s = a.s;
            return *this;
        }
        A& operator=(A&& a) {
            s = std::move(a.s);
            return *this;
        }
        void setValue(std::string value) {
            s=value;
        }
        std::string getValue() {
            return s;
        }
    private:
        std::string s;
};


A global;

int main()
{
    {
        A local;
        local.setValue("moved");
        global=std::move(local);
    }
    std::cout << global.getValue() << std::endl;
}
© www.soinside.com 2019 - 2024. All rights reserved.