Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Glavak
5 / 5 / 1
Регистрация: 22.01.2013
Сообщений: 32
1

Forward declaration и рекурсивный include

22.09.2014, 16:12. Просмотров 632. Ответов 6
Метки нет (Все метки)

В обоих классах нужно использовать поля друг друга, при таком подходе:
C++
1
2
3
4
5
6
7
8
9
//Ship.h
 
#include "Player.h"//Player.h - наследуется от GameObject
 
class Ship
{
public:
    GameObject *go;
}
C++
1
2
3
4
5
6
7
8
9
10
//GameObject.h
 
#include "Ship.h"
 
class GameObject
{
public:
    Ship *ship;
    void Draw();//Использует поля класса this->ship->...
}
Появляется рекурсивный include.
Если же заменить
C++
1
#include "Ship.h"
на
C++
1
class Ship;
то невозможно обращаться к полям ship'a, "использование неопределённого типа".
Сделать forward declaration GameObject'a в Ship.h нельзя, так как Player наследуется от GameObject'a, а Player'a нельзя потому что тоже надо использовать его методы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2014, 16:12
Ответы с готовыми решениями:

Forward declaration
Привет! Есть два класса, один создаёт другой и передаёт в него ссылку на...

Forward declaration
#ifndef __PROGTEST__ #include много инклудов using namespace std; #endif /*...

Precompiled headers, STL forward declaration
Та да :) Хотел уточнить кое - чего по прекомпайлам. Вот есть у меня файл...

Рекурсивный include, как грамотней сделать?
Привет! Что - то я совсем онубел :D Есть два класса, вот их хэдэры: ...

Работа с файлами в C# с исп. библиотек #include <stdio.h> #include <stdlib.h> #include <math.h> #include <io.h>
В типизированном файле записаны названия городов и их численность. Увеличить...

6
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.09.2014, 16:46 2
в хедере предварительная декларация, в сишнике нормальный инклюд этого класса. Должно работать.
1
Glavak
5 / 5 / 1
Регистрация: 22.01.2013
Сообщений: 32
22.09.2014, 17:58  [ТС] 3
Помогло, хотя вроде include'ы в сишниках это плохо, но как по другому не знаю
0
DrOffset
22.09.2014, 18:12
  #4

Не по теме:

Цитата Сообщение от Glavak Посмотреть сообщение
Помогло, хотя вроде include'ы в сишниках это плохо, но как по другому не знаю
Почему плохо-то? :)

0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.09.2014, 18:30 5
Цитата Сообщение от Glavak Посмотреть сообщение
include'ы в сишниках это плохо
Почти любой сишник будет содержать инклюд
0
Glavak
5 / 5 / 1
Регистрация: 22.01.2013
Сообщений: 32
22.09.2014, 18:59  [ТС] 6
Я, гугля решение проблемы, читал статью, и там написано что зависимости класса должны находиться в header'e, что в общем то логично.
Хотя если для того что в хедере не нужен этот include, то наверное не плохо
0
DrOffset
8466 / 4743 / 1161
Регистрация: 30.01.2014
Сообщений: 7,730
22.09.2014, 19:19 7
Цитата Сообщение от Glavak Посмотреть сообщение
Я, гугля решение проблемы, читал статью, и там написано что зависимости класса должны находиться в header'e, что в общем то логично.
Только как получилось, что фраза:
Ideally, the dependencies for the class should be layed out in the header.
стала означать, что include в cpp - это плохо? Фраза эта логична и правильна, а вот твой вывод из нее - нет.

Причем ниже идет разбор данной ситуации (в теме) и написано вот что:
This shows the two different kinds of dependencies and how to handle them. Because MyClass only uses a pointer to Foo and not a full Foo object, we can forward declare Foo, and don't need to #include "foo.h". You should always forward declare what you can -- don't #include unless it's necessary. Unnecessary #includes can lead to trouble.
0
22.09.2014, 19:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2014, 19:19

#include<iostream>// подключение библиотек #include <conio.h> #include <climits>
помогите для этой программы сделать блок-схему. Пожалуйста ...

Чем отличается #include <cstring>, #include <string> и #include <string.h>?
Доброго времени суток :) Пишу свой класс и мне для нужны функции для работы со...

ошибка в лабе не находит #include<iomanip.h> #include<conio.h>
Само задание: Услуги телефонной сети оплачиваются по следующему правилу: за...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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