您可以在同一对象中具有对成员std :: shared_ptr <variable>的成员引用吗?

罗伯托·罗梅罗(Roberto P. Romero)

我正在创建一个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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

引用或shared_ptr作为关联成员

shared_ptr成员变量的多态分配

指向shared_ptr成员变量的指针

多态和shared_ptr成员

返回右值的 shared_ptr 成员

类lvalue仅具有shared_ptr的成员功能

具有shared_ptr成员的C ++复制构造函数

您可以使用Deleter的成员来使shared_ptr保持活动状态吗?

Bison中的std :: shared_ptr导致成员错误

shared_ptr的静态成员函数make_shared

shared_ptr:在基类的shared_ptr中复制时,引用计数是否增加?

分配给std :: shared_ptr成员变量

将shared_ptr传递给std :: function(成员函数)

用std :: shared_ptr分配类成员

如何将std :: shared_ptr用作类成员?

shared_ptr类的get()成员有什么用途?

访问shared_ptr拥有的类的原子成员

提升shared_ptr矢量成员访问权限

std::shared_ptr 中引用计数的线程安全

可以使用对shared_ptr拥有的对象的引用吗?

std::shared_ptr 中的计数器是原子的吗?

是否可以删除对自身的shared_ptr引用

是否可以进行只读复制(通过引用)shared_ptr?

在shared_ptr中对const int的未定义引用

具有相同原始指针的shared_ptr <Base>和shared_ptr <Derived>实例是否共享引用计数?

在只有const shared_ptr的unordered_set中找到一个shared_ptr吗?

在C ++线程中,我应该按值或引用传递shared_ptr吗?

使用shared_ptr在类及其成员对象之间共享变量是一个好的解决方案吗?

没有对象的对象的shared_ptr的向量无法调用成员函数