[Development] changing Q_GADGET
Milian Wolff
milian.wolff at kdab.com
Fri Nov 28 12:45:04 CET 2014
On Friday 28 November 2014 12:41:47 Olivier Goffart wrote:
> On Friday 28 November 2014 12:19:45 Simon Hausmann wrote:
> > Hi,
> >
> > Monsieur Goffart did awesome work in the dev branch on allowing structures
> > with Q_GADGET to have properties and invokable methods. This brings the
> > macro to a much wider audience and I'd like to use this opportunity to
> > propose a slight change to it that may be controversial:
> >
> > The macros Q_OBJECT and Q_GADGET both - towards the end of their
> > definition
> > - change the member access permission level to "private". It's always been
> > that way.
> >
> > I'd like to propose changing Q_GADGET to not change the access permission
> > level, so that you can write
> >
> > struct MyStructure
> > {
> >
> > Q_PROPERTY(int x MEMBER x)
> > Q_GADGET
> >
> > int x;
> >
> > }
> >
> >
> > I feel that Q_GADGET has its primary use with structures and the default
> > access level for those is public. I find it awkward that you currently
> > have
> > to write:
> >
> > structure MyStructure
> > {
> >
> > Q_PROPERTY(int x MEMBER X)
> > Q_GADGET
> >
> > public:
> > int x;
> >
> > }
> >
> >
> > The proposed change would have two effects:
> >
> > 1) It makes any existing code that _relies_ on Q_GADGET turning to private
> > suddenly expose members in structures.
> >
> > 2) On paper it breaks binary compatibility with MSVC, in the unlikely
> > event
> > that somebody
> >
> > a) produces a DLL and cares about binary compatibility
> > b) exposes bare structures
> > c) relies on Q_GADGET turning access permission levels to private
> >
> > I feel that the effects are negligible compared to the benefit of a better
> > API.
> >
> > What do you think?
>
> I have several times been bitten by the same problem when i used Q_OBJECT in
> a struct.
> But when I weight the pro and the cons, i'm not sure if it's a good idea.
>
> Pros:
> + Save one line when declaring a Q_GADGET in a struct
>
> Cons:
> - The change may change some member (data or function) from private to
> public - Is inconsistent with Q_OBJECT (and both are usually used in class)
> - Something that is incorrectly set as private will result in compilation
> errors that will be easily spotted and fixed. Something inadvertently left
> public will stay unnoticed until it's too late to change it.
>
> Notice that in our code we recommend to always use class and almost never
> struct. All the Q_GADGET today are class.
>
> An alternative to save that line might also be to put the Q_GADGET macro at
> the end of the struct.
Why don't you just introduce a new macro?
Bye
--
Milian Wolff | milian.wolff at kdab.com | Software Engineer
KDAB (Deutschland) GmbH&Co KG, a KDAB Group company
Tel. Germany +49-30-521325470, Sweden (HQ) +46-563-540090
KDAB - Qt Experts - Platform-independent software solutions
More information about the Development
mailing list