2017-04-19 45 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,这意味着泄漏是不可避免的,除非你知道新的和删除之间的每一行代码都不能展开堆栈,这在实际代码中很难证明。 –