Hi,
I was trying out the pimpl idiom and its implementation in Qt.
I was wondering why the following code gives me an error in the data_pointer_test function. the error happens in both the static and the dynamic cast.
AFAIK, static cast should be able perform a downcast. as the following code does not give me any error
PrivateData *d = new QstObjectPrivate(0);
QstObjectPrivate *back = static_cast<QstObjectPrivate *>( d);
PrivateData *d = new QstObjectPrivate(0);
QstObjectPrivate *back = static_cast<QstObjectPrivate *>( d);
To copy to clipboard, switch view to plain text mode
Am I getting the basics wrong ?
Here is the Pimpl implementation code ...
p, li { white-space: pre-wrap; } // --- Private Data ---
class PublicInterface;
class PrivateData {
friend class PublicInterface;
public:
PrivateData( PublicInterface *iface )
:_interface(iface){}
virtual ~PrivateData(){
}
// ---- data ----
PublicInterface *_interface;
};
// --- Public Interface ---
class PublicInterface{
friend class PrivateData;
protected:
inline PublicInterface( PrivateData *d ):_data( d ){
}
inline ~PublicInterface(){
delete _data;
}
// ---- data ----
PrivateData *_data;
};
// --- My Private Test Harness ---
class QstObjectPrivate;
class QstObject : public PublicInterface{
public:
QstObject();
private:
QstObjectPrivate* data_pointer_test() {
return static_cast<QstObjectPrivate*>( _data );
}
};
class QstObjectPrivate : public PrivateData{
public:
QstObjectPrivate( PublicInterface *iface ):PrivateData( iface ){
}
};
QstObject::QstObject()
:PublicInterface( new QstObjectPrivate(this) ){
}
int main(){
QstObject test;
}
p, li { white-space: pre-wrap; } // --- Private Data ---
class PublicInterface;
class PrivateData {
friend class PublicInterface;
public:
PrivateData( PublicInterface *iface )
:_interface(iface){}
virtual ~PrivateData(){
}
// ---- data ----
PublicInterface *_interface;
};
// --- Public Interface ---
class PublicInterface{
friend class PrivateData;
protected:
inline PublicInterface( PrivateData *d ):_data( d ){
}
inline ~PublicInterface(){
delete _data;
}
// ---- data ----
PrivateData *_data;
};
// --- My Private Test Harness ---
class QstObjectPrivate;
class QstObject : public PublicInterface{
public:
QstObject();
private:
QstObjectPrivate* data_pointer_test() {
return static_cast<QstObjectPrivate*>( _data );
}
};
class QstObjectPrivate : public PrivateData{
public:
QstObjectPrivate( PublicInterface *iface ):PrivateData( iface ){
}
};
QstObject::QstObject()
:PublicInterface( new QstObjectPrivate(this) ){
}
int main(){
QstObject test;
}
To copy to clipboard, switch view to plain text mode
Bookmarks