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

Ваш аккаунт

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

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

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

Можно ли указателю одного типа присвоить указатель другово?

3.9K
21 октября 2004 года
generalm
28 / / 20.10.2004
Можно ли указателю одного типа присвоить указатель другово?

тоесть

если у нас есть указ на указ tstr:
tstr ** str;

написать такое

str= new (spisok*);
// таким образом я хочу сослаться на список

И если нельзя, то как это можно обойти? или это глухая стена?

И еще если есть структура такая:
указатель на массив указателей баз класса и описывается она как
tstr ** str;
str= (tstr**) calloc (n,sizeof(tstr*));

то указатель на список базовых классов будет выглядеть так
str= (tstr**) calloc (1,sizeof(spisok*));
а в самом классе (spisok* alfa) написать
alfa = new (имя_произв_класса)
9.1K
21 октября 2004 года
PIL
1 / / 21.10.2004
Ты можешь смело присваивать указателю на базовый класс указатель потомка, указав приведение типов:
Parent *p_par;
Parent *par=new Child();
при этом можешь во всю пользоваться всеми прелестями виртуальных функций :)
527
21 октября 2004 года
pavor
275 / / 28.09.2003
ТО, чем ты занимаешься называется "из ... конфеты делать". Сначала тщательно продумай, а потом реализуй. Если хочешь нормальных подсказок - скажи лучше цель твоих изощрений.
3.9K
21 октября 2004 года
generalm
28 / / 20.10.2004
Цитата:
Originally posted by pavor
ТО, чем ты занимаешься называется "из ... конфеты делать". Сначала тщательно продумай, а потом реализуй. Если хочешь нормальных подсказок - скажи лучше цель твоих изощрений.



ну хорошо идем по дороге


Что от меня требуется

Мы вводим с клавы кол-во значений элементов

и выделяем указатель на массив указателей базового класса(СТРОКА)....

Позже в зависимости от введеных значний (пользователь определяет) какой это будет произв. класс(СТРОКА УКАЗАТЕЛЬ или БИТОВАЯ СТРОКА)

все это реальзовано в виде

