也许这是一个非常简单的问题。但作为一名Java程序员,我仍然在如何在C ++中正确实例化对象。我在我的类中有一个成员变量,我无法在类构造函数的实例化列表中实例化它(因为它取决于一些配置值):
class SomeClass{
private:
ObjectType mObject; //declaration and instantiation??
public:
SomeClass()/*:mObject(valueA,valueB)*/{
//read config here...
//now we got valueA and valueB
mObject = mObject(valueA,valueB);
}
};
上面显示的代码不起作用,因为C ++尝试在mObject()
到达之前调用mObject(valueA, valueB)
。
我有两个问题:
unique_ptr
?我已经搜索过示例,但没有找到一个单独的声明和实例化。 (如here)如果我尝试使用unique_ptr
,我会收到错误:
#include <memory>
class SomeClass{
private:
std::unique_ptr<ObjectType> mObject;
public:
SomeClass(){
//read config here...
//now we got valueA and valueB
mObject = new ObjectType(valueA,valueB);
}
};
错误是:
错误:'operator ='不匹配(操作数类型为 'std :: unique_ptr'和'ObjectType *') mObject = new ObjectType(valueA,valueB)
也许甚至还有一个我没有看到的更好的解决方案。
答案 0 :(得分:3)
您可以像这样设置unique_pointer的值:
mObject.reset(new ObjectType(valueA,valueB));
点击此处的文档:http://www.cplusplus.com/reference/memory/unique_ptr/reset/
答案 1 :(得分:2)
你真的应该尝试在构造函数初始化列表中正确初始化mObject
,即使它很难这样做。您说您需要阅读一些配置才能获得valueA
和valueB
。您可以调用私有静态函数来读取配置,然后将读取的值传递给另一个构造函数。
private:
static std::pair<A, B> readConfig();
SomeClass(std::pair<A, B> p) : mObject(p.first, p.second) {}
public:
SomeClass() : SomeClass(readConfig()) {}
这样做有很多好处,例如:
ObjectType
对象存在,您就会确定SomeClass
对象确实存在;没有机会早点意外破坏它。SomeClass
对象为const
,则可以避免意外修改ObjectType
对象。 std::unique_ptr
成员会有&#34;浅const
&#34;语义。如果你真的想让mObject
成为std::unique_ptr
,那么这里有两种方式:
mObject.reset(new ObjectType(valueA, valueB));
和
mObject = std::make_unique<ObjectType>(valueA, valueB);