我正在上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中的对象)是不好的做法。上面的代码是不好的做法吗?关于如何使用智能指针的任何建议?
答案 0 :(得分:0)
list_b中的对象将指向list_a中的对象(并且需要访问数据但无需修改)
由于它们是只读指针,只需将它们设置为const
就可以了。
作为@ formerlyknownas_463035818的注释,使它们成为智能指针完全是所有权,而不是指向单个对象的指针多少。