使用构造函数中的参数

working with parameter from the constructor

本文关键字:参数 构造函数      更新时间:2023-10-16

我有以下问题:处理从构造函数中作为参数获得的对象的最佳方法是什么?我不想使用副本,因为初始对象不会更改。

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(....); 
    }

你觉得我的解决方案怎么样?还是有更好的解决方案?

使用指针成员变量来避免复制没有错。但是,您需要确信被指向的对象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);
}

只需使用一个引用:

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