Файл класса заголовка для использования другими - PullRequest
1 голос
/ 06 октября 2009

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

еще один вопрос о частных статических вещах Могу ли я объявить их в заголовочном файле и реализовать их в модуле .cpp? приватная переменная и публичный метод get Я пытался, но не смог реализовать метод на модуле, он работал только с объявлением и реализацией в заголовке

[] S, Джо

Ответы [ 5 ]

22 голосов
/ 06 октября 2009

Правильный способ справиться с этим - реализовать идиому pimpl: создать класс или структуру для всех личных данных и поместить указатель на такой объект в заголовочный файл вместе с предварительным объявлением. Теперь ничего из личных данных и методов не видно из заголовочного файла.

5 голосов
/ 06 октября 2009

Правильный ответ на это заключается в использовании Pimpl (через указатель , как указывает Павел). Есть также сумасшедший, но потенциально правильный способ, описанный в Imperfect C ++ Мэтью Уилсона, где вы можете заранее объявить внутреннюю структуру и включить непрозрачный блок памяти в ваш класс, а затем создать внутреннюю структуру на месте ( чье определение сделано в файле реализации) в конструкторе основного класса в файле реализации.

Я должен отметить, что Уилсон показывает это в приложении, где он признается в нескольких таких «преступлениях против программирования», как предостережение программистам, пытающимся быть слишком умными. Он говорит, и я говорю, что вы не должны использовать это. Тем не менее, если у вас есть некоторые первостепенные требования к производительности, то возможно , что это может быть полезно.

0 голосов
/ 06 октября 2009

Не могли бы вы объявить полное имя класса для пользователей, но поместить определение класса в файл .h, который включает в себя только public и private, затем в подкласс файла .cpp из public определения и определить только рядовые элементы?

Как это:

.h файл -

class useThis;   // users actually use this class

class publics {  //this is the interface they see
public:
    int foo;
};

.cpp файл -

#include "foo.h"

class useThis: publics {

private:
    void add(int b);

};

void useThis::add( int b )
{
    foo+= b;
}
0 голосов
/ 06 октября 2009

То же, что и код Джона, но вместо ссылок я использую указатель:

// file.h
class TheClass_p;
class TheClass{
  public: 
    TheClass();
    ~TheClass();
  private
    TheClass_p *d;

};

// file.cpp
class TheClass_p {
  int foo;
  float: bar;
};

TheClass::TheClass(){
   d = new TheClass_p;
}

TheClass::~TheClass(){
   delete d;
}

Редактировать: добавлен деструктор для устранения утечки памяти

0 голосов
/ 06 октября 2009

Андреас имеет ответ, но учтите, что это сделает ваш код несколько более тупым для вас:

 // header file

 struct hidden_structure;

 class Foo {
     hidden_structure* hidden_data;
 public:
     Foo();
     ~Foo();

     void doStuff();
 };

 // your cpp file

 struct hidden_structure;
     int stuff;
     hidden_structure() : stuff(0) {}
 }

 Foo::Foo() : hidden_data(new hidden_structure) {}
 Foo::~Foo() { delete hidden_data; }

 void Foo::doStuff() { hidden_data->stuff += 34; } // hey, it does a lot of stuff

Как видите, чем больше данных в скрытой структуре, тем сложнее это может стать.

...