| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Создать массив объектов |
| Автор: Экскалупатор 26.11.2010, 12:48 | ||
| Добрый день. подскажите плиз, а то что то совсем не могу разобраться. у меня есть класс который реализует бинарное дерево. но мне нужно сделать массив ссылок на эти классы(по задаче так). но когда я
при варианте 2 выпадает Error 14 error LNK2019: unresolved external symbol "public: __thiscall Node::~Node(void)" (??1Node@@QAE@XZ) referenced in function "public: void * __thiscall Node::`vector deleting destructor'(unsigned int)" (??_ENode@@QAEPAXI@Z) BinaryTreeMain.obj BinaryTree и Error 15 fatal error LNK1120: 1 unresolved externals J:\2 семестр\BinaryTree\Debug\BinaryTree.exe 1 BinaryTree //вариант 3 выпадает Error 5 error C2337: 'count' : attribute not found j:\2 семестр\binarytree\binarytree\binarytreemain.cpp 109 BinaryTree и штук 50 подряд Error 7 error C2143: syntax error : missing ';' before '}' j:\2 семестр\binarytree\binarytree\binarytreemain.cpp 110 BinaryTree как исправить? или как правильно объявить массив? находил в интернете примеры, должно работать по варианту 2, но не работает. пишу в VS2008 |
| Автор: bsa 26.11.2010, 13:10 |
| Error 14 говорит тебе человеческим языком, что у тебя объявлен деструктор, но не реализован. РЕАЛИЗУЙ ДЕСТРУКТОР. |
| Автор: Экскалупатор 26.11.2010, 14:36 |
| bsa, точно. что то я не заметил. объясни еще такую штуку Node *nodeMass1 = new Node[count]; создается массив объектов типа Node.(вызываются конструкторы и пр.) а как быть если мне нужно массив указателей?(типа вариант 3). |
| Автор: mrbrooks 26.11.2010, 14:48 |
| Node **nodeMass1 = new Node* [count]; Добавлено через 1 минуту и 21 секунду хотя это дичь - надо юзать контейнеры stl и умные указатели (не auto_ptr, а что нибудь из boost) Добавлено через 2 минуты и 26 секунд хотя в VS 2008 - VC++ уже включены умные указатели |
| Автор: Экскалупатор 26.11.2010, 15:30 |
| хм. а в чем разница между Node **nodeMass1 = new Node* [count]; и Node **nodeMass1 = new (Node*)[count]; ??? первый вариант компилится, вариант со скобками не компилится. почему? и еще. объясните почему такой трабл из за деструктора. ведь просто объект класса создавался, а массив нет. |
| Автор: Экскалупатор 26.11.2010, 17:18 |
| WhKitten, я имел ввиду что я могу написать(к примеру в main) Node* n = new Node(); я получаю указатель на объект. но не могу создать массив таких указателей. ругается на деструктор.(точнее сейчас могу, а когда деструктора не было то не мог) Добавлено через 51 секунду т.е. выражение Node **nodeMass1 = new Node* [count]; без деструктора не работало |
| Автор: Леопольд 27.11.2010, 09:35 | ||
Не в деструкторе, значит было дело. Такому коду вообще определение класса не нужно, только объявление.
|
| Автор: WhKitten 27.11.2010, 11:07 | ||||
Я думаю он имел ввиду почему успешно линкуется:
а вроде почти аналогичный код не линкуется:
|
| Автор: bsa 27.11.2010, 11:19 |
| WhKitten, твой код даже не компилируется. В С++ необходимо, чтобы main возвращала тип int, а не void. По идее, второй вариант тоже должен компилироваться, отличий от первого практически нет. Возможно, просто где-то имеется delete... |
| Автор: WhKitten 27.11.2010, 11:28 | ||
| http://msdn.microsoft.com/en-us/library/6wd819wh(v=VS.100).aspx, хоть этого и нет в стандарте. Если заменить void на int суть не изменится. Первый код будет успешно линковаться, а второй нет. Если я не ошибаюсь то это поведение описано в стандарте (пункт 5.3.4.16):
Но вопрос почему так лично для меня остаётся непонятным. |
| Автор: Леопольд 27.11.2010, 12:39 | ||
В g++ всё линкуется, что выглядит логично, ведь деструктор нигде не вызывается...
"Плохой" g++, а-та-та по попе... http://forum.sources.ru/index.php?act=ST&f=74&t=319555&view=findpost&p=2762929 |