在C ++中具有多个指向单个对象的指针的正确方法是什么?

时间:2019-12-10 17:43:14

标签: c++ oop pointers smart-pointers

我正在上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中的对象)是不好的做法。上面的代码是不好的做法吗?关于如何使用智能指针的任何建议?

1 个答案:

答案 0 :(得分:0)

  

list_b中的对象将指向list_a中的对象(并且需要访问数据但无需修改)

由于它们是只读指针,只需将它们设置为const就可以了。

作为@ formerlyknownas_463035818的注释,使它们成为智能指针完全是所有权,而不是指向单个对象的指针多少。