在课程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 */);
它有效。线程中的答案虽然说明了“但这个价值并没有超出纯理论的范围。不要在实践中这样做。整个事情在描述之外是难看的。”
那么,如果不使用明显不受欢迎的代码,我该怎么办才能解决我的问题?
我希望你明白我想要实现的目标。谢谢!
答案 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(/* ... */);
即使它很糟糕