Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема с указателями(не все так просто!)

3.9K
20 октября 2004 года
generalm
28 / / 20.10.2004
Ребята дайте плиз идею по след. теме

представьте что у нас есть базовый класс и два к нему производных

базовый называется(tstr)
1производный (tstr_id)
2производный (tstr_bit)

естественно все классы уже реализованы

и раньше были связаны так

в main указывал tstr** str;
и потом выделял память, : тоесть получал указатель на массив указатель базового класса, а потом по мере надобности заполнял его производными типа

str[2]=new tstr_id(строка_в_конструктор);

----

теперь же мне нужно вместо массива указателей организовать списки в виде класса

вот класс который я написал:


class spisok
{
protected:
spisok* next; // sled element
int el;
public:
void spisok::add(spisok *beg,int k);
spisok* spisok::select (spisok *beg,int el); //ne gotovo
void spisok::fillid(spisok *beg,int k);
void spisok::fillbit(spisok *beg,int k);
};
void spisok::add(spisok *beg,int k)
{
for (int i=0; i<k;i++){
beg=(spisok*) calloc (1,sizeof(tstr*)); // pv ukazatel na mas
beg->next= NULL;

if (k==1) {beg->el=k;beg->next= NULL;}
else { //esli ne pust

spisok* temp= beg;
while (temp->next)
temp=temp->next;
temp->next=beg;
temp->el=k;
}
}
}
spisok* spisok::select (spisok *beg,int el)
{
int number=el;
spisok* prev;
while (!(beg->next==NULL))

{if (beg->el==number) return beg;
beg=beg->next;
}
return beg;
}

и создание из main():

tstr **str = NULL; // massiv ukazatelei na bazoivy klass-stroku
spisok* beg = NULL;


str=(tstr**) calloc (1,sizeof(beg));//создал 1 элемент
//kolel - количество элементов
for (i=0; i<kolel; i++)
beg->add(beg,i); //заполняю список

-------------
теперь вопрос: надо как-то организовать структуру чтоб одно указывало на другое и в итоге через str можно было бы обращаться к производному классу...

программист я начинающий и понять не могу, вторую неделю схемки рисую, ничего не получается, может у кого по больше опыта поделитесь соображениями на всякий случай в конец пишу все классы и их прототипы, приму любую помощь


class tstr
{
protected:
char *s; // stroka
int len; // dlinna stroki
int des; // desaticnoe znacenie dla bitovoy stroki
static int n_tstr; // kolicestvo vizovov konstr bez parametrov
static int n_tstr_s; // kolicestvo vizovov konstr s par strokoy
static int n_tstr_ch; // kolicestvo vizovov konstr s par simvolom
static int n_tstr_str; // kolicestvo vizovov konstr kopirovania
public:
tstr(); // konstr bez parametrov
tstr(char *s1); // konstr s parametrom stroka
tstr(char ch); // konstr s parametrom simvol
tstr(const tstr &str); // konstr kopirovania
~tstr(); // destructor
void decre(int des);
int get_len(); // dlinna stroki
int get_des();
char* get_s(); // poluchenie stroki
void clear(); // ochistka stroki
void die(); // delete ukaz
int get_val(); // dlinna stroki

int get_kop()
{
return n_tstr_str;
}

};
class spisok
{
protected:
spisok* next; // sled element
int el;
public:
void spisok::add(spisok *beg,int k);
spisok* spisok::select (spisok *beg,int el); //ne gotovo
void spisok::fillid(spisok *beg,int k);
void spisok::fillbit(spisok *beg,int k);
};
void spisok::add(spisok *beg,int k)
{
for (int i=0; i<k;i++){
beg=(spisok*) calloc (1,sizeof(tstr*)); // pv ukazatel na mas
beg->next= NULL;

if (k==1) {beg->el=k;beg->next= NULL;}
else { //esli ne pust

spisok* temp= beg;
while (temp->next)
temp=temp->next;
temp->next=beg;
temp->el=k;
}
}
}
spisok* spisok::select (spisok *beg,int el) //ne gotovo
{
int number=el;
spisok* prev;
while (!(beg->next==NULL))

{if (beg->el==number) return beg;
beg=beg->next;
}
return beg;
}



// ((spisok*) str)->select(beg,i1-1)=new tstr_id(xxx2);

