Форум программистов, компьютерный форум CyberForum.ru

Как скомпилировать два класса, которые используют методы друг друга - C++

Восстановить пароль Регистрация
 
diverlin
1 / 1 / 0
Регистрация: 27.04.2011
Сообщений: 7
28.04.2011, 00:28     Как скомпилировать два класса, которые используют методы друг друга #1
Доброго времени суток.

имеется 3 файлика:
asteroid.cpp
starsystem.cpp
main.cpp


в main.cpp файлики инкудятся в следующем порядке
C++
1
2
#include "asteroid.cpp"
#include "starsystem.cpp"
в asteroid.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class starSystemInstance; // эта строчка нужна чтоб обяснить asteroid.cpp о существовании типа класса starSystemInstance
 
class asteroidInstance 
{
 public:
         starSystemInstance* pTo_StarSystem;
         bool is_alive;
 
 asteroidInstance(starSystemInstance* _pTo_StarSystem)
 { 
      pTo_StarSystem = _pTo_StarSystem;
     is_alive = true;
 }
 
  void hit()
 {
  is_alive == false;
  (*pTo_StarSystem).addExplosion();
 }
 
};
typedef std::vector<asteroidInstance*> VEC_pAsteroidInstance_type;
в starsystem.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class starSystemInstance
{
  public:
    VEC_pAsteroidInstance_type asteroidInstance_pList;
    VEC_pAsteroidInstance_type asteroidInstance_pList_removeQueue;
 
  starSystemInstance()
  { }
 
   void addExplosion()
 { //делается взрыв
 }
};
проблема в том что asteroid.cpp, зная о существовании starSystemInstance класса/типа, не знает о методах этого класса.
Ошибка компиляции
asteroid.cpp:133: error: invalid use of incomplete type ‘struct starSystemInstance’
effects.cpp:111: error: forward declaration of ‘struct starSystemInstance’
если я ставлю в asteroid.cpp
C++
1
#include "starsystem.cpp"
то у меня получается хаос(много ошибок).

Как решить проблему?

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

Дополнение:
пробовал с extern
C++
1
extern void starSystemInstance.addExplosion(float, float, int);
в начало файла asteroid.cpp, компиляция даёт
asteroid.cpp:4: error: expected initializer before ‘.’ token
погуглил, и вроде(если я правильно понял) пишут что extern не может быть применен к уровню функций-методов класса.

Сильно не ругайте(в C++ новичёк, пришёл с питона), гуглил и здался.

Зараннее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
28.04.2011, 04:35     Как скомпилировать два класса, которые используют методы друг друга #2
Попробуйте описания классов всунуть в *.h файлы, а методы - в *.cpp файлы (имена файлов без расширений должны быть одинаковыми).

Цитата Сообщение от diverlin Посмотреть сообщение
проблема в том что asteroid.cpp ...
Ставте в asteroid.cpp:
C++
1
#include "starsystem.h"
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.04.2011, 16:03     Как скомпилировать два класса, которые используют методы друг друга #3
Цитата Сообщение от diverlin Посмотреть сообщение
main.cpp файлики инкудятся в следующем порядке
Не стоит файлы реализации инклюдить.
diverlin
1 / 1 / 0
Регистрация: 27.04.2011
Сообщений: 7
28.04.2011, 23:30  [ТС]     Как скомпилировать два класса, которые используют методы друг друга #4
проблему решил, спасибо
Yandex
Объявления
28.04.2011, 23:30     Как скомпилировать два класса, которые используют методы друг друга
Ответ Создать тему
Опции темы

Текущее время: 19:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru