web-dev-qa-db-ja.com

'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'で宣言されたプライベートメンバーにアクセスできません」というエラーが表示されるのはなぜですか?

22
Sulla

コピーコンストラクターをCHIProjectDataクラスに追加することでうまくいきました。

4
Sulla

CHIProjectDataクラスがどこかにコピーされていると思います(コンパイラーが生成したコピーコンストラクターまたは代入演算子を使用)。 QObjectをコピーまたは割り当てることができないため、エラーが発生します。ただし、コンパイラにはエラーを指す行がないため、ファイル内の行を選択します(クラス宣言を解析した後、コンパイラがこれらの関数を生成するかどうかを判断するため、最後の中括弧が一般的です。それらがすでに存在するかどうかを確認します)。

28

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){
}
13
Igor Zevaka

QObjectサブクラスオブジェクトを使用する場合は、ポインタを使用して操作してみてください。

問題のあるシナリオを取る

myObject = MyObjectClass() 

この場合、持っている方がきれいです

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

これにより、参照のコピーと割り当てを使用して、オブジェクトのコピーと割り当ての必要がなくなります。

3
Isira

私の場合、問題は、Q_OBJECTマクロが構造体内であってもprivate:指定子をサイレントに導入することでした。

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