Подтвердить что ты не робот

'QObject:: QObject' не может получить доступ к закрытому члену, объявленному в классе 'QObject'

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"?

4b9b3361

Ответ 1

Добавление конструктора копии в класс CHIProjectData выполнило трюк.

Ответ 2

Я предполагаю, что ваш класс CHIProjectData копируется где-то (используя созданный компилятором конструктор копирования или оператор присваивания). QObject нельзя скопировать или назначить, чтобы вызвать ошибку. Тем не менее, у компилятора нет строки, указывающей на ошибку, поэтому он выбирает какую-либо строку в файле (окончательная скобка является общей, так как это когда компилятор знает, должен ли он генерировать эти функции или нет, после разбора объявления класса чтобы убедиться, что они уже существуют).

Ответ 3

Конструктор по умолчанию для 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){
}

Ответ 4

При использовании объектов подкласса QObject пытайтесь манипулировать указателями.

принять проблемный сценарий

myObject = MyObjectClass() 

в этом случае его более чистый, чтобы иметь

MyObjectClass *myObject;
//code
myObject = new MyObjectClass;

Это устранит необходимость копирования и назначения объектов путем использования копий ссылок и назначений.

Ответ 5

В моем случае проблема заключалась в том, что макрос Q_OBJECT молча вводит спецификатор private:, даже внутри структуры:

struct myClass : public QObject {
   Q_OBJECT
   // everything here is private now...
}