gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:51:44 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com