Можно ли указателю одного типа присвоить указатель другово?
тоесть
если у нас есть указ на указ tstr:
tstr ** str;
написать такое
str= new (spisok*);
// таким образом я хочу сослаться на список
И если нельзя, то как это можно обойти? или это глухая стена?
И еще если есть структура такая:
указатель на массив указателей баз класса и описывается она как
tstr ** str;
str= (tstr**) calloc (n,sizeof(tstr*));
то указатель на список базовых классов будет выглядеть так
str= (tstr**) calloc (1,sizeof(spisok*));
а в самом классе (spisok* alfa) написать
alfa = new (имя_произв_класса)
Parent *p_par;
Parent *par=new Child();
при этом можешь во всю пользоваться всеми прелестями виртуальных функций :)
ТО, чем ты занимаешься называется "из ... конфеты делать". Сначала тщательно продумай, а потом реализуй. Если хочешь нормальных подсказок - скажи лучше цель твоих изощрений.
ну хорошо идем по дороге
Что от меня требуется
Мы вводим с клавы кол-во значений элементов
и выделяем указатель на массив указателей базового класса(СТРОКА)....
Позже в зависимости от введеных значний (пользователь определяет) какой это будет произв. класс(СТРОКА УКАЗАТЕЛЬ или БИТОВАЯ СТРОКА)
все это реальзовано в виде
tstr ** str // указ на указ
str=(tstr**) calloc (количество_элементов, sizeof (tstr*)
а дальше в проге
str[Номер Элемента Массива]= new (tstr_id к примеру)
теперь след задание
нужно сделать тоже самое тока вместо массива список организовать
и как это сделать чтоб особо не попортить всю прогу (1500 строк везде ссылки на этот str, нельзя в корне прогу ломать) ума не приложу
вот здесь и прошу у народа помощи...
если у кого интерес возник могу код выложить, или кусок про списки... было бы желание, боюсь сам я до правильного решения не дойду
ну хорошо идем по дороге
Что от меня требуется
Мы вводим с клавы кол-во значений элементов
и выделяем указатель на массив указателей базового класса(СТРОКА)....
Позже в зависимости от введеных значний (пользователь определяет) какой это будет произв. класс(СТРОКА УКАЗАТЕЛЬ или БИТОВАЯ СТРОКА)
все это реальзовано в виде
tstr ** str // указ на указ
str=(tstr**) calloc (количество_элементов, sizeof (tstr*)
а дальше в проге
str[Номер Элемента Массива]= new (tstr_id к примеру)
теперь след задание
нужно сделать тоже самое тока вместо массива список организовать
и как это сделать чтоб особо не попортить всю прогу (1500 строк везде ссылки на этот str, нельзя в корне прогу ломать) ума не приложу
вот здесь и прошу у народа помощи...
если у кого интерес возник могу код выложить, или кусок про списки... было бы желание, боюсь сам я до правильного решения не дойду
А теперь как это делается по человечески:
Пользователь вводит строку, определяется ее тип и выделяется память под эту строку нужного типа.
В массив указателей на базовый класс добавляется этот указатель. Все. Деструктор базового класса определен как виртуальный, необходимые функции для работы с особыми видами строк объявлены чисто виртуальными.
А теперь как это делается по человечески:
Пользователь вводит строку, определяется ее тип и выделяется память под эту строку нужного типа.
В массив указателей на базовый класс добавляется этот указатель. Все. Деструктор базового класса определен как виртуальный, необходимые функции для работы с особыми видами строк объявлены чисто виртуальными.
извени забыл обмолвится, я студент,и это задание, к сожалению видоизменять задание нельзя.
первым мои заданием был массив указатели на баз с чем я справился
теперь вот про второе помощи и прошу
в самом начале проги ПОЛЬЗОВАТЕЛЬ вводит количество элементов и под него мы создаем СПИСОК указателей на базовый класс.
Чуть позже в зависимости от того что ввел пользователь определяется Произв. класс.
И элемент списка ссылается на произв. класс, а не на базовый...
извени забыл обмолвится, я студент,и это задание, к сожалению видоизменять задание нельзя.
первым мои заданием был массив указатели на баз с чем я справился
теперь вот про второе помощи и прошу
в самом начале проги ПОЛЬЗОВАТЕЛЬ вводит количество элементов и под него мы создаем СПИСОК указателей на базовый класс.
Чуть позже в зависимости от того что ввел пользователь определяется Произв. класс.
И элемент списка ссылается на произв. класс, а не на базовый...
Возможно я тебя удивлю, но список не требует ввода числа элементов. Корректен только способ
struct Element
{
Base* base;
Element* next;
Element* prev;
};
class Advanced1: public Base
{
};
class Advanced2: public Base
{
};
Возможно я тебя удивлю, но список не требует ввода числа элементов. Корректен только способ
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;
}
может у кого есть готовый код решения этой проблемы...?? все может быть
Извиняй, твой код у меня не хватает терпения читать. Собственно разберись с тем, что такое список. Ты не совсем понимаешь, как это делается.
Вот код (мой вариант):
Используется структура элемент, которую я написал, только однонаправленный вариант (указатель 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);
}
Извиняй, твой код у меня не хватает терпения читать. Собственно разберись с тем, что такое список. Ты не совсем понимаешь, как это делается.
Вот код (мой вариант):
Используется структура элемент, которую я написал, только однонаправленный вариант (указатель 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);
}
все, фэнкс, используя некоторые твои фичи дописал прогу