Toon posts:

[C++] friend + protected member function

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het volgende schijnt illegaal te zijn (en met nieuwere compilers ook nog strafbaar :9 ) :

C++:
1
2
3
4
5
6
7
8
class A {
protected:
    void aa() const {}      
    };

class B {
    friend void A::aa() const;
    };


Ik kan nu twee dingen doen: aa() public maken of geheel class A friend maken van B. Het laatste lijkt mij het beste want dan blijft aa() nog steeds protected zoals bedoeld was. Nog andere mogelijke oplossingen?

En oh, waarom is het bovenstaande eigenlijk illegaal?

[ Voor 6% gewijzigd door Verwijderd op 26-09-2006 16:51 ]


Verwijderd

The protected keyword specifies access to class members in the member-list up to the next access specifier (public or private) or the end of the class definition. Class members declared as protected can be used only by the following:

Member functions of the class that originally declared these members.

Friends of the class that originally declared these members.

Classes derived with public or protected access from the class that originally declared these members.

Direct privately derived classes that also have private access to protected members.

When preceding the name of a base class, the protected keyword specifies that the public and protected members of the base class are protected members of its derived classes.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13-02 18:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mooie quote uit de standaard, maar wat dat met het probleem van de topicstarter te maken heeft ontgaat me een beetje.

vicz: Zoals het er nu staat wil je dat je vanuit A::aa bij B kan. De reden dat je dat niet kunt specificeren is omdat A::aa protected is, en dus kan B daar niet bij (ook niet om die functie toegang te geven tot je eigen class). Oplossing is idd om heel A een friend maken van B, wat betekent dat alle members van A toegang hebben tot B. Het kan ook andersom, dus door B een friend te maken van A. Dit heeft als gevolg dat B bij de members van A mag, zodat je regel 7 ook correct is.

Een derde oplossing is om een derde helper class te defieren waarin je je A::aa implementeert.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A
{
    friend class ABHelper;
protected: 
    void aa() const { ABHelper::aa_impl(this); }
};

class B
{
    friend class ABHelper;
};

class ABHelper
{
    friend class A;
private:
    static void aa_impl(const A * a);
};


A heeft toegang tot ABHelper::aa_impl, zodat hij die kunt aanroepen vanuit A::aa. ABHelper heeft vervolgens toegang tot zowel de members van A als van B, zodat je A::aa volledig in aa_impl kunt implementeren. A mag dus niet zomaar bij B, B mag ook niet zomaar bij A, en verder mag alleen A bij ABHelper, dus het zit zo goed als potdicht :).

[ Voor 36% gewijzigd door .oisyn op 26-09-2006 17:56 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op dinsdag 26 september 2006 @ 17:50:
Mooie quote uit de standaard, maar wat dat met het probleem van de topicstarter te maken heeft ontgaat me een beetje.

vicz: Zoals het er nu staat wil je dat je vanuit A::aa bij B kan. De reden dat je dat niet kunt specificeren is omdat A::aa protected is, en dus kan B daar niet bij (ook niet om die functie toegang te geven tot je eigen class). Oplossing is idd om heel A een friend maken van B, wat betekent dat alle members van A toegang hebben tot B. Het kan ook andersom, dus door B een friend te maken van A. Dit heeft als gevolg dat B bij de members van A mag, zodat je regel 7 ook correct is.

Een derde oplossing is om een derde helper class te defieren waarin je je A::aa implementeert.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A
{
    friend class ABHelper;
protected: 
    void aa() const { ABHelper::aa_impl(this); }
};

class B
{
    friend class ABHelper;
};

class ABHelper
{
    friend class A;
private:
    static void aa_impl(const A * a);
};


A heeft toegang tot ABHelper::aa_impl, zodat hij die kunt aanroepen vanuit A::aa. ABHelper heeft vervolgens toegang tot zowel de members van A als van B, zodat je A::aa volledig in aa_impl kunt implementeren. A mag dus niet zomaar bij B, B mag ook niet zomaar bij A, en verder mag alleen A bij ABHelper, dus het zit zo goed als potdicht :).
Bedankt voor de uitleg. Inmiddels heb ik het probleem verholpen (A friend van B ). De snelste oplossing dat wel, maar dit is maar 1 van de vele problemen die ik nog moet oplossen :P