Ergebnis 1 bis 5 von 5

Thema: [C++] Private Variablen in Templates

  1. #1
    Registered User
    Registriert seit
    Jul 2001
    Beiträge
    231
    Renommee
    14

    Klassen und Templates!

    Hi everyone!

    Ich mach grad bissi was mit Templates, und mir is grad aufgefallen dass zwei klassen, welche im selben template sind, gegenseitig auf private variablen zugreifen können. Also ohne set bzw. get funktionen. Ich progge schon länger mit templates, aber das is ma erst jetzt aufgefallen, und ich habs strange gefunden.

    Das fuchst mich jetzt, und ich hätt gern gwusst wieso das so is. Ich mein, des is ja ganz nett, muss ich mich um nix mehr kümmern, aber etwas "unsauber" oder?

    Ich kompiliere mit GCC 2.95.3.

    STiAT
    Ability is nothing without opportunity.

  2. #2
    Registered User
    Registriert seit
    May 2000
    Beiträge
    905
    Renommee
    10
    Schreib mal bitte nen kleines Beispiel, also das halte ich dann wirklich für sehr komisch, bzw. extrem falsch. Oder hab ich dich eben falsch verstanden. Poste bitte.
    THX
    Hiermit möchte ich mich in aller Form für diesen Beitrag entschuldigen.
    Ich verspreche, es kommt nie wieder vor !


    Life Suckz !!!

  3. #3
    Member
    Registriert seit
    Oct 2001
    Beiträge
    379
    Renommee
    10
    Ich glaub, er meint folgendes:

    Code:
    template <class T>
    class A
    {
         private:
              T* t1;
    
         public:
              class B
              {
    	private:
    	     T* t2;
    
    	public:
    	     void work()
    	     {
    	           t1 = new T;		// kein Fehler !!
    	           t2 = new T;
    	     }
              };
    };
    
    
    class C
    {
         private:
              int* t1;
    
         public:
              class D
              {
    	private:
    	     int* t2;
    
    	public:
    	     void work()
    	     {
    		t1 = new int;	// Fehler !!!
    		t2 = new int;
    	     }
              };
    };
    
    
    int main()
    {
          A<int> a;
          A<int>::B b;
     
          C c;
          C::D d;
    
          return 0;
    }

    Ist mir bis heute auch noch nie aufgefallen ..

    Use the source, Luke!

  4. #4
    Registered User
    Registriert seit
    Aug 2000
    Beiträge
    103
    Renommee
    19
    Hallo,
    du verwechselt da was. t1, t2 in deinem ersten Beispiel sind abhängige Name. Solche Namen werden, im Gegensatz zu unabhängigen Namen, erst bei der Instanziierung eines Templates geprüft. Und wann wird ein Template instanziiert? Richtig. Wenn es benutzt wird.
    Demzufolge sollte dein Compiler erst bei den Zeilen
    Code:
    A<int>::B b;
    b.worrk();    // <- HIER!
    einen Fehler der Art "t1 is inaccessible" melden.

    Für Debugging-Zwecke und besonders wenn man sich mit den Regeln von Templates nicht so auskennt eignet sich eine explizite Instanziierung. Dadurch wird das komplette Template instanziiert und alle Fehler können gemeldet werden:
    Code:
    template class A<int>;
    Gruß
    Marvin
    C++ und mehr: http://bens.c-plusplus.info/

  5. #5
    Registered User
    Registriert seit
    Jul 2001
    Beiträge
    231
    Renommee
    14
    ahh. jop, habs jetzt probiert, stimmt. ich dachte mir er müsste es schon in der klassendefinition bemerken. Hat auch gleich ne zweite frage vo mir beantwortet *gg*.. DANKE!!!

    STiAT
    Ability is nothing without opportunity.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Private Thread-Favoritenliste
    Von dexcs im Forum Board Fragen
    Antworten: 8
    Letzter Beitrag: 21.04.2004, 10:19
  2. Private Variablen werden vererbt ?
    Von knoedel im Forum C / C++
    Antworten: 2
    Letzter Beitrag: 04.12.2002, 18:32
  3. Antworten: 2
    Letzter Beitrag: 28.02.2002, 17:23
  4. Private oder Public
    Von AMFA im Forum VisualBasic / VBScript
    Antworten: 2
    Letzter Beitrag: 17.08.2000, 22:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •