![](/img/trans.png)
[英]C++: What is the proper way to remove elements from a vector of object pointers without deleting the object it points to?
[英]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.