我是這個網站的新手,並且在編程方面有點新奇。我第一次使用矢量,我想打印它的內容,但我得到的地址,而不是正常的話。我不知道如何以其他方式做到這一點。Cout矢量地址
我的矢量:
vector<Component*> vect;
和我的代碼打印:
void Frame::print() {
for (int i = 0; i < vect.size(); i++)
cout << vect[i] << endl;
}
我是這個網站的新手,並且在編程方面有點新奇。我第一次使用矢量,我想打印它的內容,但我得到的地址,而不是正常的話。我不知道如何以其他方式做到這一點。Cout矢量地址
我的矢量:
vector<Component*> vect;
和我的代碼打印:
void Frame::print() {
for (int i = 0; i < vect.size(); i++)
cout << vect[i] << endl;
}
你在你的向量保存指針。指針的值是一個內存地址,因此您可以在輸出中看到地址。您需要取消引用指針訪問實際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;
}
推薦閱讀:
你還需要研究指針和引用g ENERAL。
新的小事件:在這裏指向讀者:http://stackoverflow.com/questions/4421706/operator-overloading上帝知道他們可能無意中通過Google搜索絆倒了哪些垃圾。 – user4581301
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;
}
誰皺着眉頭,皺眉臉的理由是什麼?緩存未命中與建設時間? –
是的,我知道,只要我點擊提交我搞砸了運營商超載,現在修好了抱歉。 –
它使用原始指針的主要原因是它拒絕RAII,這意味着泄漏是不可避免的,除非你知道新的和刪除之間的每一行代碼都不能展開堆棧,這在實際代碼中很難證明。 –
您的向量存儲您班級的指針,因此您需要在打印前解除引用它。 – florgeng
如果你真的認爲它與矢量有關,請嘗試一下,看看是否有任何變化。 – juanchopanza
我該如何解決這個問題? – hypr2