C ++ pimpl идиома и статический метод и поля - PullRequest
0 голосов
/ 28 марта 2011

Хотелось бы лучше понять, как использовать статическое поле методом при наличии идиомы PIMPL. Рассмотрим следующий код.

Файл MyClass.h:

#ifndef MYCLASS
#define MYCLASS

class MyClass{
     public:
     void method();
     static void static_method();

     private:
     Type field;
     static Type *static_field;
}

#endif

Файл MyClass.cpp:

#include MyClass.h

void MyClass::method(){
     /*OK method definition*/
     field = new Type();   /*OK field construction*/
}

void MyClass::static_method(){
     /*NOT WORKING method declaraion */
     static_field = new Type();   /*not working */
}

У меня есть 2 ошибки:

  1. не может объявить функцию-член static_method для статической связи
  2. static_field не было объявлено в этой области

Я не очень знаком с идиомой прыщей.

Таким образом, мой вопрос заключается в том, как получить статические методы и объявления полей для соблюдения идиомы PIMPL и успешной компиляции?

Что я делаю не так в этом коде?

Как мне изменить свой код?

Ответы [ 3 ]

2 голосов
/ 28 марта 2011

Цель pimpl - устранить зависимости компиляции. Тот факт, что класс pimpl имеет закрытый статический член, является деталью реализации и поэтому не должен быть в заголовочном файле или в определении класса pimpl.

Поместите вашу частную статистику в файл .cc / .cpp в безымянном пространстве имен вместе с определениями функций-членов класса pimpl.

1 голос
/ 28 марта 2011

Действительно, вам нужно иметь определение

Type* MyClass::static_field = new Type();

в файле u'r cpp. это потому, что таким образом вы указываете компилятору, в каком объектном файле нужно создать экземпляр поля, иначе компилятор не сможет узнать.

1 голос
/ 28 марта 2011
  • Покажите нам фактический код, который вы подтвердили, выдает ту же ошибку
  • Не помещайте static перед определением функции в файле .cpp
  • Вы не 'static_field - у вас есть два field
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...