Hi,
folgende Situation:
#include <qstring.h>
// Eine Klasse für IDs. Zur Zeit sind die IDs als QString // implementiert. Das kann sich in Zukunft ändern. // Aber ich will _immer_ die Möglichkeit anbieten, eine ID // (zu Debug-Zwecken) in einen QString zu konvertieren. class ID : private QString { };
int main() { ID id; QString s;
s = id; // Dat geht nicht. Weil QString private ist in // ID. // Typconvertierungs-Operator in ID (nach QString) // hilft auch nicht: er wird nicht genutzt, sagt der // Compiler (type conversation operator for cast // to base class not used)
qDebug("%s", s.latin1()); // sollte den QString in const char* // konvertieren und dann ausgeben. // latin1() ist eine (public) // Memberfunktion von QString.
}
Watt nu? Ich könnte sicher erst von QString eine public Ableitung machen, in der dann einen Typeconversation-Konstruktor definieren und diesen zum Freund von ID machen, aber das kommt mir krank vor.
Ich hab auch versucht, QString zum Freund von ID zu machen, aber auch das ist ja eigentlich Quatsch und hilft nicht, denn es wird ja keine Funktion von QString aufgerufen, wenn ich s = id habe. Besser -- es wird schon eine Funktion von QString aufgerufen:
s.operator=(QString(id));
???
Irgendwelche Idee, außer daß es nix mit Linux zu tun hat? (Trotzdem: ich bearbeite dieses Problem unter Linux ;-)
Best regards from currently Schwerin/Germany Viele Gruesse aus Schwerin/Mecklenburg-Vorpommern Heiko Schlittermann
Am Freitag, 17. August 2001 11:32 hast du geschrieben:
// Eine Klasse für IDs. Zur Zeit sind die IDs als QString // implementiert. Das kann sich in Zukunft ändern. // Aber ich will _immer_ die Möglichkeit anbieten, eine ID // (zu Debug-Zwecken) in einen QString zu konvertieren. class ID : private QString { };
Wäre es nicht viel sinnvoller sowas zu machen (ohne Gewähr für Syntax -- es geht nur ums Prinzip):
class ID { public: ID(int); ~ID() { ... }; QString get; private: QString num; }
ID id;
id.get.latin1() ist dann der String, den du haben willst.
Mit einem static_cast könnte es auch gehen -- ist aber für diesen Fall extrem dirty (obwohl der Compiler beim Übersetzen meckert, wenn du die Implementierung änderst). Besser ist immer eine definierte Schnittstelle zu benutzen und nur die Klasse intern zu ändern!
ID id; QString s; s = id; // Dat geht nicht. Weil QString private ist in // ID. // Typconvertierungs-Operator in ID (nach QString) // hilft auch nicht: er wird nicht genutzt, sagt der // Compiler (type conversation operator for cast // to base class not used)
Was soll denn das private überhaupt?
Aus "Die C++ Programmiersprache": wenn eine Klasse "Abgeleitet" eine *öffentliche* Basisklasse "Basis" hat, dann kann ein "Abgeleitet*" einer Variablen vom Typ "Basis*" ohne Nutzung einer expliziten Typumwandlung zugewiesen werden. Die umgekehrte Konvertierung von "Basis*" nach "Abgeleitet*" muß explizit erfolgen.
"static_cast" und "dynamic_cast" könnten helfen (ohne "private")
ganz quick and dirty könntest du also das "private" durch "public" ersetzen und mit einem "static_cast" direkt auf die Elementfunktionen von QString zugreifen.
Hoffe, das bringt dich weiter Uwe
lug-dd@mailman.schlittermann.de