PDA

View Full Version : [RESOLVED] Help in using private classes



kuzulis
25th August 2009, 06:48
I make as it is written here: http://techbase.kde.org/Policies/Library_Code_Policy/Shared_D-Pointer_Example

mybaseclass.h


#ifndef MYBASECLASS_H
#define MYBASECLASS_H

#include <QObject>

class MyBasePrivateClass;
class MyBaseClass : public QObject
{
Q_OBJECT
public:
MyBaseClass(QObject *parent = 0);
virtual ~MyBaseClass();
void setParam(int val);
int param() const;
protected:
MyBasePrivateClass * const d_ptr;
//MyBaseClass(MyBasePrivateClass &dd, QObject *parent);
private:
Q_DECLARE_PRIVATE(MyBaseClass)
Q_DISABLE_COPY(MyBaseClass)
};

#endif


mybaseclass.cpp


#include "mybaseclass.h"


class MyBasePrivateClass
{
Q_DECLARE_PUBLIC(MyBaseClass)
public:
MyBasePrivateClass() { m_param = 0; }
virtual ~MyBasePrivateClass() {}
int m_param;
MyBaseClass *q_ptr;
};


MyBaseClass::MyBaseClass(QObject *parent)
: QObject(parent), d_ptr(new MyBasePrivateClass)
{
// Q_D(MyBaseClass);
}

MyBaseClass::~MyBaseClass()
{
delete d_ptr;
}

void MyBaseClass::setParam(int val)
{
Q_D(MyBaseClass);
d->m_param = val;
}

int MyBaseClass::param() const
{
Q_D(const MyBaseClass);
return d->m_param;
}


in console written :


D:\projects\Private_test\src>make
g++ -c -O2 -frtti -fexceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DQT_CORE_LIB -D
QT_THREAD_SUPPORT -I"D:/Qt/4.1.1/include/QtCore" -I"D:/Qt/4.1.1/include" -I"D:/Qt/4.1.1/include/Acti
veQt" -I"build\moc" -I"." -I"D:/Qt/4.1.1/mkspecs/win32-g++" -o build\obj\mybaseclass.o mybaseclass.c
pp
In file included from mybaseclass.cpp:1:
mybaseclass.h:19: error: ISO C++ forbids declaration of `MyBaseClassPrivate' with no type
mybaseclass.h:19: error: `MyBaseClassPrivate' declared as an `inline' field
mybaseclass.h:19: error: expected `;' before '*' token
mybaseclass.h:19: error: expected `;' before "inline"
mybaseclass.h:19: error: ISO C++ forbids declaration of `MyBaseClassPrivate' with no type
mybaseclass.h:19: error: `MyBaseClassPrivate' declared as an `inline' field
mybaseclass.h:19: error: expected `;' before '*' token
mybaseclass.h:19: error: expected `;' before "friend"
D:/Qt/4.1.1/include/QtCore/../../src/corelib/kernel/qobject.h: In member function `void MyBaseClass:
:setParam(int)':
D:/Qt/4.1.1/include/QtCore/../../src/corelib/kernel/qobject.h:99: error: `QObjectPrivate* QObject::d
_func()' is private
mybaseclass.cpp:28: error: within this context
mybaseclass.cpp:28: error: cannot convert `QObjectPrivate*' to `MyBaseClassPrivate* const' in initia
lization
mybaseclass.cpp:29: error: invalid use of undefined type `struct MyBaseClassPrivate'
mybaseclass.h:19: error: forward declaration of `struct MyBaseClassPrivate'
D:/Qt/4.1.1/include/QtCore/../../src/corelib/kernel/qobject.h: In member function `int MyBaseClass::
param() const':
D:/Qt/4.1.1/include/QtCore/../../src/corelib/kernel/qobject.h:99: error: `const QObjectPrivate* QObj
ect::d_func() const' is private
mybaseclass.cpp:34: error: within this context
mybaseclass.cpp:34: error: cannot convert `const QObjectPrivate*' to `const MyBaseClassPrivate* cons
t' in initialization
mybaseclass.cpp:35: error: invalid use of undefined type `const struct MyBaseClassPrivate'
mybaseclass.h:19: error: forward declaration of `const struct MyBaseClassPrivate'
mingw32-make: *** [build\obj\mybaseclass.o] Error 1


