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

Структура проекта - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
gulejop
0 / 0 / 0
Регистрация: 25.07.2013
Сообщений: 10
18.08.2013, 02:12     Структура проекта #1
Приветствую всех!
В общем интересует меня вот что: структура проектов с большим количеством файлов.
Обычно у меня один класс - один хедер и один или несколько cpp. Но когда проект разрастается, начинаются проблемы. Все усложняет огромное количество инклудов, хедеров и cpp. Приходится шаманить с pragma once, предварительными объявлениями, указателями на классы, экстернами и прочей ерундой.
Для связей между частями модульной структуры, меня одно время устраивал общий хедер куда инклудятся все другие хедеры проекта. К примеру:
C++
1
2
3
4
//file "common.h"
#include "class1.h"
#include "class2.h"
#include "class3.h"
C++
1
2
//file "class1.h"
#include "common.h"
C++
1
2
//file "class2.h"
#include "common.h"
C++
1
2
//file "class3.h"
#include "common.h"
Кто как делает, как лучше и правильней организовывать структуру крупного проекта?
Как составляется структура папок и файлов исходников?
Как правильно разместить класс в файлах (например, объявление class MyClass в .h, реализация MyClass::Method() в .cpp)?
Как что куда правильнее инклудить и т.д? Например де-то слышал, что нельзя инклудить хедер в хедер и т.д.

