Ответ 1
Добавление конструктора копии в класс CHIProjectData выполнило трюк.
class CHIProjectData : public QObject
{
public:
CHIProjectData();
CHIProjectData(QMap<QString,QString> aProjectData,
CHIAkmMetaData* apAkmMetaData = 0,
QObject* parent = 0);
private:
QMap <QString,QString> m_strProjectData;
CHIAkmMetaData* m_pAkmMetaData;
};
CHIProjectData::CHIProjectData(QMap<QString,QString> aProjectData,
CHIAkmMetaData* apAkmMetaData,
QObject* aParent)
:
QObject(aParent)
{
m_strProjectData = aProjectData;
m_pAkmMetaData = apAkmMetaData;
}
Почему он дает "QObject:: QObject" не может получить доступ к закрытому члену, объявленному в ошибке "QObject"?
Добавление конструктора копии в класс CHIProjectData выполнило трюк.
Я предполагаю, что ваш класс CHIProjectData
копируется где-то (используя созданный компилятором конструктор копирования или оператор присваивания). QObject
нельзя скопировать или назначить, чтобы вызвать ошибку. Тем не менее, у компилятора нет строки, указывающей на ошибку, поэтому он выбирает какую-либо строку в файле (окончательная скобка является общей, так как это когда компилятор знает, должен ли он генерировать эти функции или нет, после разбора объявления класса чтобы убедиться, что они уже существуют).
Конструктор по умолчанию для QObject
должен быть закрытым, а ошибка, которую вы получаете, скорее всего будет связана с CHIProjectData::CHIProjectData
(конструктор по умолчанию), неявно пытающийся вызвать конструктор по умолчанию базового класса. Если вы посмотрите QObject
, вы, скорее всего, обнаружите, что он определил что-то вроде этого:
class QObject {
QObject(); //private contructor, derived classes cannot call this constructor
public:
QObject(QObject* aParent);
};
Решение состоит в том, чтобы сделать конструктор по умолчанию QObject
защищенным или общедоступным или вызвать перегрузку другого конструктора из конструктора CHIProjectData
по умолчанию:
CHIProjectData::CHIProjectData() : QObject(NULL){
}
При использовании объектов подкласса QObject
пытайтесь манипулировать указателями.
принять проблемный сценарий
myObject = MyObjectClass()
в этом случае его более чистый, чтобы иметь
MyObjectClass *myObject;
//code
myObject = new MyObjectClass;
Это устранит необходимость копирования и назначения объектов путем использования копий ссылок и назначений.
В моем случае проблема заключалась в том, что макрос Q_OBJECT
молча вводит спецификатор private:
, даже внутри структуры:
struct myClass : public QObject {
Q_OBJECT
// everything here is private now...
}