class tstr_id: public tstr// stroka identifiter
{
protected:
static int n_tstr_id; // kolicestvo vizovov konstr bez parametrov
static int n_tstr_id_s; // kolicestvo vizovov konstr s par strokoy
static int n_tstr_id_str1; // kolicestvo vizovov konstr kopirovania
public:
tstr_id(); // konstr bez parametrov
tstr_id(char *s1); // konstr s parametrom stroka
tstr_id(const tstr_id &str_id); // konstr kopirovania
~tstr_id(); // destructor
int is_id(); // javlaetsa li stroka identificatorom ?
void toUp(); // perevod v verhnii registor
tstr_id& operator=(const tstr_id &str_id); // prisvaivanie
tstr_id operator+(const tstr_id &str_id); // slojenie

int get_kop()
{
return n_tstr_id_str1;
}

};
class tstr_bit: public tstr // stroka identifiter
{
protected:
static int n_tstr_bit; // kolicestvo vizovov konstr bez parametrov
static int n_tstr_bit_s; // kolicestvo vizovov konstr s par strokoy
static int n_tstr_bit_str2; // kolicestvo vizovov konstr kopirovania
public:
tstr_bit(); // konstr bez parametrov
tstr_bit(char *s1); // konstr s parametrom stroka
tstr_bit(const tstr_bit &str_bit); // konstr kopirovania
~tstr_bit(); // destructor
int is_bit(); // javlaetsa li stroka identificatorom ?
tstr_bit& tstr_bit::inve(); // inversija //poka v razrabotke
tstr_bit& operator=(const tstr_bit &str_bit);// prisvaivanie
int operator==(const tstr_bit &str_bit); // sravnenie
tstr_bit operator+(const tstr_bit &str_bit);// slojenie

int get_kop()
{
return n_tstr_bit_str2;
}

};
также есть sourse в файлике ниже... но он шас наверно не рабочий так как переделкою занимаюсь... это учебная(студенческая) программа, думаю труда для разъясения для вас это не составит
3
20 октября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by generalm
Ребята дайте плиз идею по след. теме

представьте что у нас есть базовый класс и два к нему производных

теперь же мне нужно вместо массива указателей организовать списки в виде класса

теперь вопрос: надо как-то организовать структуру чтоб одно указывало на другое и в итоге через str можно было бы обращаться к производному классу...



Воспользуйся стандартными контейнерами std::list, std::vector, std::map и т.п.

3.9K
20 октября 2004 года
generalm
28 / / 20.10.2004
Цитата:
Originally posted by Green


Воспользуйся стандартными контейнерами std::list, std::vector, std::map и т.п.



запрещено преподователем

нужно самому описать класс СПИСОК что я и сделал (попытался сделать)
и до этого базовые и производные классы (сделано & сдано)

теперь мне надо это связать... в указателях я запутался

фишка получается
такая

типа: str->(СПИСОК->Базовый класс)->Производный класс


кажись так?
но как это сделать
сделать указатель на указатель str (tstr** str)
или же описывать его как экземпляр списка?
А потом? У меня же все перепуталось в голове, надеюсь на свежий взгляд

ранее работало так:

Создавался указатель (tstr** str) на массив указателей (через динамику) на базовый класс
а в проге далее он заполнялся.

3
20 октября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by generalm


запрещено преподователем

нужно самому описать класс СПИСОК что я и сделал (попытался сделать)
и до этого базовые и производные классы (сделано & сдано)

теперь мне надо это связать... в указателях я запутался

фишка получается
такая

типа: str->(СПИСОК->Базовый класс)->Производный класс


кажись так?
но как это сделать
сделать указатель на указатель str (tstr** str)
или же описывать его как экземпляр списка?
А потом? У меня же все перепуталось в голове, надеюсь на свежий взгляд

ранее работало так:

Создавался указатель (tstr** str) на массив указателей (через динамику) на базовый класс
а в проге далее он заполнялся.



Напиши свой класс список не привязываясь к типу, который в нем хранится. Сделай, например, шаблонный класс
template<typename T>
class CMyList
{};

Опиши всю логику работы с этим классом списка. Опять же не затачивайся на том, что в нем хранится. Проверять можешь, например, на T=int.
Потом, как все заработает, просто инстанируешь свой класс список указателем на свой базовый класс.

3.9K
20 октября 2004 года
generalm
28 / / 20.10.2004
Цитата:
Originally posted by Green


Напиши свой класс список не привязываясь к типу, который в нем хранится. Сделай, например, шаблонный класс
template<typename T>
class CMyList
{};

Опиши всю логику работы с этим классом списка. Опять же не затачивайся на том, что в нем хранится. Проверять можешь, например, на T=int.
Потом, как все заработает, просто инстанируешь свой класс список указателем на свой базовый класс.



тяжело для восприятия... недорос :(
а сам класс то я написал нормально?

class spisok
{
protected:
spisok* next; // sled element
int el;
public:
void spisok::add(spisok *beg,int k);
spisok* spisok::select (spisok *beg,int el); //ne gotovo
void spisok::fillid(spisok *beg,int k);
void spisok::fillbit(spisok *beg,int k);
};
void spisok::add(spisok *beg,int k)
{
for (int i=0; i<k;i++){
beg=(spisok*) calloc (1,sizeof(tstr*)); // pv ukazatel na mas
beg->next= NULL;

if (k==1) {beg->el=k;beg->next= NULL;}
else { //esli ne pust

spisok* temp= beg;
while (temp->next)
temp=temp->next;
temp->next=beg;
temp->el=k;
}
}
}
spisok* spisok::select (spisok *beg,int el) //ne gotovo
{
int number=el;
spisok* prev;
while (!(beg->next==NULL))

{if (beg->el==number) return beg;
beg=beg->next;
}
return beg;
}

может у кого уже есть готовые решения на компе, задача-то типовая?(имею ввиду связь базовых, производных классов)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог