Форум программистов, компьютерный форум CyberForum.ru

Статические члены класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Reiji Cross
 Аватар для Reiji Cross
26 / 26 / 1
Регистрация: 14.05.2010
Сообщений: 57
30.09.2010, 03:17     Статические члены класса #1
Доброго времени суток.
Задача состоит в том, чтобы создать список обыектов класса Test, с возможностью последующего добавления элементов и расширения списка. Память под список долна добавляться в конструкторе. Указктель p должен быть статическим и в каждом объекте класса должен быть равным указателю на начало списка, т. е. на первый элемент, но уже в объявлении
C++
1
Test *Test::p = NULL;
он отказывается принимать значение NULL, то же самое происходит и в конструкторе
C++
1
p = this;
значение не присваивается, а остаеттся прежним, и указывает на какой-то левый адрес

Вот описание класса Test
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Test {
protected:
    char *name;
    char *type;
    static int count;
    static Test *p;
public:
    int GetCount(){return count;};
    Test(char *s, char *t);
    Test(){};
    char *Show();
};
 
int Test::count = 0;
Test *Test::p = NULL;
 
Test::Test(char *s, char *t){
    count++;
    if((count - 1) == 0) {
        p = this;
    } else {
        realloc(p, (count + 1)*sizeof(Test));
    }
    strcpy(name, s);    
    strcpy(type, t);
}
 
char *Test::Show(){
    char *str;
    for(int i = 0; i < count; i++){
        strcat(str, name);
        strcat(str, "\n");
    }
    return str;
}
Первый элемент списка объявляю так

C++
1
 Test *spis = new Test(nstring, "Test");
Буду благодарен за любую помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.09.2010, 03:21     Статические члены класса #2
А если так?
C++
1
Test* Test::p = 0;
И лучше все же пользоваться:
C++
1
p=new Test[count+1];
Вместо:
C
1
realloc(p, (count + 1)*sizeof(Test));
Reiji Cross
 Аватар для Reiji Cross
26 / 26 / 1
Регистрация: 14.05.2010
Сообщений: 57
30.09.2010, 03:25  [ТС]     Статические члены класса #3
Извиняюсь за дублирование темы, из-за проблем с браузером дважды отправился запрос на создание темы

Добавлено через 2 минуты
Цитата Сообщение от Lavroff Посмотреть сообщение
А если так?
C++
1
Test* Test::p = 0;
По моему такаязапись ошибочна но сейчас попробую
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.09.2010, 03:27     Статические члены класса #4
Reiji Cross, Отнюдь. Это NULL Страуструп не рекомендует использовать в C++. А 0 вполне. В С++0x будет специальный null_ptr.
Reiji Cross
 Аватар для Reiji Cross
26 / 26 / 1
Регистрация: 14.05.2010
Сообщений: 57
30.09.2010, 03:33  [ТС]     Статические члены класса #5
Да, все-таки появилась ошибка.
error C2039: 'p' : is not a member of '`global namespace'' c:\users\kross\documents\visual studio 2010\projects\oop_lab2_v5_kross\oop_lab2_v5_kross\Form1.h

Цитата Сообщение от Lavroff Посмотреть сообщение
p=new Test[count+1];
Если так выделять память, то это ведь не расширит память для имеющегося списка, а выделит новый участок который будет вмещать на 1 элемент больше чем предыдущий. Тогда придется копировать весь прошлый список в на этот участок памяти и добавлять новый элемент? Если я не прав, поправьте меня...

Добавлено через 1 минуту
Вижу вы отредактировали свой спервый пост, меня смутила там звездочка на новом месте а не 0

Добавлено через 2 минуты
Исправил NULL на 0. Проблема осталась та же.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.09.2010, 03:38     Статические члены класса #6
Reiji Cross, Да. Выделит новый участок. Но realloc это Си... Хотя. Быть может он вам тут и нужен.

То есть все равно указывает вникуда?
Reiji Cross
 Аватар для Reiji Cross
26 / 26 / 1
Регистрация: 14.05.2010
Сообщений: 57
30.09.2010, 03:45  [ТС]     Статические члены класса #7
Цитата Сообщение от Lavroff Посмотреть сообщение
Reiji Cross, Да. Выделит новый участок. Но realloc это Си... Хотя. Быть может он вам тут и нужен.

То есть все равно указывает вникуда?
Да, именно "вникуда". Вот уже час бьюсь именно с это проблемой. И заметил еще кое что, почемуто указатели на эти поля объектов
C++
1
2
    char *name;
    char *type;
всегда указывают на непонятный адрес
name 0xcdcdcdcd <Bad Ptr> char *
type 0xcdcdcdcd <Bad Ptr> char *

Может стоит выделить вручную и для них память?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.09.2010, 03:47     Статические члены класса #8
Reiji Cross, А вы этого не делаете? Конечно стоит.
Reiji Cross
 Аватар для Reiji Cross
26 / 26 / 1
Регистрация: 14.05.2010
Сообщений: 57
30.09.2010, 03:51  [ТС]     Статические члены класса #9
Вместе с тем проблема со статическим указателем на начало списка остается
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2010, 12:21     Статические члены класса
Еще ссылки по теме:

Статические члены C++
C++ Статические члены класса
C++ Класс MyString через статические члены класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nwq
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
30.09.2010, 12:21     Статические члены класса #10
Цитата Сообщение от Reiji Cross Посмотреть сообщение
C++
1
Test *Test::p = NULL;
он отказывается принимать значение NULL, то же самое происходит и в конструкторе
Что значит отказывается? Это верная конструкция, должно быть всё нормально.
Yandex
Объявления
30.09.2010, 12:21     Статические члены класса
Ответ Создать тему
Опции темы

Текущее время: 16:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru