проблема с указателями(не все так просто!)
представьте что у нас есть базовый класс и два к нему производных
базовый называется(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 в файлике ниже... но он шас наверно не рабочий так как переделкою занимаюсь... это учебная(студенческая) программа, думаю труда для разъясения для вас это не составит
Ребята дайте плиз идею по след. теме
представьте что у нас есть базовый класс и два к нему производных
теперь же мне нужно вместо массива указателей организовать списки в виде класса
теперь вопрос: надо как-то организовать структуру чтоб одно указывало на другое и в итоге через str можно было бы обращаться к производному классу...
Воспользуйся стандартными контейнерами std::list, std::vector, std::map и т.п.
Воспользуйся стандартными контейнерами std::list, std::vector, std::map и т.п.
запрещено преподователем
нужно самому описать класс СПИСОК что я и сделал (попытался сделать)
и до этого базовые и производные классы (сделано & сдано)
теперь мне надо это связать... в указателях я запутался
фишка получается
такая
типа: str->(СПИСОК->Базовый класс)->Производный класс
кажись так?
но как это сделать
сделать указатель на указатель str (tstr** str)
или же описывать его как экземпляр списка?
А потом? У меня же все перепуталось в голове, надеюсь на свежий взгляд
ранее работало так:
Создавался указатель (tstr** str) на массив указателей (через динамику) на базовый класс
а в проге далее он заполнялся.
запрещено преподователем
нужно самому описать класс СПИСОК что я и сделал (попытался сделать)
и до этого базовые и производные классы (сделано & сдано)
теперь мне надо это связать... в указателях я запутался
фишка получается
такая
типа: str->(СПИСОК->Базовый класс)->Производный класс
кажись так?
но как это сделать
сделать указатель на указатель str (tstr** str)
или же описывать его как экземпляр списка?
А потом? У меня же все перепуталось в голове, надеюсь на свежий взгляд
ранее работало так:
Создавался указатель (tstr** str) на массив указателей (через динамику) на базовый класс
а в проге далее он заполнялся.
Напиши свой класс список не привязываясь к типу, который в нем хранится. Сделай, например, шаблонный класс
template<typename T>
class CMyList
{};
Опиши всю логику работы с этим классом списка. Опять же не затачивайся на том, что в нем хранится. Проверять можешь, например, на T=int.
Потом, как все заработает, просто инстанируешь свой класс список указателем на свой базовый класс.
Напиши свой класс список не привязываясь к типу, который в нем хранится. Сделай, например, шаблонный класс
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;
}
может у кого уже есть готовые решения на компе, задача-то типовая?(имею ввиду связь базовых, производных классов)