Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отделение интерфейса от реализации 
V
    Опции темы
GoldFinch
Дата 24.6.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



есть ли способ в объявлении класса в .h написать только public и protected части, и не писать private часть?
ато надоели такие ситуации:

Код

// Foo.h
#include "Bar.h" /* Bar */
class Foo
{
...
private:
 Bar bar;  // или Bar& bar; или  Bar* bar;
}


при этом Bar.h используется только в Foo.h, а Foo.h используется везде, и при изменении Bar.h перекомпилируются все .сpp
а хотелось бы инклудить Bar.h только в Foo.cpp

----------
можно сделать все методы Foo виртуальными, но есть подозрение что это неэффективо, изза наличия ВМТ в классе и вызовов через ВМТ 

можно написать 
Код

// Foo.h
class Bar;
template<typename Bar_t = Bar>
class Foo
{
public:
   Foo();
...
private:
 Bar_t bar;  // или Bar& bar; или  Bar* bar;
}
// Foo.cpp

template<> 
Foo<Bar>()
{
    ...
}

но это надо везде писать Foo<Bar>, да и Bar может быть не один

Это сообщение отредактировал(а) GoldFinch - 24.6.2009, 20:17
PM MAIL ICQ   Вверх
mes
Дата 24.6.2009, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Код

// Foo.h
class Bar;
class Foo
{
public:
  Foo();
...
private:
  Bar* bar;
};

// Foo.cpp
#include "Bar.h" /* Bar */

Foo::Foo() : bar(new Bar) {}


Это сообщение отредактировал(а) mes - 24.6.2009, 20:25


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 24.6.2009, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



mes, а если Bar размером 4 байта? например это обертка для (хендла) сокета, файла
както не хочется часто по 4 байта в хипе выделять
PM MAIL ICQ   Вверх
mes
Дата 24.6.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(GoldFinch @  24.6.2009,  19:48 Найти цитируемый пост)
както не хочется часто по 4 байта в хипе выделять

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

Но может проблема не с Foo, а с Bar ? что в нем такого, что он так часто перекомпилируем ? 

Как вариант, на момент установления его интерфейса, включать bar в состав класса через указатель,
а как все отестируете и приведете в порядок, включить напрямую. 




--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 24.6.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Цитата(mes @  24.6.2009,  22:33 Найти цитируемый пост)
Как вариант, на момент установления его интерфейса, включать bar в состав класса через указатель,
а как все отестируете и приведете в порядок, включить напрямую. 

а вот это хорошее решение, спасибо
PM MAIL ICQ   Вверх
maxim1000
Дата 24.6.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



если полей в самом Foo несколько, то, возможно, подойдёт PImpl - всех их собираем во внутреннюю структуру и в Foo кидаем указатель на неё, тогда при достаточном количестве полей, "упаковываемых" во внутреннюю структуру жаба может отступить smile
что-то типа такого:
Код

Foo.h:
class Foo
{
...
private:
    struct Impl;
    Impl *impl;
};

Foo.cpp:
#include "Bar.h"
struct Foo::Impl
{
    Bar bar1,bar2,bar3;
    int x,y,z;
};




--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.