gpt4 book ai didi

c++ - 您可以在同一对象中拥有对成员 std::shared_ptr 的成员引用吗?

转载 作者:行者123 更新时间:2023-11-30 04:49:24 25 4
gpt4 key购买 nike

我正在创建一个 C++ 类 A,它有一个对象成员变量 B,默认情况下不应将其实例化。我不喜欢使用指针语法,因为 B 类非常依赖 operator() 并且代码变得如此困惑。

为了将引用用作成员变量,但每次我想通过引用访问对象时,我都会遇到段错误。

是否有可能使这项工作成功?

class SomeClass {
public:
SomeClass(int argToInitSomeOtherClass);
void someOtherFunction();

private:
std::shared_ptr < SomeOtherClass > MemberObject;
SomeOtherClass & MemberObjectReference = * MemberObject;
};

class SomeOtherClass {
public:
SomeOtherClass(int initArg) {
this - > member = initArg;
};
void whatever() {}; // I do nothing

private:
int member;
};

SomeClass::SomeClass(int argToInitSomeOtherClass) {
MemberObject = std::make_shared < SomeOtherClass > (argToInitSomeOtherClass)
}

void SomeClass::someOtherFunction() {
MemberObjectReference.whatever(); // Segmentation fault
}

如果有一种方法可以保存成员对象并以非静态方式在没有默认值的情况下实例化它也可以解决我的问题,但我认为这是不可能的。

最佳答案

我不确定 OP 实际打算实现什么。

我会寻找另一种设计,因为 OP 的方法在我看来很脆弱,并且很容易因源代码的最小更改而中断。

然而,OP 的实际错误是恕我直言,构造函数中的错误初始化:

引用必须在共享指针初始化之后获取。此外,我将共享指针设置为 const 以强调一旦重新分配共享指针,它就会中断(引用将变得悬空)。 (const 使这种尝试成为编译器错误。)

获取指针对象的引用(无论是由原始指针还是智能指针指向)都应该小心地完成,并牢记指针对象的生命周期。 C++ 中的引用本身不会执行此操作——这是作者的责任。

OP固定示例:

#include <memory>
#include <iostream>

struct SomeOtherClass {
int member;
explicit SomeOtherClass(int initArg = 0): member(initArg) { }
void whatever() { std::cout << "SomeOtherClass::member: " << member << '\n'; }
};

class SomeClass {
public:
explicit SomeClass(int argForOther);
SomeClass(const SomeClass&) = delete;
SomeClass& operator=(const SomeClass&) = delete;
void someOtherFunction();
private:
const std::shared_ptr<SomeOtherClass> MemberObject;
SomeOtherClass &MemberObjectReference;
};

SomeClass::SomeClass(int argForOther):
MemberObject(std::make_shared<SomeOtherClass>(argForOther)),
MemberObjectReference(*MemberObject)
{ }

void SomeClass::someOtherFunction()
{
MemberObjectReference.whatever(); // Segmentation fault fixed
}

int main()
{
SomeClass someClass(123);
someClass.someOtherFunction();
return 0;
}

输出:

SomeOtherClass::member: 123

Live Demo on coliru

关于c++ - 您可以在同一对象中拥有对成员 std::shared_ptr<variable> 的成员引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55414546/

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