документация Qt предлагает использовать QSharedDataPointer с видимой реализацией его низшее нетипично.
Итак, в соответствии с небольшим примером, вырезанным из документации, я придумал следующий источник (SSCCE).
Интерфейс: Model.h
Интерфейс прост, просто предварительное объявление частного класса и класса дескриптора с объявленными copy-ctor и d-tor:
#include <QtCore/QSharedDataPointer>
class ModelPrivate;
class Model {
public:
Model();
Model(const Model &other);
~Model();
QSharedDataPointer<ModelPrivate> d;
};
Частный заголовок: Model_p.h
Просто объявляет и определяет низший класс.
#include <QSharedData>
class ModelPrivate:
public QSharedData {
public:
};
Реализация: Model.cc
Состоит из реализации c-tors/d-tor, взятой из документации.
#include "Model.h"
#include "Model_p.h"
class ModelPrivate:
public QSharedData {
};
Model::Model():
d(new ModelPrivate()) {
}
Model::Model(const Model &other):
d(other.d) {
}
Model::~Model() {
}
Вариант использования: main.cc
Где все провалилось.
#include <QString>
#include "Model.h"
int main(int argc, char *argv[]) {
QString s1, s2;
s2 = s1;
Model m1, m2;
m2 = m1;
}
Всего два экземпляра и присваивание, как и для любого другого общего класса. Однако он терпит неудачу из-за
invalid use of incomplete type 'class ModelPrivate'
Я не могу понять, как заставить это работать ожидаемым образом в соответствии с документацией, то есть без полного объявления частного класса в заголовке. Я знаю, что это работает, но я хотел бы понять документы. Пример назначения общих классов также включен в документы. Из документов, указанных выше:
Конструктор копирования здесь строго не требуется, поскольку класс EmployeeData включен в тот же файл, что и класс Employee (employee.h). Однако включение частного подкласса QSharedData в тот же файл, что и общедоступный класс, содержащий QSharedDataPointer, не является типичным. Обычно идея состоит в том, чтобы скрыть частный подкласс QSharedData от пользователя, поместив его в отдельный файл, который не будет включен в общедоступный файл. В этом случае мы обычно помещаем класс EmployeeData в отдельный файл, который не включается в employee.h. Вместо этого мы бы просто предварительно объявили частный подкласс EmployeeData в файле employee.h следующим образом:
Я предполагаю, что компиляция завершается ошибкой в operator=
, который используется при назначении Model
.
operator=
для своего класса, вместо того, чтобы позволить компилятору сгенерировать его? - person peppe   schedule 27.12.2014