【问题标题】:Cout vector addressesCout 向量地址
【发布时间】:2017-04-19 20:31:13
【问题描述】:

我是这个网站的新手,对编程有点陌生。我第一次使用矢量,我想打印它的内容,但我得到的是地址而不是普通的单词。除了这个,我不知道该怎么做。

我的矢量:

vector<Component*> vect;

还有我的打印代码:

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

【问题讨论】:

  • 你的向量存储你的类的指针,所以你需要在打印之前取消引用它。
  • 如果您真的认为它与向量有关,请尝试不使用它,看看是否有任何变化。
  • 我该如何取消引用?
  • 好了。这个链接会更好用:en.cppreference.com/w/c/language/… 更正确的 C++ 版本有点难以理解:en.cppreference.com/w/cpp/language/…
  • @hypr2 这取决于Component 的打印方式

标签: c++ vector printing cout


【解决方案1】:

您将指针存储在向量中。指针的值是内存地址,因此您在输出中看到地址。您需要取消引用指针才能访问实际的 Component 对象:

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

为了使其工作,还需要 Componentoperator&lt;&lt; 重载:

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

推荐阅读:

Operator overloading

您还需要学习一般的指针和引用。

【讨论】:

【解决方案2】:

vect 是 Component *(又名 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,这意味着泄漏是不可避免的,除非您知道 new 和 delete 之间的每一行代码都不会展开堆栈,这是非常很难在实际代码中证明。
  • 那么,如果我有 shared_ptr 到域对象的集合,你会皱眉头吗?
  • shared_ptr 需要同步其引用计数,因此应谨慎使用,共享所有权应该是一种罕见的范例。
猜你喜欢
  • 2016-08-25
  • 2021-08-08
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多