Help Please :( Already 2 days tormented

PS: Attach project

franz
25th August 2009, 06:56
Use QSharedDataPointer. You achieve the same thing, only it saves you the headache ;).

kuzulis
25th August 2009, 07:09
nonono! I want it private classes!

franz
25th August 2009, 07:17
nonono! I want it private classes!

OK, then you need to solve your errors. To start with, name your private class MyBaseClassPrivate instead of MyBasePrivateClass.

kuzulis
25th August 2009, 07:22
and whence came MyBaseClassPrivate? o_O

kuzulis
25th August 2009, 07:31
аааааа!!!
It is necessary to change the name of the class! :D :D

Thank you very much! Question resolved!

kuzulis
27th August 2009, 12:51
No working this test project, write in console:



build\obj\mybaseclass.o(.text+0x0):mybaseclass.cpp : multiple definition of `MyBaseClass::MyBaseClass
(QObject*)'
build\obj\mybaseclass.o(.text+0x0):mybaseclass.cpp : first defined here
build\obj\mybaseclass.o(.text+0xd0):mybaseclass.cp p: multiple definition of `MyBaseClass::MyBaseClas
s(QObject*)'
build\obj\mybaseclass.o(.text+0xd0):mybaseclass.cp p: first defined here
build\obj\mybaseclass.o(.text+0x1a0):mybaseclass.c pp: multiple definition of `MyBaseClass::MyBaseCla
ss(MyBaseClassPrivate&, QObject*)'
build\obj\mybaseclass.o(.text+0x1a0):mybaseclass.c pp: first defined here
build\obj\mybaseclass.o(.text+0x1d0):mybaseclass.c pp: multiple definition of `MyBaseClass::MyBaseCla
ss(MyBaseClassPrivate&, QObject*)'
build\obj\mybaseclass.o(.text+0x1d0):mybaseclass.c pp: first defined here
build\obj\mybaseclass.o(.text+0x200):mybaseclass.c pp: multiple definition of `MyBaseClass::~MyBaseCl
ass()'
build\obj\mybaseclass.o(.text+0x200):mybaseclass.c pp: first defined here
build\obj\mybaseclass.o(.text+0x2c0):mybaseclass.c pp: multiple definition of `MyBaseClass::~MyBaseCl
ass()'
build\obj\mybaseclass.o(.text+0x2c0):mybaseclass.c pp: first defined here
build\obj\mybaseclass.o(.text+0x380):mybaseclass.c pp: multiple definition of `MyBaseClass::~MyBaseCl
ass()'
build\obj\mybaseclass.o(.text+0x380):mybaseclass.c pp: first defined here
build\obj\mybaseclass.o(.text+0x450):mybaseclass.c pp: multiple definition of `MyBaseClass::setParam(
int)'
build\obj\mybaseclass.o(.text+0x450):mybaseclass.c pp: first defined here
build\obj\mybaseclass.o(.text+0x470):mybaseclass.c pp: multiple definition of `MyBaseClass::param() c
onst'
build\obj\mybaseclass.o(.text+0x470):mybaseclass.c pp: first defined here
build\obj\main.o(.text+0x8d):main.cpp: undefined reference to `MyClass::MyClass(QObject*)'
collect2: ld returned 1 exit status
mingw32-make: *** [release\testprivate.exe] Error 1


Heelp mee! :(

PS: attach arc

spirit
27th August 2009, 13:07
comment these lines


//MyClass::MyClass(MyClassPrivate &dd, QObject *parent)
// : MyBaseClass(dd, parent)
//{
//}

kuzulis
27th August 2009, 14:03
comment these lines


//MyClass::MyClass(MyClassPrivate &dd, QObject *parent)
// : MyBaseClass(dd, parent)
//{
//}


no, The problem was:


src.pro:
- SOURCES = mybaseclass.cpp mybaseclass.cpp main.cpp
+ SOURCES = mybaseclass.cpp myclass.cpp main.cpp

myclass.h:
protected:
- MyClass(MyClass &dd, QObject *parent);
+ MyClass(MyClassPrivate &dd, QObject *parent);



:)