※ 引述《wtchen (没有存在感的人)》之铭言:
: ================ 我是问题分隔线-1 ==================
: 问题1 :
: 关于class C :
: 如果我不希望在C物件中重新建立一个B物件,而是能够连接到一个已经存在的B 物件
: 那我是不是要把B C_B ; 这行改成 B &C_B ?
: 然后建构子的话改成C(int c0, double c1, B &c2) : C_i(c0), C_d(c1), C_B(c2) ?
语法上是这样没错
但这么做非常危险
因为你很可能会指向一个被解构的物件
另一方面在 C 解构时,它不知道是否需要同时解构 B
这样会造成 memory leak 或 double free
如果多个 C 物件会共享一个 B
那么你应该使用 shared_ptr<B>
: ================ 我是问题分隔线-1 ==================
: 然后如果我创造一个物件D,其元件为class C的指标vector
: (因为我不希望重新在D里面建立物件C,只希望连到已有的物件C)
: 依照我测试的结果好像是这样:
: class D {
: public :
: void add_course(const C &c){ // 增加vector_c的元素
: vector_C.push_back(&c);
: }
: const C *getC(size_t i) { // 读取第i个 vector_C元素
: return vector_C[i];
: }
: private :
: vector <const C*> vector_C;
: };
同样的,语法是这样没错,但可能会指向被解构的物件
也很容易造成 memory leak 或 double free
: ================ 我是问题分隔线-2&3 ==================
: 问题2 :
: 关于class D :
: const C *getC(int i) 跟 const C &getC(int i) 到底有啥不同?
: 问题3 :
: 当我在解构 class D的时候会把 vector_C指向的 物件C们都解构掉吗?
不会
这种情况下的 ownership 控制非常重要
你应该用 vector< shared_ptr<C> >,或是 boost::ptr_vector<C>
: ================ 我是问题分隔线-2&3 ==================
: 如果这时再建一个class E :
: class E {
: public :
: E(D &d) : E_D(d){} // 建构子
: int compute(size_t i, size_t j) const{
: return E_D.getC(i)->getXX() + E_D.getC(j)->getXX();
: }
: private :
: const D &E_D;
: };
: ================ 我是问题分隔线-4 ==================
: 问题4 :
: 关于int compute(size_t i, size_t j) const这边我怎么try都没办法
: 要怎么在E里面使用其物件E_D里面的物件C里面的function?
: 在都是public的情况下
getC() 应该宣告为 const C *getC(size_t i) const;
: ================ 我是问题分隔线-4 ==================
: 希望各位先进能够给予指教。
: 感谢。