![]() |
|
Модераторы: bsa |
![]()
|
|
| wowka19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Вот класс:
node.h
node.cpp
Во-первых это работает только когда статические свойства инициализируются в реализации класса, а не в main() как положено (учился по учебнику Либерти): если в main() { Node * Node::head = 0; Node * Node::tail = 0; } то компилятор : C:\Users\Alega\Documents\codeblocks\laba02\main.cpp|9|error: invalid use of qualified-name 'Node::head'| C:\Users\Alega\Documents\codeblocks\laba02\main.cpp|10|error: invalid use of qualified-name 'Node::tail'| Во-вторых при применении механизма шаблонов (если всё раскомментировать) компилятор ругается на эти статические свойства в node.cpp: C:\Users\Alega\Documents\codeblocks\laba02\node.cpp|3|error: expected constructor, destructor, or type conversion before '*' token| C:\Users\Alega\Documents\codeblocks\laba02\node.cpp|4|error: expected constructor, destructor, or type conversion before '*' token| C:\Users\Alega\Documents\codeblocks\laba02\node.cpp|6|error: 'template<class T> class Node' used without template parameters| Помогите разобраться. Уже второй день сижу, несколько раз переписывал всё с нуля! |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
поля голова и хвост не должны быть статическими, иначе будет возможность построения лишь единственного списка...
заведите еще один класс в котором и определите головухвост.. Добавлено через 1 минуту и 30 секунд редкий компилятор поддерживает экспорт шаблонов, поэтому определять всю поднаготную шаблонного класса нужно в хидере.. Добавлено через 2 минуты и 33 секунды
должны быть определены как за пределами класами, так и за пределами функции (в том числе маин) Добавлено через 3 минуты и 56 секунд ну так template <typename T> нужно перед каждым определением добавлять.. |
|||
|
||||
| rumit7 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 16.6.2011 Репутация: нет Всего: 7 |
Ох уж этот Либерти.. Не в первый раз сталкиваюсь с тем, что после него люди пишут, но не поймут как хотя бы сделать чтобы компилировалось..
Как-то так должно быть чтобы хотя бы компилировалось.. P.S. Вам бы взять, либо получше книгу, либо полегче задание, для начала, а потом можно и с наворотами.. Это сообщение отредактировал(а) rumit7 - 18.1.2012, 20:19 |
||||
|
|||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Вот это немного не понял:
и вот этого: Можно на моем примере код показать? И еще пару сопутствующих вопросов: 1. Почему компилятор выдает ошибку: "C:\Users\Alega\Documents\codeblocks\laba02\node.cpp|3|error: 'NULL' was not declared in this scope|" когда я пишу Node<T> * Node<T>::head = NULL // так даже вроде правильнее (по идеологии) вместо Node<T> * Node<T>::head = 0 //все-таки 0 - это число, а NULL - указатель (какой-то там) ??? 2. Объясните в чем различия между a, b и c: char * a = "hello"; char * b = new char[6]; b[0] = 'h', b[] = 'e', b[] = 'l', b[] = 'l', b[] = 'o', b[] = '\0'; char c[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; Просто хочу иметь четкие и исчерпывающие понятия о данных типах. Такие вещи не объясняются в книжках (подобным образом). 3. Очень частые warnings: warning: deprecated conversion from string constant to 'char*' можно ли на них забить? и как от них избавиться? Это сообщение отредактировал(а) wowka19 - 18.1.2012, 20:59 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
если строку надо изменять, создавайте массив
char c [] = "hello" // или что то же самое {'h', 'e', 'l', 'l', 'o', '\0'}; иначе можно const char * c = "hello"; но не делайте char * c = "hello" Добавлено через 3 минуты и 47 секунд это не правильно : нужно вне функции, т.е. так :
в первом примере в принципе у Вас так и написано... |
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Почему?
А разве это не одно и тоже? В общем объясните пожалуйста ранее поставленный вопрос: Это сообщение отредактировал(а) wowka19 - 19.1.2012, 07:23 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
a - компилятор выделяет память для строки "hello" в статической области памяти (может даже защищённой от записи) и a указывает на неё, поэтому mes и говорил, что нужно делать const char *, чтобы в эту память никто не смог записать b - во время выполнения программы выделяется память в куче, и b указывает на неё. c - если определено внутри функции, то, скорее всего, компилятор выделит память в стеке и c будет указывать на неё. Кста, char c[ 6 ] = "hello"; эквивалентно char c[] = "hello"; во втором случае компилятор сам подсчитает сколько нужно чаров Добавлено через 3 минуты и 2 секунды вот статья про указатели вот ещё одна Добавлено через 5 минут и 56 секунд
см. объяснение про статическую защищённую память. забивать нельзя ни на один warning. как избавиться - пиши const char * -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| rumit7 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 16.6.2011 Репутация: нет Всего: 7 |
По-моему, как раз-таки в книжках объясняется очень даже хорошо, иначе никто бы книги и не покупал.. Например, можно почитать Stephen Prata "C++ primer plus". Конкретно вот в этой главе описаны составные типы данных С++. А вот здесь имеется ответ на некоторые Вами заданные вопросы (смотрите "Functions and C-Style Strings"). |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
почитайте о различии массива и указателя.. |
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
спасибо за ссылки. почитал - понравилось.
в общем, чтоб расставить все точки... 1. Это одно и тоже: char a[] = "hello"; char a[] = {'h', 'e', 'l', 'l', 'o', '\0'} 2. Это разные вещи: char a[] = "hello"; // хранится в стеке, a[0] = 'H' прокатит char * a = "hello"; // хранится в статической памяти и изменять нельзя - a[0] = 'H' не прокатит Всё верно? Добавлено @ 14:36 а собсно чего там сложного.. char a[] = "hello"; char * b = "hello"; a - это тоже указатель, как и b. Причем такой же char'овский Просто различие в том на какой тип памяти указывают эти указатели - а вот это я не знаю.. и это я хочу узнать. Это сообщение отредактировал(а) wowka19 - 19.1.2012, 16:32 |
|||
|
||||
| rumit7 |
|
||||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 16.6.2011 Репутация: нет Всего: 7 |
Да.
Лучше сказать, что память выделится под массив, а значит "a[0] = 'H' прокатит". Где именно? Могу сказать, что в стеке память выделяется только для локальных объектов.
Более правильнее записать так:
так как полюбому "a[0] = 'H' не прокатит" ввиду того, что память выделенная для "hello" не изменяемая (если она вообще выделена, т.к. компилятор может и с оптимизировать). Но не забываем, что сам "a" - указатель, и под него память выделяется, а значит его значение можно изменить:
Теперь вроде да..(?)
а - это массив размером в 6 элементов. b - это указатель. Это сообщение отредактировал(а) rumit7 - 19.1.2012, 16:59 |
||||||||||||||
|
|||||||||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |