Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » static_cast Ableitung -> Basisklasse funktioniert nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.09.2006, 14:26 Uhr
Yadgar



High!

Mal wieder mit "FractInt" zugange, diesmal soll von Fractint eine abgeleitete Klasse "NamedFractInt" gebildet werden und für diese Klasse der bereits in FractInt vorhandene Additionsoperator verwendet werden (Martin AUPPERLE, Die Kunst der Programmierung mit C++, S. 692ff).

Hier die Definitionen der Klassen:

1. FractInt:


C++:
class FractInt
{
  
  private:
    int mZaehler, mNenner;                            // Zähler und Nenner                              
    mutable bool mValid;                                // Cache-Implementierung
    mutable double mValue;                           // Cache-Inhalt
  public:
    FractInt();                                            // Standardkonstruktor
    FractInt(int aZaehler, int aNenner=1);        // Allgemeiner Konstruktor
    FractInt(const FractInt& aFI);                  // Kopierkonstruktor
    /* weitere Funktionen, hier nicht relevant */    
    FractInt operator + (FractInt aF2);           // Addition
    /* weitere Operatoren und Funktionen, hier nicht relevant */
};



2. NamedFractInt:


C++:
class NamedFractInt : public FractInt
{
  public:
    friend NamedFractInt operator + (const NamedFractInt&, const NamedFractInt&);
    
    NamedFractInt(string aName, int aZaehler, int aNenner=1); // Allgemeiner Konstruktor
    NamedFractInt (const FractInt& aF);                              // Spezial-Konstruktor für                                                    // Typwandlung FractInt -> NamedFractInt
    operator string() const;                    // Implizite Wandlung in String
  private:
    string mName;
};



schließlich die globale friend-Operatorfunktion +:


C++:
NamedFractInt operator + (const NamedFractInt& lhs, const NamedFractInt& rhs)
{
  FractInt result = static_cast<const FractInt&> (lhs) +
                    static_cast<const FractInt&> (rhs);
  
  return NamedFractInt(lhs.mName + rhs.mName, result.mZaehler, result.mNenner);
}



...und für diese Funktion wird mir bei jedem Versuch, zwei NamedFractInt-Objekte zu addieren, folgende Fehlermeldung angezeigt:

ambiguous overload for 'operator+' in '(const FractInt&((const FractInt*)(+lhs)) + (const FractInt&((const FractInt*)(+rhs))'

Wieso FractInt*? Soweit ich sehe, habe ich nirgendwo versehentlich ein Feld aus FracInts angelegt...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.09.2006, 14:37 Uhr
(un)wissender
Niveauwart


Mach mal aus


C++:
FractInt operator + (FractInt aF2);




C++:
FractInt const operator + (FractInt const& aF2) const;


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.09.2006, 14:40 Uhr
Blubber2063



Egal
Dieser Post wurde am 14.09.2006 um 14:44 Uhr von Blubber2063 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.09.2006, 14:45 Uhr
Yadgar




Zitat von (un)wissender:
Mach mal aus


C++:
FractInt operator + (FractInt aF2);




C++:
FractInt const operator + (FractInt const& aF2) const;




Habe ich gemacht - jetzt beklagt sich der Compiler, dass ich in der globalen (friend-)Operatorfunktion auf die Datenmitglieder des FractInt-Teilobjekts zugreife, die dort private sind... ist "friend" (obwohl im "Aupperle" so vorgeschlagen) in diesem Fall vielleicht von vornherein der falsche Ansatz und sollte ich die Funktion besser als Methode von NamedFractInt implementieren?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.09.2006, 14:58 Uhr
Blubber2063



Ja solltest du, denn das friend steht in der erbenden Klasse und nicht in der Elternklasse, wirkt also nicht auf private Elemente der Elternklasse, den auf private Elemente der Elternklasse hat auch die erbende Klasse keinen Zugriff.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.09.2006, 15:16 Uhr
Yadgar



High!


Zitat von Blubber2063:
Ja solltest du, denn das friend steht in der erbenden Klasse und nicht in der Elternklasse, wirkt also nicht auf private Elemente der Elternklasse, den auf private Elemente der Elternklasse hat auch die erbende Klasse keinen Zugriff.


Das habe ich dann auch getan, allerdings kann die Funktion jetzt nicht mehr auf das zusätzliche (natürlich private) Mitglied "mName" in NamedFractInt zugreifen... gibt es überhaupt eine Lösung für das Problem?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.09.2006, 15:27 Uhr
Blubber2063



Was hast du getan ? Wenn du willst das der friend Operator funktioniert, dann greifst du entweder nicht auf private Member der elternklasse zu, weils nicht geht oder du machst die Member protected.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.09.2006, 16:00 Uhr
Yadgar



High!


Zitat von Blubber2063:
Was hast du getan ? Wenn du willst das der friend Operator funktioniert, dann greifst du entweder nicht auf private Member der elternklasse zu, weils
nicht geht oder du machst die Member protected.


Ich verstehe das nicht... eigentlich sollte "protected" für die Datenmitglieder der Basisklasse doch bewirken, dass diese von Methoden der Ableitungen aus angesprochen werden können - obwohl ich die Operatorfunktion + jetzt als Methode von NamedFractInt programmiert habe, bekomme ich nach wie vor die Fehlermeldung "... is protected", wenn ich in dieser Funktion auf Datenmitglieder des Teilobjekts FractInt zugreifen will!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.09.2006, 17:02 Uhr
Blubber2063



Zeig mal jetzt den Code, so wird das nix.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.09.2006, 18:30 Uhr
Yadgar



High!


Zitat von Blubber2063:
Zeig mal jetzt den Code, so wird das nix.


Ich habe dann einfach mal eine Seite weiter geblättert - und da wurde mir dann auch die Lösung klar - einfach get-Methoden für die Basisklasse hinzufügen!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: