![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: нет Всего: 24 |
Добрый день. подскажите плиз, а то что то совсем не могу разобраться.
у меня есть класс который реализует бинарное дерево. но мне нужно сделать массив ссылок на эти классы(по задаче так). но когда я
при варианте 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 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Error 14 говорит тебе человеческим языком, что у тебя объявлен деструктор, но не реализован. РЕАЛИЗУЙ ДЕСТРУКТОР.
|
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: нет Всего: 24 |
bsa, точно. что то я не заметил. объясни еще такую штуку
Node *nodeMass1 = new Node[count]; создается массив объектов типа Node.(вызываются конструкторы и пр.) а как быть если мне нужно массив указателей?(типа вариант 3). |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 19 Всего: 306 |
Node **nodeMass1 = new Node* [count];
Добавлено через 1 минуту и 21 секунду хотя это дичь - надо юзать контейнеры stl и умные указатели (не auto_ptr, а что нибудь из boost) Добавлено через 2 минуты и 26 секунд хотя в VS 2008 - VC++ уже включены умные указатели |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: нет Всего: 24 |
хм. а в чем разница между
Node **nodeMass1 = new Node* [count]; и Node **nodeMass1 = new (Node*)[count]; ??? первый вариант компилится, вариант со скобками не компилится. почему? и еще. объясните почему такой трабл из за деструктора. ведь просто объект класса создавался, а массив нет. |
|||
|
||||
WhKitten |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 24.11.2010 Репутация: нет Всего: нет |
(Node*) это приведение в стиле C к типу Node*
Node *nodeMass[5] массив из 5 указателей на Node. Конструктор не вызывается, память не выделяется, деструктор не вызывается.
Вызывается конструктор count раз. Видимо разумно предполагается, что потом будет вызываться и деструктор, а его нет. По delete[] nodeMass1 должен быть вызван деструктор, причём опять count раз. |
||||||
|
|||||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: нет Всего: 24 |
WhKitten, я имел ввиду что я могу написать(к примеру в main) Node* n = new Node();
я получаю указатель на объект. но не могу создать массив таких указателей. ругается на деструктор.(точнее сейчас могу, а когда деструктора не было то не мог) Добавлено через 51 секунду т.е. выражение Node **nodeMass1 = new Node* [count]; без деструктора не работало |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Не в деструкторе, значит было дело. Такому коду вообще определение класса не нужно, только объявление.
Это сообщение отредактировал(а) Леопольд - 27.11.2010, 09:37 -------------------- вопросов больше чем ответов |
|||
|
||||
WhKitten |
|
||||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 24.11.2010 Репутация: нет Всего: нет |
Я думаю он имел ввиду почему успешно линкуется:
а вроде почти аналогичный код не линкуется:
|
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
WhKitten, твой код даже не компилируется. В С++ необходимо, чтобы main возвращала тип int, а не void. По идее, второй вариант тоже должен компилироваться, отличий от первого практически нет. Возможно, просто где-то имеется delete...
|
|||
|
||||
WhKitten |
|
|||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 24.11.2010 Репутация: нет Всего: нет |
В VS2010 void принимается, хоть этого и нет в стандарте. Если заменить void на int суть не изменится. Первый код будет успешно линковаться, а второй нет.
![]() Если я не ошибаюсь то это поведение описано в стандарте (пункт 5.3.4.16):
Но вопрос почему так лично для меня остаётся непонятным. ![]() ![]() Это сообщение отредактировал(а) WhKitten - 27.11.2010, 12:36 |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
В g++ всё линкуется, что выглядит логично, ведь деструктор нигде не вызывается...
"Плохой" g++, а-та-та по попе... http://forum.sources.ru/index.php?act=ST&a...t&p=2762929 Это сообщение отредактировал(а) Леопольд - 27.11.2010, 16:48 -------------------- вопросов больше чем ответов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |