2010-06-22 198 views
2

我試圖訪問指向一個矢量容器中的指針指向的對象(稱爲矢量),但我似乎無法得到它。解引用指向對象的指針

以下是重要的代碼片段:

int main{ 
    Vector<double>* test = new Vector<double>(randvec<double>()); 

    test->save(); 

    cout << Element::vectors[0]; 
return 0; 
} 

Vector是一個模板類,randvec<T>()返回到一個向量的引用,save()

template <class T> 
void Vector<T>::save() 
{ 
    vectors.push_back(this); 
} 

和載體是在元素中定義static std::vector<Element*> vectors;。 h,Vector的基類。

我對這一切都錯了嗎?我試圖通過使用指向主類的指針向量來將派生類的所有元素包含在基類的靜態數據成員中。

我從main()的輸出可能會告訴你發生了什麼 - 我得到指針0x1001000a0。但是,如果我嘗試取消引用該指針,我得到以下錯誤:

error: no match for 'operator<<' in 'std::cout << * Element::vectors. 
std::vector<_Tp, _Alloc>::operator[] [with _Tp = Element*, _Alloc = std::allocator<Element*>](0ul)' 

爲什麼我不能解引用這個指針?

+2

爲什麼動態分配,在所有? (提示:你正在泄漏!) – GManNickG 2010-06-22 06:52:38

+0

我花了三次閱讀你的描述來了解你的名字的不同部分是如何相互糾纏的!這是否真的需要兩階段建設?如果所有對象都要存儲在基類靜態數據成員中,爲什麼不將它們存儲在構造函數中?你爲什麼使用'test'的動態分配?你在泄漏它。自動對象有什麼問題?哦,在C++'file!= class'中。 – sbi 2010-06-22 07:17:44

回答

2

問題不在於取消引用。問題是,「< <」運營商沒有爲元素定義::向量

1

它看起來像你缺少一個operator<<過載,可用於輸出Element。請注意,如果您僅爲Vector<T>定義過載,則它將不起作用,因爲解引用Element::vectors[0]會爲您提供Element類型的對象。

下面是一個(未經測試,抱歉),你可以如何去使派生類(如Vector<T>)覆蓋的Element流插入行爲例如:

添加虛擬成員函數Element

class Element 
{ 
    // other stuff 

    virtual void write_to_stream(std::ostream& stream) const = 0; 
}; 

超載operator<<Element調用這個函數:

​​

然後重寫虛成員函數在派生類控制他們應該怎麼寫:

template<class T> 
class Vector : public Element 
{ 
    // other stuff 
    virtual void write_to_stream(std::ostream& stream) const 
    { 
     // whatever you like goes here 
    } 
}; 
+0

等一下,爲什麼不會解除引用兩次給我一個類型爲Vector的對象? 我已經定義了Vector 的輸出運算符,這就是我正在嘗試使用的運算符。我如何與該版本交互 - 是否必須投射指針? – 2010-06-22 04:42:45

+0

即使它所指向的對象的動態類型爲「* Element :: vectors [0]」,靜態類型爲「Element」(因爲Element :: vectors [0]是一個Element *確實'Vector '(你說的對,我可能不應該說它是一個「元素」類型的對象!)一個方法來獲得重載'載體'中的'operator <<'的能力是委託給一個虛擬功能 - 我會給我的答案添加一個例子。 – 2010-06-22 04:51:18

+0

...其中「它指向」我的意思是「Element :: vectors [0]'指向」...... – 2010-06-22 05:09:16