使用构造函数中的参数
working with parameter from the constructor
我有以下问题:处理从构造函数中作为参数获得的对象的最佳方法是什么?我不想使用副本,因为初始对象不会更改。
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);
}
只需使用一个引用:
Obj& obj;
myclass::myclass( Obj& obj ) : obj(obj) {}
相关文章:
- C++:使用运算符 = 调用多参数构造函数
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 好奇的混合与可变参数构造函数
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 在可变参数构造函数中初始化常量数组
- C++ 显式多参数构造函数歧义
- 零一参数构造函数
- 可变参数构造函数中的 SFINAE
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 可变参数类模板和可变参数构造函数
- 确保模板参数类型与其可变参数构造函数的类型匹配
- C++默认参数构造函数与内联初始化优先级
- 如何在 c++ 中将包含复制构造函数的类的参数构造函数称为私有?
- 自动存储中没有无参数构造函数的类对象和异常
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 如何在C++中调用无参数构造函数
- 在 c++ 中具有多个参数构造函数的模板类存在问题
- 可变参数构造函数优先于用户提供的移动构造函数,除非默认
- 如何从可变参数构造函数参数构造任何对象?