2016-01-18 3 views
0

Мне нужно распечатать кучу объектов из динамического массива с помощью перегруженного оператора < <.Печать динамического массива объектов с помощью перегруженного оператора << в C++

Я перегрузил < < оператор так:

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; 

I получить бессмысленное значение. Имейте в виду, что класс Person является производным от абстрактного класса Object.

+1

Ну, '' имеет '' элемент 'getName()' и есть ли у вас 'operator <<' для 'Object *'? Если нет, он просто напечатает значение указателя - некоторый адрес памяти, например '0x20a1937d'. – BoBTFish

+0

Вы только перегрузили оператор вывода для указателей на 'Person', а не указатель на указатель на' Object'. –

+1

Кроме того, 'new Object * [sizeof (p)]' is * very * suspect, и не будет делать то, что вы думаете, что он делает (я думаю). –

ответ

0

проблема заключается в том, что человек является объектом (по вашему мнению, мы можем философски об этом, но хорошо), и поэтому он имеет доступ ко всем защищенным и общедоступным методам объекта. но объект не является человеком, поэтому он не знает, как использовать методы, определенные лично (например, оператор).

Вы можете напрямую преобразовать человека в объект, как и вы. но не объект для человека, как вы пытались понять.

обычно используется виртуальная функция для создания поведения, которое вы ищете, но, как вы сказали, это сложно, потому что оператор < < - функция друга, а тысячи не могут быть виртуальными. к счастью a nice technique to make << virtual был опубликован некоторое время назад.

+0

Из того, что я понял, вы не можете иметь виртуальную << перегрузку в абстрактном классе. Я попытался это сделать и получил ошибку, заявив, что функция имеет слишком много параметров. – Alex

+0

Да, я был совершенно не прав, [решение] (https://stackoverflow.com/questions/4571611/making-operator-virtual) было опубликовано Loki Astari. – rustypaper

+0

Ид понял, что это будет что-то вроде этого, это слишком плохо. Благодарю. – Alex

Смежные вопросы