Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> объявления класса без описания, Double Dispatch 
:(
    Опции темы
Mongol
Дата 10.12.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Учебное задание. Нужно реализовать программу по примеру.
Затруднения в том что при описании классов Starship нужно что бы были описаны классы Asteroid, и наоборот что бы описать Asteroid нужно что были описаны предварительно классы  Starship. (подскажите как это по нормальному называется). Пробовал сначала только делать объявления(class AsteroidLevel1;), разбросать все по разным файлам в надежде на компоновщика, - ничего не помогает:

Код

#include <iostream>

class StarshipLevel1
{
    public:
    void func() { std::cout << "starshipLevel1" << std::endl; }
    virtual void collideWith(AsteroidLevel1* asteroid) { asteroid->collideWith(this); }
};

class StarshipLevel2 : public StarshipLevel1
{
    public:
    void func() { std::cout << "starshipLevel2" << std::endl; }
    virtual void collideWith(AsteroidLevel1* asteroid) { asteroid->collideWith(this); }
};

class AsteroidLevel1
{
    public:
    virtual void collideWith(StarshipLevel1* theStarship) { std::cout << "AsteroidLevel1 collide with -- "; theStarship->func(); }
    virtual void collideWith(StarshipLevel2* theStarship) { std::cout << "AsteroidLevel1 collide with -- "; theStarship->func(); }
};

class AsteroidLevel2 : public AsteroidLevel1
{
    public:
    virtual void collideWith(StarshipLevel1* theStarship) { std::cout << "AsteroidLevel2 collide with -- "; theStarship->func(); }
    virtual void collideWith(StarshipLevel2* theStarship) { std::cout << "AsteroidLevel2 collide with -- "; theStarship->func(); }
};

int main(int argc, char** argv)
{
    StarshipLevel1 theStarshipLevel1;
    StarshipLevel2 theStarshipLevel2;
    
    AsteroidLevel1 theAsteroidLevel1;
    //without using any dynamic dispatch
//     theAsteroidLevel1.collideWith(&theStarshipLevel1);
//     theAsteroidLevel1.collideWith(&theStarshipLevel2);
    
    AsteroidLevel2 theAsteroidLevel2;
    //without using any dynamic dispatch
//     theAsteroidLevel2.collideWith(&theStarshipLevel1);
//     theAsteroidLevel2.collideWith(&theStarshipLevel2);
    
    AsteroidLevel1* pAsteroidLevel1 = &theAsteroidLevel1;
    //using dynamic dispatch
//     pAsteroidLevel1->collideWith(&theStarshipLevel1);
//     pAsteroidLevel1->collideWith(&theStarshipLevel2);
    
    pAsteroidLevel1 = &theAsteroidLevel2;
    //using dynamic dispatch
//     pAsteroidLevel1->collideWith(&theStarshipLevel1);
//     pAsteroidLevel1->collideWith(&theStarshipLevel2);
    
    StarshipLevel1* pStarshipLevel1 = &theStarshipLevel2;
    std::cout << "\n";
//     theAsteroidLevel1.collideWith(&theStarshipLevel1);
//     theAsteroidLevel1.collideWith(pStarshipLevel1);
    std::cout << "\n";
//     theAsteroidLevel2.collideWith(&theStarshipLevel1);
//     theAsteroidLevel2.collideWith(pStarshipLevel1);
    
    //pAsteroidLevel1->collideWith(&theStarshipLevel1);
    //pAsteroidLevel1->collideWith(pStarshipLevel1);
    
    //Double dispatch
    pStarshipLevel1->collideWith(theAsteroidLevel1);
    pStarshipLevel1->collideWith(theAsteroidLevel2);
    pStarshipLevel1->collideWith(pAsteroidLevel1);
}

PM MAIL   Вверх
djamshud
Дата 10.12.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Forward declaration называется, емнип.

Код

class B;

class A{
B *object;
A();
};

class B{
A *object;
B();
};

A::A(){
this->object=new B;
}

B::B(){
this->object=new A;
}



Можно разносить по разным файлам.

Суть в том, что объект нельзя использовать, пока его класс не описан. Но с другой стороны его можно "упоминать" в ряде случаев. Например через указатель (как в примере), в качестве параметра или возвращаемого значения функции.

В примере сначала описаны классы, а только потом реализованы их конструкторы, когда уже ничто не мешает полностью использовать объекты соседнего класса.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Mongol
Дата 10.12.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Спасибо. Проблема решена.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0609 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.