views:

71

answers:

3
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;
}

Why does it give the "'QObject::QObject' cannot access private member declared in class 'QObject'" error?

+3  A: 

The default constructor for QObject must be private and the error you are getting is quite likely to do with CHIProjectData::CHIProjectData (default constructor) implicitly trying to invoke base class's default constructor. If you look at QObject you would most likely find that it's defined something like this:

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

The solution is to make default QObject constructor protected or public or call other constructor overload from the default CHIProjectData constructor:

CHIProjectData::CHIProjectData() : QObject(NULL){
}
Igor Zevaka
Or have `aProjectData` default to `QMap<QString,QString>()`, so you get a default constructor for free.
GMan
Good theory, but the only constructor for `QObject` is public, `QObject(QObject* parent=0)`. And changing Qt's API isn't really an option.
Mike Seymour
+2  A: 

I'm guessing that your CHIProjectData class is being copied somewhere (using the compiler-generated copy constructor or assignment operator). QObject cannot be copied or assigned to, so that would cause an error. However, the compiler has no line to point to for the error, so it chooses some line in the file (the final brace is common, since that is when the compiler knows if it should generate those functions or not, after parsing the class declaration to see if they already exist).

Caleb Huitt - cjhuitt
A: 

Adding a copy constructor to CHIProjectData class did the trick. thanks all.

Arun
Just be aware that you're not truly copying the entirety of CHIProjectData, unless you are doing a bunch more work in the copy constructor to copy settings from the original instance's QObject parent to the new instance's QObject parent. This includes things like signal and slot connections.
Caleb Huitt - cjhuitt