C ++ unique_ptr单独声明和实例化

时间:2015-12-17 07:53:25

标签: c++ instantiation unique-ptr

也许这是一个非常简单的问题。但作为一名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)。 我有两个问题:

  1. 在这种情况下我需要使用指针吗?
  2. 如何使用unique_ptr?我已经搜索过示例,但没有找到一个单独的声明和实例化。 (如here
  3. 如果我尝试使用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)

    也许甚至还有一个我没有看到的更好的解决方案。

2 个答案:

答案 0 :(得分:3)

您可以像这样设置unique_pointer的值:

mObject.reset(new ObjectType(valueA,valueB));

点击此处的文档:http://www.cplusplus.com/reference/memory/unique_ptr/reset/

答案 1 :(得分:2)

你真的应该尝试在构造函数初始化列表中正确初始化mObject,即使它很难这样做。您说您需要阅读一些配置才能获得valueAvalueB。您可以调用私有静态函数来读取配置,然后将读取的值传递给另一个构造函数。

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);