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...
}