«QObject :: QObject» не может получить доступ к закрытому члену, объявленному в классе «QObject» - PullRequest
22 голосов
/ 18 августа 2010
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»?

Ответы [ 5 ]

28 голосов
/ 18 августа 2010

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

13 голосов
/ 18 августа 2010

Конструктор по умолчанию для 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 голосов
/ 18 августа 2010

Добавление конструктора копирования в класс CHIProjectData помогло.

3 голосов
/ 29 ноября 2012

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

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

myObject = MyObjectClass() 

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

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

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

1 голос
/ 25 июня 2015

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

struct myClass : public QObject {
   Q_OBJECT
   // everything here is private now...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...