2010-08-17 17 views
22
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é se da el " 'QObject :: QObject' no puede miembro privado de acceso declarado en la clase 'QObject'" error?'QObject :: QObject' no puede miembro privado de acceso declarado en la clase 'QObject'

+2

¿Qué causa el error? ¿Qué línea lo desencadena? –

+0

¿Y por qué no utilizar la lista de inicializadores para inicializar todos los miembros? – GManNickG

+0

@Charles: el error apunta a la última línea de la declaración de clase CHIProjectData. – Sulla

Respuesta

4

Agregando un constructor de copia a la clase CHIProjectData hizo el truco.

+4

Solo tenga en cuenta que no está copiando realmente la totalidad de CHIProjectData, a menos que esté trabajando mucho más en el constructor de copias para copiar las configuraciones de el padre QObject de la instancia original al padre QObject de la nueva instancia.Esto incluye cosas como conexiones de señal y ranura. –

13

El constructor predeterminado para QObject debe ser privado y el error que está teniendo es muy probable que lo haga con CHIProjectData::CHIProjectData (constructor predeterminado) implícitamente tratando de invocar el constructor predeterminado de la clase base. Si nos fijamos en QObject lo más probable es encontrar que es definido así:

class QObject { 
    QObject(); //private contructor, derived classes cannot call this constructor 
public: 
    QObject(QObject* aParent); 
}; 

La solución es hacer que por defecto QObject constructor protegido o público o llame otra sobrecarga del constructor del defecto CHIProjectData constructor:

CHIProjectData::CHIProjectData() : QObject(NULL){ 
} 
+0

O tiene 'aProjectData' de forma predeterminada en' QMap () ', por lo que obtiene un constructor predeterminado de forma gratuita. – GManNickG

+1

Buena teoría, pero el único constructor para 'QObject' es público,' QObject (QObject * parent = 0) '. Y cambiar la API de Qt no es realmente una opción. –

26

Supongo que su clase CHIProjectData se está copiando en algún lugar (utilizando el constructor de copia generado por el compilador o el operador de asignación). QObject no se puede copiar ni asignar, por lo que podría causar un error. Sin embargo, el compilador no tiene 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).

+2

Gracias, ese era exactamente mi problema, aunque la línea que copiaba el QObject estaba en otro archivo de código. (Y también estaba oculto en un 'myObject = MyObjectClass()'). –

3

Al usar objetos de la subclase QObject intente manipular con punteros.

tomar el escenario problemático

myObject = MyObjectClass() 

en este caso es más limpio para tener

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

Esto eliminaría la necesidad de copiar el objeto y las asignaciones mediante el uso de la copia de referencia y tareas.

1

En mi caso, el problema era que el Q_OBJECT macro silencio introduce un especificador private:, incluso dentro de una estructura:

struct myClass : public QObject { 
    Q_OBJECT 
    // everything here is private now... 
} 
Cuestiones relacionadas