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

Тема в разделе "Общие вопросы по С и С++", создана пользователем bonfunk, 5 янв 2007.

  1. bonfunk

    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 {
    ...
    };

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

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

    Заранее благодарен
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Если я правильно понял суть иерархии, то попробуй так:
     
  3. bonfunk

    bonfunk Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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. Выложи небольшой тестовый пример, попробую у себя посмотреть
     
  5. bonfunk

    bonfunk Гость

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

    Вот определение самих классов иерархии, плюс места ошибок.
    Код (Text):
    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;
     
  6. ????

    ???? Гость

    <!--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, то ты наверное прав - там невозможно множественное наследование.
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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 из базового класса
     
  8. bonfunk

    bonfunk Гость

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

    Код (Text):
    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;
     
  9. Creo

    Creo Гость

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

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

    Creo Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: Creo
    Коллега, позвольте не согласится :) При твоем решении для ferz будет создано 2 экземпляра peshka и один figures, при моем - по одному peshka и figures. Хотя только bonfunk может нас рассудить
     
  13. bonfunk

    bonfunk Гость

    Creo, ты прав! Все гениальное просто. А ведь сам так пробовал(

    Большое спасибо всем за помощь
     
  14. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    А мои вариант не заработал?
     
  15. bonfunk

    bonfunk Гость

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

    Creo Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    А какая версия Билдера и компилятора?
     
  18. bonfunk

    bonfunk Гость

    Версия 6.0 build 10.157
    Вот как раз без этого получается обойтись
     
  19. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Хочешь, можешь выложить проект, я у себя посмотрю
     
Загрузка...

Поделиться этой страницей