使用不同的构造函数重新分配对象

时间:2014-05-12 19:29:48

标签: c++ constructor assignment-operator assign default-constructor

在课程MyClass中,我有一名成员Dialog dialog_

MyClass的构造函数被调用之后,我想用dialog_的构造函数中创建的参数调用MyClass的不同构造函数(这就是为什么我不能直接为dialog_调用不同的构造函数,但只是默认构造函数。)

所以我试过

dialog_ = Dialog(/* different constr. w/ parameters passed from MyClass */);

但这不起作用。错误是

Error: no operator "=" matches these operands
operand types are: Dialog = Dialog

所以我用Google搜索了一下,在this SO thread (3rd answer)中找到了我尝试过的代码片段:

dialog_.~Dialog();
new(&dialog_) Dialog(/* different constr. w/ parameters passed from MyClass */);

它有效。线程中的答案虽然说明了“但这个价值并没有超出纯理论的范围。不要在实践中这样做。整个事情在描述之外是难看的。

那么,如果不使用明显不受欢迎的代码,我该怎么办才能解决我的问题?

我希望你明白我想要实现的目标。谢谢!

3 个答案:

答案 0 :(得分:1)

有两种方法可以达到你想要的效果。

在c ++ 98中,您需要将一些初始化推迟到从构造函数调用的init()函数。这有点icky,因为它意味着多个构造变量的冗余构造和赋值。

在c ++ 11中,您可以在初始化列表中调用另外一个构造函数,传递计算值(这些值可以在静态函数中计算以获得清洁度)。

如果您提供构造函数代码的示例,我可以向您展示如何执行此操作。

答案 1 :(得分:1)

您可以将Dialog成员放在std :: unique_ptr中,然后在需要时替换它:

class MyClass {
private:
    std::unique_ptr<Dialog> dialog_;

public:
    MyClass():
        dialog_( /* ... first constructor ... */ ) {}
    void setNewDialog(/* parameters */) {
        dialog_.reset(new Dialog(/* parameters */) );
    }
};

答案 2 :(得分:0)

我没有尝试过任何工作,所以我只是使用

dialog_.~Dialog();
new(&dialog_) Dialog(/* ... */);

即使它很糟糕