簡體   English   中英

你能有一個對成員 std::shared_ptr 的成員引用嗎?<variable> 在同一個對象中?

[英]Can you have a member reference to a member std::shared_ptr<variable> within the same object?

我正在創建一個 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

在coliru上進行現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM