utilizar programming programaciĆ³n funciones full como c++ qt inheritance qt4

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