【问题标题】:Printing a dynamic array of objects using an overloaded operator << in c++使用 C++ 中的重载运算符 << 打印对象的动态数组
【发布时间】:2016-01-18 16:29:17
【问题描述】:

我需要使用重载的

我以这种方式重载了

ostream& operator<<(ostream& os, Person* dt)
{
    return os << dt->getName();//getName returns a char*
}

现在这适用于常规指针,但是一旦我尝试做这样的事情:

    Person *p = new Person("Dany", 4);
    Object** obj=new Object*[sizeof(p)];
    obj[0] = p;
    cout << obj << endl;

我得到一个毫无意义的值。 请记住,Person 类是抽象 Object 类的派生类。

【问题讨论】:

  • Object 有一个getName() 成员吗,你有一个operator&lt;&lt; 用于Object* 吗?如果没有,它只会打印指针值——一些内存地址,比如0x20a1937d
  • 您只重载了指向 Person 的指针的输出运算符,而不是指向 Object 的指针的指针。
  • 另外,new Object*[sizeof(p)]非常可疑的,不会做你认为的(我认为)。
  • 为什么有这些指针,兄弟?
  • 我得到一个毫无意义的值 -- sizeof(p)sizeof(Person *) 相同,或者基本上是指针的大小(通常为 4 或 8)。这是你想做的吗? -- 正则指针 -- 那么你认为不规则指针是什么?

标签: c++ arrays pointers polymorphism operator-overloading


【解决方案1】:

问题是一个人是一个对象(根据你的说法,我们可以对它进行哲学化,但没关系),因此他可以访问对象的所有受保护和公共方法。但是一个对象不是人,所以它不知道如何使用人定义的方法(例如运算符)。

您可以像以前一样直接将人转换为对象。但不是一个人的对象,就像你试图暗示的那样。

通常人们会使用一个虚函数来产生你正在寻找的行为,但正如你所说的那样它很棘手,因为 operatora nice technique to make << virtual 是前段时间发布的。

【讨论】:

  • 据我了解,抽象类中不能有虚拟
  • 是的,我完全错了,the solution 是 Loki Astari 发布的。
  • 我想它会是这样的,那太糟糕了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多