| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Класс List |
| Автор: шарлотта 15.5.2017, 01:52 | ||||
Здравствуйте! Требуется создать шаблонный класс List для двусвязного списка.
При создании объекта List<int> list; выдает ошибки 1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall List<int>::List<int>(void)" (??0?$List@H@@QAE@XZ) в функции _main 1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall List<int>::Clear(void)" (?Clear@?$List@H@@QAEXXZ) в функции "public: __thiscall List<int>::~List<int>(void)" С чем это связано и как исправить? Буду очень благодарна за помощь! |
| Автор: шарлотта 15.5.2017, 17:04 |
| То есть нужно подключить к main cpp-файл? |
| Автор: volatile 15.5.2017, 17:36 | ||
| Я не знаю что у вас в .cpp, но включая экстрасенсорные способности, догадываюсь что второй ваш файл это cpp. рекомендую перенести из него все в .h, и его уже подключать в main (#include имя.h) все. Добавлено @ 17:38 Второй вариант, оставить все в .cpp, и явно инстанцировать для использумых типов, в данном случае int
|
| Автор: шарлотта 15.5.2017, 17:58 |
| Спасибо! |
| Автор: шарлотта 19.5.2017, 21:45 | ||||
| Здравствуйте! Прошу помочь с классом Итератор для списка.
В main пишу List<int> list1(4, 5); List<int>::Iterator iter = list1.Begin(); list1.PrintfBeginEnd(); Ошибка возникает, если я верно поняла, из-за того, что в функции Begin() меняется begin в вызвавшем объекте. Мне кажется, ошибка возникает при возврате значения из этой функции и скорее всего из-за конструктора копирования для элемента Node(const Node &node). Большое спасибо за помощь! |
| Автор: xvr 20.5.2017, 15:32 | ||
PS. Кстати, он этого не делает, хотя и должен. |
| Автор: шарлотта 20.5.2017, 17:13 |
| Спасибо! |
| Автор: шарлотта 24.5.2017, 19:55 | ||||
Добрый вечер! Требуется в классе List реализовать метод Erase, удаляющий элемент в позиции итератора.
Выдает ошибки: error C2227: выражение слева от "->next" должно указывать на тип класса, структуры или объединения либо на универсальный тип error C3688: недопустимый литеральный суффикс "next"; не удалось найти литеральный оператор или шаблон литерального оператора "operator ""next". Буду очень благодарна, если подскажете правильную реализацию. |
| Автор: volatile 25.5.2017, 13:31 | ||||||
| Вы не привели main.cpp, приходится телепатировать Скорей всего файлы .h вы включли не в том порядке. Сделайте так, тогда не будет зависеть от порядка включния:
Добавлено @ 13:41 и еще, случайно заметил
имхо, бред какой-то. зачем при создании Node создавать еще следующий элемент и предыдущий? |
| Автор: шарлотта 25.5.2017, 19:02 | ||||||
Вы правы, написала бред. Спасибо!
Поправила порядок включения, все равно возникают те же ошибки... |
| Автор: volatile 25.5.2017, 21:13 | ||
а это что? Добавлено через 2 минуты и 46 секунд и сообщайте номера строк на которых компилятор выдает ошибку. |
| Автор: шарлотта 25.5.2017, 21:29 |
| Извините! Спасибо большое! Самая лучшая ошибка... |
| Автор: vol4ek 25.5.2017, 22:02 | ||||
копипаст |
| Автор: шарлотта 26.5.2017, 22:17 | ||||||||
| Добрый вечер! Требуется написать 3 алгоритма. Написала алгоритм ForEach
вызываю в main
Не изменяет значения контейнера. Подскажите, пожалуйста, как поправить! Алгоритм CopyIf
Так вызываю
И алгоритм сортировки вообще не понимаю, как реализовать. Буду очень благодарна за помощь! |
| Автор: xvr 26.5.2017, 22:55 | ||||||
И не должен. Где какое нибудь присваивание?
Копируется как обычные указатели.
|
| Автор: шарлотта 26.5.2017, 23:04 | ||||||||
Написала так:
Не могу понять, в чем ошибки... |
| Автор: шарлотта 27.5.2017, 16:19 | ||||||||
| С первым разобралась, большое спасибо! Во алгоритме CopyIf возникает ошибка
указывает на
Контейнер dest_beg пустой, и там не может быть выполнено ++. Но как исправить данную ошибку? |
| Автор: volatile 28.5.2017, 10:08 | ||
никак не надо исправлять. (можно исключение кинуть) операция ++ над итератором указывающим на "end()" не имеет смысла, и должна вызывать исключение. |
| Автор: шарлотта 28.5.2017, 11:31 | ||||||||
Но как тогда сделать копирование?
Если вызываю так, тоже выдает ошибку.... И мне кажется, так я совсем бред написала. Но как сделать правильно? Не совсем понимаю, каким должен быть контейнер, куда копирую... Вызвала так
Но, мне кажется, это бред полнейший... А реализация сортировки еще более странная. Но не представляю, как сделать нормально...
|
| Автор: volatile 28.5.2017, 12:09 |
| шарлотта, у меня к вам другой вопрос. А как именно по-вашему должен работать ваш CopyIf()? Не секрет, что весь этот ваш контейнер - это попытка собсственными силами написать часть STL А std::copy из STL, именно так и работает. т.е. он будет выкидывать исключение, если принимающий контейнер имеет меньший размер чем источник копирования. посмотрите здесь я привел пример и комментарии: http://codepad.org/r3XR7b81 Видимо ваш алгоритм должен работать каким-то другим неведомым способом? Ну дык приведите ТЗ, опишите словами что он должен делать, например для 3 случаев: если src.size() == dst.size() если src.size() < dst.size() если src.size() > dst.size() // куда добавлять в конец, в начало, в середину, затирать ли имеющиеся? А вот когда вы опишите словами, поведение вашего CopyIf(), вы и сможете сами составить программу. Добавлено через 2 минуты хотя я бы не советовал придумывать неведомо что, а оставил именно так как и в СТЛ |
| Автор: шарлотта 28.5.2017, 12:34 |
| Поняла, согласна с Вами, спасибо большое! |
| Автор: шарлотта 28.5.2017, 13:27 | ||
Попробовала сделать сортировку так, но не сортирует.
|
| Автор: volatile 28.5.2017, 14:34 | ||
Ну пузырёк я проще как-нибудь бы сделал, зачем накручивать. вся его прелесть в простоте.
проверяйте Добавлено через 52 секунды вообще-то предикат неплохо использовать вместо жесткого условия, чтоб универсальность получить... |
| Автор: шарлотта 28.5.2017, 14:41 |
| Как все просто. Спасибо Вам огромное! |
| Автор: xvr 28.5.2017, 18:57 | ||||||||
Смотрим вызов:
Смотрим реализацию разыменования в итераторе:
Разыменование должно выглядеть так:
Про copyIf - он копирует в уже существующий контейнер (как в stl). Если вам нужно добавлять в пустой контейнер, то (так же, как в stl) нужно сделать специальный итератор, который при инкременте добавляет элемент в контейнер (см например std::back_inserter), и вызывать с ним |
| Автор: шарлотта 28.5.2017, 20:20 |
| Большое спасибо! |