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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
diverlin
1 / 1 / 0
Регистрация: 27.04.2011
Сообщений: 7
#1

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

28.04.2011, 00:28. Просмотров 859. Ответов 3
Метки нет (Все метки)

Доброго времени суток.

имеется 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++ новичёк, пришёл с питона), гуглил и здался.

Зараннее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2011, 00:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как скомпилировать два класса, которые используют методы друг друга (C++):

Два класса, вызывающие друг друга - C++
У меня есть файл class1.h и файл class2.h внутри класса 1 вызывается класс 2 и наоборот. Но, класс 1 располагается выше и не видит...

Два класса, требующих друг друга - C++
Существует два класса, обзовём их MyClassA и MyClassB. Возникла такая вот ситуация: у класса MyClassA есть поле типа vector&lt;MyClassB*&gt;...

Раздельная компиляция: как быть, если код не компилируется, так как два файла подключают друг друга? - C++
Доброго времени суток. У меня есть какой-нибудь x.h: #include &quot;y.h&quot; class A { vector&lt;B*&gt; v; } и y.h:

Расставить 8 ферзей на шахматной доске 8 на 8, которые не бьют друг друга - C++
Нужно написать программу которая расставляет на шахматной доске 8 ферзей, которые не бьют друг друга. обязательно использование рекурсии,...

Найти N первых пар простых чисел, которые отличались бы друг от друга на 2 - C++
Не могу понять, почему не делается проверка числа на простоту. #include &quot;StdAfx.h&quot; #include &lt;iostream&gt; #include &lt;cmath&gt; using...

Задаются два двузначных числа. Определить, являются ли они зеркальным отображение друг друга - C++
Можете решить эту простую задачу. И объяснить как вы ее решили. Задача должна решаться так, я ввожу два числа и программа сравнивает их на...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
28.04.2011, 04:35 #2
Попробуйте описания классов всунуть в *.h файлы, а методы - в *.cpp файлы (имена файлов без расширений должны быть одинаковыми).

Цитата Сообщение от diverlin Посмотреть сообщение
проблема в том что asteroid.cpp ...
Ставте в asteroid.cpp:
C++
1
#include "starsystem.h"
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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
проблему решил, спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2011, 23:30
Привет! Вот еще темы с ответами:

Рекурсия: найти число расстановок N ладей, которые симметричны относительно диагоналей и не бьют друг друга - C++
Вычислить рекурсивно число расстановок N ладей на доске N*N таких, что ладьи симметричны относительно обеих диагоналей и не бьют друг...

Как позволить функциями видеть друг друга? - C++
Есть 2 функции вне main, которые должны быть способны вызывать друг друга. Как расширить видимость?

Как перемножить элементы в двумерном массиве друг на друга? - C++
Как перемножить элементы в двумерном массиве друг на друга? Размерность 5 на 2, если нужно.

Определить, как расположены треугольники относительно друг друга - C++
Заданы два треугольника координатами своих вершин (х1-6;у1-6), определить, как расположены они друг относительно друга: один внутри...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.04.2011, 23:30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru