• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Иерархия объектов в Builder

  • Автор темы bonfunk
  • Дата начала
B

bonfunk

Дело вот в чем. В программе на досовском С++ реализрвана 4-уровнеая иерархия объектов. Работает она там исправно. При переносе на виндовский интерфейс появляются ошибки, а именно отказ присвоения объектам базового класса ссылок на объекты класса дочернего того самого 4 уровня:

class figures {

...

} *a[8][8];

class peshka: public figures {
...
};
class slon: public peshka {
...
};

class ladya: public peshka {
...
};

class ferz: virtual public slon, virtual public ladya {
...
};

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

Может кто-нибудь разъяснить ситуацию?

Заранее благодарен
 
E

European

Если я правильно понял суть иерархии, то попробуй так:
Код:
class figures {
...
};

class peshka: public figures {
...
};
class slon: virtual public peshka {
...
};

class ladya: virtual public peshka {
...
};

class ferz: public slon, public ladya {
...
};
 
B

bonfunk

Нет, не получается. Я много подобных вариаций испробовал. Может дело в наличии двух базовых классов у класса ferz?
 
E

European

<!--QuoteBegin-bonfunk+9:01:2007, 10:03 -->
<span class="vbquote">(bonfunk @ 9:01:2007, 10:03 )</span><!--QuoteEBegin-->Может дело в наличии двух базовых классав у класса ferz?
[snapback]52581" rel="nofollow" target="_blank[/snapback]​
[/quote]
Проблема состоит в неоднозначности преобразования указателя на класс ferz в указатель на класс figures, т.е. такое преобразование может быть выполнено несколькими путями: через класс slon или ladya. Выложи небольшой тестовый пример, попробую у себя посмотреть
 
B

bonfunk

Проблема состоит в неоднозначности преобразования указателя на класс ferz в указатель на класс figures
Да, скорее всего. Я, правда, пробовал эту неоднозначность устранить, однако структура иерархии должна была остаться неизменной, поэтому ни к чему путному это не привело

Вот определение самих классов иерархии, плюс места ошибок.
Код:
class figures {
public:
int color;
TImage *MyPicture;
figure(int col){color=col;}
virtual void hod(int x,int y){}
virtual void image(int x,int y, int color){}
} *a[8][8];

int hod_chk[8][8],templat[8][8]; 
//-----------------------------------------------------------------------
class peshka: public figures {
protected: int x,y;
public: peshka(int col){color=col;}
virtual void hod(int x,int y);
virtual void image(int x,int y, int color);
};

class slon: public peshka {
public: slon(int col):peshka(col){color=col;}
virtual void hod(int x,int y);
virtual void image(int x,int y, int color);
};

class ladya: public peshka {
public: int l_h;
public: ladya(int col):peshka(col){color=col;l_h=0;}
virtual void hod(int x,int y);
virtual void image(int x,int y, int color);
};

class ferz: public slon, public ladya {
public: ferz(int col):ladya(col),slon(col)/*,peshka(col)*/{slon::color=col;};
virtual void hod(int x,int y);
virtual void image(int x,int y, int color);
};

...


void ferz::image(int x,int y, int color)
{
TImage *Temp;
if(color==14)
Temp=Form1->Image92;
if(color==0)
Temp=Form1->Image65;

ferz:: MyPicture=Temp;// Та самая неоднозначность

...

// Собственно, место преткновения
a[4][8]=&f2;
 
?

????

<!--QuoteBegin-bonfunk+9:01:2007, 12:03 -->
<span class="vbquote">(bonfunk @ 9:01:2007, 12:03 )</span><!--QuoteEBegin-->Может дело в наличии двух базовых классов у класса ferz?
[snapback]52581" rel="nofollow" target="_blank[/snapback]​
[/quote]

если у тебя Builder, то ты наверное прав - там невозможно множественное наследование.
 
E

European

<!--QuoteBegin-????+9:01:2007, 10:59 -->
<span class="vbquote">(???? @ 9:01:2007, 10:59 )</span><!--QuoteEBegin-->если у тебя Builder, то ты наверное прав - там невозможно множественное наследование.
[snapback]52585" rel="nofollow" target="_blank[/snapback]​
[/quote]
Насколько я знаю, множественное наследование запрещено только для VCL-классов. Наверное стоит убрать указатель на TImage из базового класса
 
B

bonfunk

Наверное стоит убрать указатель на TImage из базового класса
Это не поможет. Ошибка неоднозначности наследования выскакивает и при обращении (в методах класса) к его член-данным, в частности:

Код:
void ferz::image(int x,int y)
{
TImage *Temp;
if(color==14)					  //имеется ввиду свойство color класса figures. Здесь
Temp=Form1->Image92;
if(color==0)						//и здесь также выдаваласьошибка "Member is ambigous"
Temp=Form1->Image65;

ferz:: MyPicture=Temp;
 
C

Creo

А если просто попробовать как говориться в лоб figures::color? :)
Может неоднозначность возникает потому, что нет следующей строчки
Код:
class peshka: virtual public figures
{
//......
};
 
E

European

<!--QuoteBegin-Creo+10:01:2007, 09:40 -->
<span class="vbquote">(Creo @ 10:01:2007, 09:40 )</span><!--QuoteEBegin-->Может неоднозначность возникает потому, что нет следующей строчки
Код:
class peshka: virtual public figures
{
//......
};
[snapback]52676" rel="nofollow" target="_blank[/snapback]​
[/quote]
Виртуальное наследование нужно для классов, "разветвляющих" иерархию, т.е. для слона и ладьи.
 
C

Creo

Для: European
Согласись ferz, косвенно наследует экземпляры базового класса figures. Т.е. в памяти создается два объекта класса figures один для пешки, другой для для ладьи и слона. Возможно именно между ними и конфликт. Было бы неплохо проверить.... Ждем bonfunk`а, пусть проверит.
 
E

European

Для: Creo
Коллега, позвольте не согласится :) При твоем решении для ferz будет создано 2 экземпляра peshka и один figures, при моем - по одному peshka и figures. Хотя только bonfunk может нас рассудить
 
B

bonfunk

Может неоднозначность возникает потому, что нет следующей строчки
Код:
class peshka: virtual public figures
{
//......
};
Creo, ты прав! Все гениальное просто. А ведь сам так пробовал(

Большое спасибо всем за помощь
 
B

bonfunk

Для: European Нет, как не странно, ошибка осталась. В варианте Creo, кстати, нет значения, наследовать ли сам класс ferz виртуально от ladya и slon (я, по крайней мере, ее пока не уловил)
 
C

Creo

Меня это всё самого смущает. Так как во всех производных классах фигурирует figures::color, логичнее всего было объявить только один класс figures виртуальным. Хотя это все больше похоже на шаманство какое-то. Следующее правило мне больше нравится:
Виртуальное наследование нужно для классов, "разветвляющих" иерархию...
И нормальный компилятор далжен поддерживать такую логику. Досовский же так и работал :)
Да, наследовать класс ferz виртуально от ladya и slon тоже по ходу придется.
 
E

European

<!--QuoteBegin-Creo+12:01:2007, 09:27 -->
<span class="vbquote">(Creo @ 12:01:2007, 09:27 )</span><!--QuoteEBegin-->И нормальный компилятор далжен поддерживать такую логику.
[snapback]52911" rel="nofollow" target="_blank[/snapback]​
[/quote]
А какая версия Билдера и компилятора?
 
E

European

Хочешь, можешь выложить проект, я у себя посмотрю
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!