c++ - programming - sdk qt
''QObject:: QObject'' no puede acceder al miembro privado declarado en la clase ''QObject'' (5)
Agregar un constructor de copia a la clase CHIProjectData hizo el truco.
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;
}
¿Por qué da el "QObject :: QObject ''no puede acceder al miembro privado declarado en la clase'' QObject ''" error?
Al usar los QObject
subclase QObject
intente manipular con punteros.
tomar el escenario problemático
myObject = MyObjectClass()
en este caso es más limpio tener
MyObjectClass *myObject;
//code
myObject = new MyObjectClass;
Esto eliminaría la necesidad de copiar y asignar objetos mediante el uso de copias y asignaciones de referencia.
El constructor predeterminado para QObject
debe ser privado y el error que está obteniendo es bastante probable que haga con CHIProjectData::CHIProjectData
(constructor predeterminado) implícitamente tratando de invocar el constructor predeterminado de la clase base. Si miras QObject
, lo más probable es que descubras que se define así:
class QObject {
QObject(); //private contructor, derived classes cannot call this constructor
public:
QObject(QObject* aParent);
};
La solución es hacer que el constructor de QObject
predeterminado sea protegido o público o llamar a otra sobrecarga de constructor desde el constructor de CHIProjectData
predeterminado:
CHIProjectData::CHIProjectData() : QObject(NULL){
}
En mi caso, el problema fue que la macro Q_OBJECT
introduce silenciosamente un private:
especificador, incluso dentro de una estructura:
struct myClass : public QObject {
Q_OBJECT
// everything here is private now...
}
Supongo que su clase CHIProjectData
se copiará en alguna parte (utilizando el constructor de copia generado por el compilador o el operador de asignación). QObject
no se puede copiar ni asignar a, por lo que podría causar un error. Sin embargo, el compilador no tiene ninguna línea para señalar el error, por lo que elige alguna línea en el archivo (la llave final es común, ya que es cuando el compilador sabe si debe generar esas funciones o no, después de analizar la declaración de clase para ver si ya existen).