我有以下问题: 什么是使用我从构造函数中获取的对象的最佳方法? 我不想使用该副本,因为最初的对象不会发生变化。
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(....);
}
你对我的解决方案有什么看法?还是有更好的解决方案?
答案 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_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);
}
答案 1 :(得分:1)
只需使用参考:
Obj& obj;
myclass::myclass( Obj& obj ) : obj(obj) {}