tstr ** str // указ на указ
str=(tstr**) calloc (количество_элементов, sizeof (tstr*)

а дальше в проге
str[Номер Элемента Массива]= new (tstr_id к примеру)


теперь след задание

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

и как это сделать чтоб особо не попортить всю прогу (1500 строк везде ссылки на этот str, нельзя в корне прогу ломать) ума не приложу

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

527
21 октября 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by generalm


ну хорошо идем по дороге


Что от меня требуется

Мы вводим с клавы кол-во значений элементов

и выделяем указатель на массив указателей базового класса(СТРОКА)....

Позже в зависимости от введеных значний (пользователь определяет) какой это будет произв. класс(СТРОКА УКАЗАТЕЛЬ или БИТОВАЯ СТРОКА)

все это реальзовано в виде

tstr ** str // указ на указ
str=(tstr**) calloc (количество_элементов, sizeof (tstr*)

а дальше в проге
str[Номер Элемента Массива]= new (tstr_id к примеру)


теперь след задание

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

и как это сделать чтоб особо не попортить всю прогу (1500 строк везде ссылки на этот str, нельзя в корне прогу ломать) ума не приложу

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


А теперь как это делается по человечески:
Пользователь вводит строку, определяется ее тип и выделяется память под эту строку нужного типа.
В массив указателей на базовый класс добавляется этот указатель. Все. Деструктор базового класса определен как виртуальный, необходимые функции для работы с особыми видами строк объявлены чисто виртуальными.

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

А теперь как это делается по человечески:
Пользователь вводит строку, определяется ее тип и выделяется память под эту строку нужного типа.
В массив указателей на базовый класс добавляется этот указатель. Все. Деструктор базового класса определен как виртуальный, необходимые функции для работы с особыми видами строк объявлены чисто виртуальными.



извени забыл обмолвится, я студент,и это задание, к сожалению видоизменять задание нельзя.

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

теперь вот про второе помощи и прошу

в самом начале проги ПОЛЬЗОВАТЕЛЬ вводит количество элементов и под него мы создаем СПИСОК указателей на базовый класс.

Чуть позже в зависимости от того что ввел пользователь определяется Произв. класс.

И элемент списка ссылается на произв. класс, а не на базовый...

527
22 октября 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by generalm


извени забыл обмолвится, я студент,и это задание, к сожалению видоизменять задание нельзя.

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

теперь вот про второе помощи и прошу

в самом начале проги ПОЛЬЗОВАТЕЛЬ вводит количество элементов и под него мы создаем СПИСОК указателей на базовый класс.

Чуть позже в зависимости от того что ввел пользователь определяется Произв. класс.

И элемент списка ссылается на произв. класс, а не на базовый...


Возможно я тебя удивлю, но список не требует ввода числа элементов. Корректен только способ

struct Element
{
Base* base;
Element* next;
Element* prev;
};

class Advanced1: public Base
{
};

class Advanced2: public Base
{
};

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

Возможно я тебя удивлю, но список не требует ввода числа элементов. Корректен только способ

struct Element
{
Base* base;
Element* next;
Element* prev;
};

class Advanced1: public Base
{
};

class Advanced2: public Base
{
};



Насчет того что список не требует ввода числа элементов, я с тобой согласен конечно, но задание это требует:

У нас есть кнопка "Количество элементов", в ней и задется

к приведенному выше тобою участку кода, хочу задать вопрос:

как ты собираешься с ним работать?

предполагаю что надо создать в main()
указатель на элемент(ы) списка согласен?

создаем: tstr** str;

теперь выделем память под элемент списка:

str= (tstr**) calloc (1,sizeof (Element));

щас мы имеем str как указатель на элемент списка, теперь переопределим указатель на базовый класс
void spisok::add(tstr** str,spisok *beg,int k)
{
for (int i=0; i<k;i++){

str=new (tstr*);
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 type,char*xxx2) //ne gotovo
{
int number=el;
spisok* prev;
while (!(beg->next==NULL))

{if (beg->el==number) {

if (type==1) klaspr=new tstr_id(xxx2);
if (type==2) klaspr=new tstr_bit(xxx2);


return beg;}
beg=beg->next;
}
return beg;
}
-------------------------------------------------

Но к сожалению непонятно теперь как обращаться к элементам str?

например чтобы вывести переменную x описаную в базовом классе, написание

str->select (номер элемента(я упрощаю))
ну выдасте он мне элемент списка
а как вызвать метод get_char (который возвр. поле в классе) не понятно...


Ладно, думаю это нерешаемая задача, остается тока сдаться :(









class spisok
{
protected:
spisok* next; // sled element
int el;
public:
tstr* klaspr;
void spisok::add(tstr** str,spisok *beg,int k);
spisok* spisok::select (spisok *beg,int el,int type,char* xxx2); //ne gotovo

};
void spisok::add(tstr** str,spisok *beg,int k)
{
for (int i=0; i<k;i++){

str=new (tstr*);
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 type,char*xxx2) //ne gotovo
{
int number=el;
spisok* prev;
while (!(beg->next==NULL))

{if (beg->el==number) {

if (type==1) klaspr=new tstr_id(xxx2);
if (type==2) klaspr=new tstr_bit(xxx2);


return beg;}
beg=beg->next;
}
return beg;
}

3.9K
22 октября 2004 года
generalm
28 / / 20.10.2004
может у кого есть готовый код решения этой проблемы...?? все может быть
527
22 октября 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by generalm
может у кого есть готовый код решения этой проблемы...?? все может быть


Извиняй, твой код у меня не хватает терпения читать. Собственно разберись с тем, что такое список. Ты не совсем понимаешь, как это делается.
Вот код (мой вариант):

Используется структура элемент, которую я написал, только однонаправленный вариант (указатель next не используется):

В Element надо определить деструктор
~Element()
{
delete base;
delete prev;
}

class List
{
void AddTale(Base *pEl)
{
Element *tmp = tale;
tale = new Element;
tale->base=pEl;
tale->prev=tmp;
}

void Clear()
{
delete tale;
}

Element *tale;
};

List list;

Ввод элементов
for (int i = 0; i < countOfElements; i++)
{
Base *base;
read(buffer);

switch(RecognizeType(buffer))
{
case Type1:
base = new Advanced1(buffer);
break;
case Type2:
base = new Advanced2(buffer);
break;
default:
//Ошибка
}

list.AddTale(base);
}

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

Извиняй, твой код у меня не хватает терпения читать. Собственно разберись с тем, что такое список. Ты не совсем понимаешь, как это делается.
Вот код (мой вариант):

Используется структура элемент, которую я написал, только однонаправленный вариант (указатель next не используется):

В Element надо определить деструктор
~Element()
{
delete base;
delete prev;
}

class List
{
void AddTale(Base *pEl)
{
Element *tmp = tale;
tale = new Element;
tale->base=pEl;
tale->prev=tmp;
}

void Clear()
{
delete tale;
}

Element *tale;
};

List list;

Ввод элементов
for (int i = 0; i < countOfElements; i++)
{
Base *base;
read(buffer);

switch(RecognizeType(buffer))
{
case Type1:
base = new Advanced1(buffer);
break;
case Type2:
base = new Advanced2(buffer);
break;
default:
//Ошибка
}

list.AddTale(base);
}




все, фэнкс, используя некоторые твои фичи дописал прогу

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