Du bist nicht angemeldet.

Werbeanzeige

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 778

Wohnort: Aachen

  • Private Nachricht senden

1

17.02.2011, 21:41

C++ Nested Typedef

Hallo,

ich habe eine Frage zum Standard. Ich habe heute längere Zeit dazu gegooglet
und widersprüchliche Angaben gefunden. Verhalten sich nested typedefs so wie
nested classes oder nicht? Konkret: Ist das folgende Beispiel korrekter C++ Code?
MS Visual Studio 2008 schluckt das jedenfalls nicht...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class B;

template < typename T >
class A
{
public:
  A( B& b ) : b( b ) { }
  void foo()
  {
    b.bar();
  }
private:
  B& b;
};

class B
{
public:
  B() : a( *this ) { }
  void blub()
  {
    a.foo();
  }
private:
  typedef A<B> ConcreteA;
  ConcreteA a;
  void bar();
};


Falls nicht: Existiert ein Konstrukt in der Sprache C++, welches das beabsichtigte
Ergebnis, nämlich, den Zugriff auf private / protected Member einer Klasse B einer
Klasse A offerieren, ohne die öffentliche Schnittstelle von B verändern zu müssen?
Abgesehen von friends natürlich.

Danke im Voraus
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

2

17.02.2011, 22:03

Nein das ist kein gültiges C++. B::bar ist private, da hat also von Außen niemand drauf Zugriff. Eine Lösung wäre es die Klasse A<B> zu einem friend von B zu machen...

Was genau willst du denn damit Bezwecken?

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 778

Wohnort: Aachen

  • Private Nachricht senden

3

18.02.2011, 00:25

Zitat

Abgesehen von friends natürlich
;)

Ich will im Grunde dasselbe wie das hier, nur dass A außerhalb von B definiert ist:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class B
{
public:
  B() : a( *this ) { }
  void blub()
  {
    a.foo();
  }
private:
  class A
  {
  public:
    A( B& b ) : b( b ) { }
    void foo()
    {
      b.bar();
    } 
  private:
    B& b;
  };
  A a;
  void bar();
};
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

4

18.02.2011, 00:56

Geht nicht ohne friend wenn bar private sein soll. Gut du könntest einen Proxytypen in B definieren der Zugriff auf bar hat und den A verwendet, aber ich denk mal sowas willst du auch nicht!? Was ist denn dein konkreter Anwendungsfall, evtl. gibts überhaupt einen besseren Ansatz!?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (18.02.2011, 01:11)


the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 778

Wohnort: Aachen

  • Private Nachricht senden

5

18.02.2011, 10:30

Dass das alles nicht gerade schön ist, ist mir klar, ich versuche nur neue Funktionalität in bestehende Fremdklassen reinzuwurschteln, sobalds läuft, schreib ich's eh nochmal ordentlich... naja da es nicht geht werde ich das 'ordentlich' machen wohl vorziehen müssen.
<< an dieser Stelle ist eine Signatur verstorben >>

Werbeanzeige