我有以下问题: 处理从构造函数作为参数获取的对象的最佳方法是什么? 我不想使用拷贝,因为初始对象不会改变。
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_ptr
或 std::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/