Ковырял исходники каких-то движков, чтобы посмотреть как это устроено там, но честно говоря, мало чем помогло...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.08.2013, 07:49     Структура проекта #2
Цитата Сообщение от gulejop Посмотреть сообщение
Но когда проект разрастается, начинаются проблемы.
Какие конкретно? Из поста не ясно в чем проблема.
Цитата Сообщение от gulejop Посмотреть сообщение
Приходится шаманить с pragma once
Разве это шаманство? В каждом заголовочном файле должны быть include guards или pragma once. На этом все "шманство" и заканчивается.
Цитата Сообщение от gulejop Посмотреть сообщение
предварительными объявлениями
Нет в них ничего страшного.
Цитата Сообщение от gulejop Посмотреть сообщение
указателями на классы
Кэп-mode: указатели должны быть там, где должны быть указатели. Т.е. заниматься костылевтыканием и бездумно делать указатели "лишь бы хоть как-нибудь собралось" - странно.
Цитата Сообщение от gulejop Посмотреть сообщение
экстернами
А экстерны зачем? Наплодил глобальных переменных? Если так, то серьезный повод задуматься над тем, чтобы выкосить их нафиг.
Цитата Сообщение от gulejop Посмотреть сообщение
меня одно время устраивал общий хедер куда инклудятся все другие хедеры проекта
И небольшое изменение одном из заголовочных файлов стабильно ведет к пересборке всего проекта.
Цитата Сообщение от gulejop Посмотреть сообщение
Как составляется структура папок и файлов исходников?
В общем случае использую структуру:
Код
.
|-Bin
|-Build
|-Lib
`-Projects
    |-ProjectName1
    |   |-src
    |   |-tests
    |   `PublicHeader1.h
    `-ProjectName2
Цитата Сообщение от gulejop Посмотреть сообщение
Как правильно разместить класс в файлах (например, объявление class MyClass в .h, реализация MyClass::Method() в .cpp)?
Так и размещать. Исключение - шаблоны.
Цитата Сообщение от gulejop Посмотреть сообщение
Как что куда правильнее инклудить и т.д?
Подключать заголовочный файл нужно только там, где он действительно необходим. Где можно обойтись предварительным объявлением - его и использовать.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//! @file MyClass.h
#pragma once
 
#include "Base.h"
#include "Bar.h"
 
class Foo;
 
// Наследование - необходимо подключить Base.h
class MyClass : public Base
{
public:
    MyClass();
    ~MyClass();
 
public: // Base
    virtual void f();
 
private:
    Foo* foo_; // указатель. Достаточно предварительного объявления.
    Bar bar_; // необходимо подключить Bar.h
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//! @file MyClass.cpp
 
#include "MyClass.h"
 
#include "Foo.h"
 
MyClass::MyClass()
: foo_{new Foo()}
{ }
 
MyClass::~MyClass()
{
    delete foo_;
}
 
void MyClass::f()
{
    foo_->g(); // используется метод класса Foo, необходимо подключить Foo.h
}
gulejop
0 / 0 / 0
Регистрация: 25.07.2013
Сообщений: 10
18.08.2013, 11:17  [ТС]     Структура проекта #3
Спасибо за ответ!
Я говорю про довольно сложные иерархичные архитектуры классов. Вот например как в этом видео:
http://www.youtube.com/watch?v=V1MHyn4YOWE Можно сразу перемотать на 13:40 там понятно о чем речь.
Где можно почитать про тонкости реализации архитектур такого рода?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.08.2013, 11:25     Структура проекта #4
Посмотрел пару минут видео... Не понял проблемы.
Ну свалили они все классы в один. Чтобы не светить все кишки, добавили интерфейс и навернули фабрику (http://ru.wikipedia.org/wiki/%D0%A4%...BD%D0%B8%D1%8F).

Т.е. вопросы проектирования архитектуры - это одно, а организация файлов в проекте - это другое. Если интересуют паттерны, можно почитать GoF, например...
gulejop
0 / 0 / 0
Регистрация: 25.07.2013
Сообщений: 10
18.08.2013, 18:57  [ТС]     Структура проекта #5
Цитата Сообщение от 0x10 Посмотреть сообщение
Посмотрел пару минут видео... Не понял проблемы.
Ну свалили они все классы в один. Чтобы не светить все кишки, добавили интерфейс и навернули фабрику (http://ru.wikipedia.org/wiki/%D0%A4%...BD%D0%B8%D1%8F).

Т.е. вопросы проектирования архитектуры - это одно, а организация файлов в проекте - это другое. Если интересуют паттерны, можно почитать GoF, например...
Это понятно, что проектирование архитектуры и организация файлов разные вещи. Просто интересуют именно технические нюансы воплощения этой архитектуры в жизнь. Для меня оказывается проблемой то, что созданная система работает и выполняет свои функции как положено, но глядя на все исходники проекта меня одолевает мысль что все криво и не как надо.
С паттернами хотел ознакомиться в ближайшее время. GoF имеется ввиду Гамма и др.?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.08.2013, 20:26     Структура проекта #6
Цитата Сообщение от gulejop Посмотреть сообщение
глядя на все исходники проекта меня одолевает мысль что все криво и не как надо
Абстрактные советы тут дать сложно, нужны конкретные примеры.

Цитата Сообщение от gulejop Посмотреть сообщение
С паттернами хотел ознакомиться в ближайшее время. GoF имеется ввиду Гамма и др.?
Да.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
19.08.2013, 14:40     Структура проекта #7
Так и размещать. Исключение - шаблоны.
Т. е. реализацию шаблонов тоже хранить в хедере?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
19.08.2013, 14:49     Структура проекта #8
Цитата Сообщение от kvadro Посмотреть сообщение
Т. е. реализацию шаблонов тоже хранить в хедере?
ага. Либо инклудить в заголовок
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.08.2013, 15:04     Структура проекта #9
gulejop, могу посоветовать почитать Large-Scale C++ Software Design. Книга, правда, старенькая, но принять многие моменты к сведению все равно можно. Также познавательно будет посмотреть на организацию крупных open-source проектов.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
19.08.2013, 15:07     Структура проекта #10
ага. Либо инклудить в заголовок
А как использовать тогда extern template?

Я просто думал нужно писать так:

C++
1
2
3
4
5
6
7
8
9
// test.h
template< typename T >
class Foo
{
    T f();
};
 
// explicit instantiation
extern template class Foo< int >;
C++
1
2
3
4
5
6
7
8
// test.cpp
template< typename T >
void Foo< T >::f()
{
    // ...
}
 
template class Foo< int >;
C++
1
2
3
4
5
6
7
8
// main
#include "test.h"
 
int main()
{
    Foo< int > foo;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2013, 15:13     Структура проекта
Еще ссылки по теме:

как в решение из двух проектов из второго проекта обращаться к функциям из первого проекта C++
C++ Структура DateTime, битовая структура
C++ Структура «База», сущности «Универсам» и «Продукты», структура «Товар»

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.08.2013, 15:13     Структура проекта #11
Цитата Сообщение от kvadro Посмотреть сообщение
А как использовать тогда extern template?
extern template не реализован в подавляющем большинстве компиляторов. В стандарте С++11 от этой фичи вообще отказались. Поэтому правильным ответом на Ваш вопрос будет "лучше этим не пользоваться вообще".
Yandex
Объявления
19.08.2013, 15:13     Структура проекта
Ответ Создать тему
Опции темы

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