使用构造函数中的参数

时间:2014-09-10 22:18:18

标签: c++ constructor copy

我有以下问题: 什么是使用我从构造函数中获取的对象的最佳方法? 我不想使用该副本,因为最初的对象不会发生变化。

Obj obj;

myclass::myclass(Obj& obj)
{
  this->obj = obj; //copy
}

void myclass::doSometh()
{
 obj.add(....); //working with the copy
}

我的解决方案是使用指针:

Obj* obj;

void myclass::myclass(Obj& obj)
{
  this->obj = &obj; 
}

void myclass::doSometh()
{
 obj->add(....); 
}

    Obj* obj;

   myclass::myclass(Obj* obj)
    {
      this->obj = obj; 
    }

    void myclass::doSometh()
    {
     obj->add(....); 
    }

你对我的解决方案有什么看法?还是有更好的解决方案?

2 个答案:

答案 0 :(得分:3)

使用指针成员变量来避免复制没有任何问题。但是你需要确信被指向的对象Obj将比包含指针的MyClass更长。

另外,我建议使用构造函数初始化列表直接初始化指针:

class MyClass {
 private:
  Obj* obj_;
 public:
  MyClass(Obj* obj) : obj_(obj) { }
};

以类似的方式,您也可以使用引用成员变量,但它限制了您可以对该类执行的操作。例如它不可转让:

class MyClass {
 private:
  Obj& obj_;
 public:
  MyClass(Obj& obj) : obj_(obj) { }
};

如果您对指向的对象的生命周期没有信心,请考虑std::weak_ptrstd::shared_ptr

#include <memory>

struct Obj { };

class MyClass {
 private:
  std::weak_ptr<Obj> obj_;
 public:
  MyClass(std::weak_ptr<Obj> obj) : obj_(std::move(obj)) { }
  void doSomething() {
    std::shared_ptr<Obj> obj = obj_.lock();
    if (obj) {
      // do something with obj...
    }   
  }
};

int main() {
  std::shared_ptr<Obj> obj = std::make_shared<Obj>();
  MyClass mc(obj);
}

答案 1 :(得分:1)

只需使用参考:

 Obj& obj;

 myclass::myclass( Obj& obj ) : obj(obj) {}