我是这个网站的新手,并且在编程方面有点新奇。我第一次使用矢量,我想打印它的内容,但我得到的地址,而不是正常的话。我不知道如何以其他方式做到这一点。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