2017-04-19 83 views
0

我是這個網站的新手,並且在編程方面有點新奇。我第一次使用矢量,我想打印它的內容,但我得到的地址,而不是正常的話。我不知道如何以其他方式做到這一點。Cout矢量地址

我的矢量:

vector<Component*> vect; 

和我的代碼打印:

void Frame::print() { 
    for (int i = 0; i < vect.size(); i++) 
     cout << vect[i] << endl; 
} 
+0

您的向量存儲您班級的指針,因此您需要在打印前解除引用它。 – florgeng

+0

如果你真的認爲它與矢量有關,請嘗試一下,看看是否有任何變化。 – juanchopanza

+0

我該如何解決這個問題? – hypr2

回答

2

你在你的向量保存指針。指針的值是一個內存地址,因此您可以在輸出中看到地址。您需要取消引用指針訪問實際Component對象:

void Frame::print() 
{ 
    for (int i = 0; i < vect.size(); i++) 
    { 
     Component *component = vect[i]; 
     cout << *component << endl; // <-- not the extra '*' 
    } 
} 

爲了這個工作,一個operator<<重載Component還要求:

ostream& operator<<(ostream &out, const Component &comp) 
{ 
    // print comp values to out as needed... 
    return out; 
} 

推薦閱讀:

Operator overloading

你還需要研究指針和引用g ENERAL。

+0

新的小事件:在這裏指向讀者:http://stackoverflow.com/questions/4421706/operator-overloading上帝知道他們可能無意中通過Google搜索絆倒了哪些垃圾。 – user4581301

1

vect是Component *(又名組件指針)的向量(又名一組連續存儲器),它是一塊內存塊,其內存塊的地址被編譯器視爲一個Component類對象。通過cout打印這些地址只會給你一大堆毫無意義的數字。

我懷疑你想要做的可能不是存儲組件指針的向量,而只是存儲組件向量。現在用C++來存儲原始指針,除非你確切地知道你在做什麼。如果你真的想要指針,你應該使用std :: unique_ptr和std :: make_unique的向量。

一旦開始嘗試打印組件的地址而不是地址,您很可能會看到組件沒有< <運算符。你需要寫一個。類似於

std::ostream& operator<<(std::ostream &stream, const Component&component) 
{ 
    stream << component.string_member; 
    return stream; 
} 
+0

誰皺着眉頭,皺眉臉的理由是什麼?緩存未命中與建設時間? –

+0

是的,我知道,只要我點擊提交我搞砸了運營商超載,現在修好了抱歉。 –

+0

它使用原始指針的主要原因是它拒絕RAII,這意味着泄漏是不可避免的,除非你知道新的和刪除之間的每一行代碼都不能展開堆棧,這在實際代碼中很難證明。 –