c++ - 使用构造函数中的参数

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

你觉得我的解决方案怎么样?或者有更好的解决方案吗?

最佳答案

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

关于c++ - 使用构造函数中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25775993/

相关文章:

.net - 从 IUnknown 实现接口(interface)类时出现错误 c2259

c++ - 带有 c++ per_process_gpu_memory_fraction 的 Tensorflow 不工作

javascript - 构造函数没有保存 querySelector(x).value

python - 将多个文件复制到新文件夹中

windows - 如何让Qt Creator的jom.exe复制带空格的路径中的文件?

c++ - 在 std 算法中使用 std::move_iterator 并以 lambda 作为 pred 是否安全

c++ - OpenCV (C++) 中 PNG 文件的 GrabCut 读取掩码

python - @classmethod 用于构造函数重载

java - java中调用父构造函数

excel - VBA 将数据从一个工作簿复制到另一个工作簿