Then you either need to decide that the Match object is 'part of the
implementation' of a Window, and have the MainWindow class make it a
friend, or make it public.
Making it a friend exposes ALL the internal details to it, so you need
to decide how much you want to expose to whom.
Part of the question comes to what if the Match object uses some other
classes to do some of its work, should those be able to call the draw
function too, or is it restricted to just the original Match class.
It really sounds like this operation is part of the API of the window
class. Access to classes is fairly broad in C++, just because some code
doesn't have a need to access something isn't a reason to hide that
operation from that code.
Access specifiers are about dividing internal details from external API.
Access is restricted to implementation details, and granted to the
defined interface. Things 'inside' the implementation have full access,
and need to be looked at if you change the implementation.
The question comes, do you really think of the Match object as
responsible for the display of the state of the game, and thus part of
the window system, or is it just a user of that system, and should be
accessing it through the API. The existence of the
drawCurrentGameSituation() function seems to imply to me that Match
isn't given implmentation responsibility for a window, and thus that
function is part of the API.
Another good question is what harm would it cause if someone
'unauthorized' called this function. My first guess is probably nothing
major, yes, you waste a lot of time doing the update, but nothing really
'breaks', so it can easily be part of the API.