2014-01-18 3 views
0

У меня есть два класса: Pony и Bear, который наследует от Animal Абстрактный класс.Перегрузка оператора C++ << на указатели массива

Я сделал Animal массив, который содержит один Pony и один Bear:

Animal **arr = new Animal * [2]; 
arr[0] = new Pony("pony name"); 
arr[1] = new Bear("bear name"); 

Аргументом Пони и медведь это имя. Затем я хочу напечатать имя животного, выполнив команду <<. что-то вроде

cout << arr[0]; // Print something like : "I am Pony/Bear Name !" 

Но мой тест перегружать неудачу ... Я пытаюсь сделать что-то вроде

ostream & operator<<(ostream& os, Animal &a); 

Но он не обнаруживает перегрузку, когда я компилирую ...

Как возможно ли перегрузить оператор << в моем массиве указателей?

Полная ошибка после испытания *arr[0]

main.cpp: In function ‘Object** MyUnitTests()’: 
main.cpp:20:22: error: no match for ‘operator<<’ in ‘std::cout << * * obj’ 
main.cpp:20:22: note: candidates are: 
In file included from /usr/include/c++/4.7/iostream:40:0, 
      from Object.hh:14, 
      from main.cpp:11: 

А затем 200 строк ошибок пришедшего с станд :: соиЬ (они disapears если я удалить * на обр [0]).

+0

Какой тип 'обр [0] '? –

+1

Его массив указателей, поэтому 'cout << arr [0];' будет печатать указатель dir, jus try 'cout << * arr [0];' – Netwave

+0

Не принимайте 'a' по неконстантной ссылке. Если вы меняете его, не делайте этого. – chris

ответ

2

arr[0] является указателем, так что вам необходимо выполнить окольные, чтобы иметь возможность передать его в этой operator<< перегрузки:

cout << *arr[0]; 

Вы используете new гораздо больше, чем должно быть. Я дам тебя с животным себя, потому что вам нужно полиморфизма (хотя вы должны использовать смарт-указатели, а), но массив указателей не нужно быть динамически распределяемой:

Animal* arr[2]; 
+0

Я уже пробовал ваш код, и он говорит мне «нет соответствия для оператора» << «в» std :: cout << * * arr' –

+0

@ JérémyPouyet Похоже, что у вас есть две звездочки. –

+0

Это сообщение появляется, когда я делаю 'cout << * arr [0]'. Что бы ваш оператор << прототип? –

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