0

Появилась небольшая сложность при разделении классов на несколько файлов. В .h указываю класс с прототипами и в соответствующем .cpp инициализирую методы и объекты. Имеется класс app, который использует все остальные классы, но тем не менее в этих используемых классах нужно обращаться к объектам текущего экземпляра класса app.

Делаю следующим образом: в app.h объявил класс с прототипами, в нем есть объявление экземпляров классов
material, control, objects.

Перед этим объявил, как бы не ошибиться в выражении, прототипы классов (чтобы на последлующем этапе .h не инклюдили сами себя через app.h).

class material;
class control;
class objects;

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

В app.cpp инклюдятся все .h, и в нем при инициализации каждого класса я передаю в них ссылку на текущий экземпляр app.

Является ли такой способ оптимальным? Особенно если речь идет о усложнении структуры приложения.

6
  • А что такое > класс с прототипами > прототипы классов ? Это же не javascript.
    – atwice
    1 мар 2015 в 18:41
  • имеются в виду прототипы методов, которые есть в классах
    – Ni55aN
    4 мар 2015 в 8:29
  • В C++ это называется объявлением методов.
    – atwice
    4 мар 2015 в 8:55
  • Объявление - это общее понятие, где указывается тело функции. Прототип - без тела функции
    – Ni55aN
    4 мар 2015 в 21:15
  • Нет. Функция с телом - это определение функции. Объявление - это другое. Прототипами методы в C++ никто не называет.
    – atwice
    4 мар 2015 в 22:04

1 ответ 1

2

1) Почитайте про ifdef-guard или используйте #pragma once, если эта инструкция поддерживается Вашим компилятором. Это позволяет не думать о рекурсивных зависимостях при включении файлов.

2) Файлы .cpp в больших проектах включают в указанном порядке:

3) В файлы .h стараются писать как можно меньше #include'ов. Желательно обходиться объявлениями, как в вопросе:

    class material;
    // ...

#include приходится писать для классов, которые Ваш класс наследует или размещает по значению, а также для классов, которые передаются по значению как аргумент функции. Во всех этих случаях компилятору нужно знать размер объекта. Forward-declaration будет мало.

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.