> It's intended for when the source code of the implementation isn't available > so internal variables and function names can be completely hidden.
That is not the motivation at all in Qt's case. The reasons for it are: - Binary compatibility between minor Qt versions. Adding, removing or changing fields in the pimpl class does not alter the layout or size of the public class. - It permits sharing of data between instances of the public class (aka. copy on write. See QSharedData). - During development, the amount of code that is recompiled when changing private implementation details in the pimpl class is reduced. I'm not especially familiar with debugging in VS, but I would have thought that in a debug build, VS has enough information about the data types of the pimpl classes to display them in the debugger. Regards, Rob. On 16 September 2012 11:08, Tom Isaacson <[email protected]> wrote: > I've been working on some networking code recently and I got very frustrated > with not being able to see the IP and MAC addresses in QHostAddress and > QNetworkInterface whilst debugging in Visual Studio. After a bit of > experimentation I was able to add viewers for these classes to autoexp.dat > and I've posted these below. But the problem I had is that these classes > follow the Pimpl Idiom, so it's impossible for Visual Studio to be able to > see the members of the classes in order to display the values. I had to look > into the implementation of the private part of the classes then use byte > shuffling in autoexp.dat to display them. This means that if the layout of > the classes ever changes this method will display the wrong data, which is > why I'm not sure if it's a good idea to add this to the Visual Studio Add-In > installer. However, if anyone wants to do this then go ahead. > > I understand why the Pimpl Idiom is being used here, but I'm wondering if > it's actually necessary. It's intended for when the source code of the > implementation isn't available so internal variables and function names can > be completely hidden. But in the case of Qt, where the source code is > available and can even be used to build your own binaries, it seems > excessive. It also means that useful displays of debugging data aren't really > possible and you have to resort to what I've done below. > > Can I suggest that going forward the Pimpl Idiom is dropped and we go back to > just using private member variables and functions to prevent them being > called from outside the class? Or is there some alternative that would allow > VS to see the layout it needs? > > QHostAddress|*::QHostAddress{ > preview > ( > #( > #if (*((quint32 *)$e.d.d) != 0) ( > #("IPv4=", [*(((quint8 *)$e.d.d) + 3), u], > ".", [*(((quint8 *)$e.d.d) + 2), u], > ".", [*(((quint8 *)$e.d.d) + 1), u], > ".", [*(((quint8 *)$e.d.d) + 0), u]) > ) #elif ((*(((quint32 *)$e.d.d) + 1)) + (*(((quint32 *)$e.d.d) + > 2)) + (*(((quint32 *)$e.d.d) + 3)) + (*(((quint32 *)$e.d.d) + 4)) != 0) ( > #("IPv6=", > [(quint16)((*(((quint8 *)$e.d.d) + 0x04) << 0x8) | > (*(((quint8 *)$e.d.d) + 0x05))), x], > ".", > [(quint16)((*(((quint8 *)$e.d.d) + 0x06) << 0x8) | > (*(((quint8 *)$e.d.d) + 0x07))), x], > ".", > [(quint16)((*(((quint8 *)$e.d.d) + 0x08) << 0x8) | > (*(((quint8 *)$e.d.d) + 0x09))), x], > ".", > [(quint16)((*(((quint8 *)$e.d.d) + 0x0A) << 0x8) | > (*(((quint8 *)$e.d.d) + 0x0B))), x], > ".", > [(quint16)((*(((quint8 *)$e.d.d) + 0x0C) << 0x8) | > (*(((quint8 *)$e.d.d) + 0x0D))), x], > ".", > [(quint16)((*(((quint8 *)$e.d.d) + 0x0E) << 0x8) | > (*(((quint8 *)$e.d.d) + 0x0F))), x], > ".", > [(quint16)((*(((quint8 *)$e.d.d) + 0x10) << 0x8) | > (*(((quint8 *)$e.d.d) + 0x11))), x], > ".", > [(quint16)((*(((quint8 *)$e.d.d) + 0x12) << 0x8) | > (*(((quint8 *)$e.d.d) + 0x13))), x]) > ) > ) > ) > children > ( > #( > [d]: [$c.d.d, x] > ) > ) > } > > > > QNetworkInterface|*::QNetworkInterface{ > preview > ( > #( > [(QString *)(((quint32 *)$e.d.d) + 0x4)] > ) > ) > children > ( > #( > [d]: [$c.d.d, x], > [QSharedData]: [*(((quint32 *)$c.d.d) + 0x0), u], > [index]: [*(((quint32 *)$c.d.d) + 0x1), u], > [flags.i]: [*(((quint32 *)$c.d.d) + 0x2), u], > [name]: [(QString *)(((quint32 *)$c.d.d) + 0x3)], > [friendlyName]: [(QString *)(((quint32 *)$c.d.d) + 0x4)], > [hardwareAddress]: [(QString *)(((quint32 *)$c.d.d) + 0x5)] > ) > ) > } > > TOM ISAACSON | SENIOR SOFTWARE DEVELOPER | NAVICO ASIA PACIFIC > > > > _______________________________________________ > Development mailing list > [email protected] > http://lists.qt-project.org/mailman/listinfo/development _______________________________________________ Development mailing list [email protected] http://lists.qt-project.org/mailman/listinfo/development
