簡體   English   中英

在 C++ 中擁有多個指向單個對象的指針的正確方法是什么?

[英]What is the proper way to have multiple pointers to single object in C++?

我正在構建 2 個類。 A 類包含對象 obj_A 的私有列表,比如 list_a。 B 類包含對象 obj_B 的列表,比如 list_b。 list_b 中的對象將指向 list_a 中的對象(需要訪問數據但不能修改)。 該類的基本版本如下所示:

#include <iostream>
#include <vector>

//obj_A contains data
class obj_A {
  public:
    obj_A(int x) {x_ = x;};     
    void print() const {
      std::cout << "x_ = " << x_ << std::endl;
    };
  private:
    int x_;
};

//A manages list of obj_A
class A {
  public:
    void addObj(obj_A obj_a) {
      list_a_.push_back(obj_a);
    };

    obj_A* getObjPtr(int i) {
      return &list_a_[i];
    }

  private:
    std::vector<obj_A> list_a_;
};

//obj_B contains data related to obj_A
class obj_B {
  public:
    obj_B(obj_A * obj_a) : obj_a_(obj_a) {};
    void printA() const {
      obj_a_->print();
    };
  private:         
    const obj_A * obj_a_;
};

//B manages list of obj_B
class B {
  public:
    void addObj(obj_B obj_b) {
      list_b_.push_back(obj_b);
    };

    void print() const {
      for(auto b : list_b_) {
        b.printA();
      }
    };
  private:
    std::vector<obj_B> list_b_;
};

//simple example
int main( int argc, char** argv ) {
  //make A
  obj_A a_obj_1(1);
  obj_A a_obj_2(2);

  A a;
  a.addObj(a_obj_1);
  a.addObj(a_obj_2);

  //make B
  obj_B b_obj_1( a.getObjPtr(0) );
  obj_B b_obj_2( a.getObjPtr(0) );
  obj_B b_obj_3( a.getObjPtr(1) );

  B b;
  b.addObj(b_obj_1);
  b.addObj(b_obj_2);
  b.addObj(b_obj_3);

  //print stuff
  b.print();

  return 0;
}

據我所知,除非我使用智能指針,否則創建指向單個對象(list_a 中的對象)的多個指針(list_b 中的對象)是不好的做法。 上面的代碼是不好的做法嗎? 關於如何使用智能指針的任何建議?

list_b 中的對象會指向 list_a 中的對象(需要訪問數據但不能修改)

由於它們是只讀指針,只需像您已經擁有的那樣將它們設置為const即可。

正如@previousknownas_463035818 評論的那樣,使它們成為智能指針完全與所有權有關,而不是指向單個對象的指針數量。

暫無
暫無

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

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