PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++]Konvertierungsoperator?


Arokh
2006-09-26, 16:19:45
Folgende Problemstellung: zwei Kinder, Alice und Bob, sollen unabhängig voneinander Tierarten aufzählen. Die Zahl der ihnen einfallenden Tierarten ist unterschiedlich, Bobs Aufzählung enthält Tiere die bei Alice nicht vorkommen, und umgekehrt, und diejenigen Tiere, die in beiden Aufzählungen enthalten sind, haben unterschiedliche Reihenfolgen. Die Realisierung der beiden Aufzählungen als enums könnte also z.B. so aussehen:

namespace Alice
{
enum Tier
{
Hund,
Katze,
Kuh,
Pferd,
Elefant,
Esel,
};
};

namespace Bob
{
enum Tier
{
Katze,
Pferd,
Hund,
Klapperschlange,
Papagei,
Krokodil,
Elefant,
};
};

Jetzt soll ein Konvertierungsoperator definiert werden, der die in beiden Aufzählungen vorkommenden Tiere (hier: Katze, Hund, Pferd, Elefant) von der einen zur anderen Aufzählung konvertiert, etwa so:

Alice::Tier aliceTier = (Alice::Tier) Bob::Katze; // -> aliceTier == Alice::Katze

Für nicht bei beiden vorkommende Tiere müßte mann zusätzlich einen Wert ungültiges_Tier definieren, den der Operator dann zurückgibt.

Die Frage ist: geht das so überhaupt? Oder kann man einen Konvertierungsoperator immer nur als Member einer Klasse implementieren?
Wenn es geht, wie sähe dann der Prototyp aus? So vielleicht:

operator Alice::Tier(Bob::Tier);
?

Gast
2006-09-26, 17:07:33
Brauchst ne Klasse dafür. operator= und den Konstruktor entsprechend überladen.

kloffy
2006-09-26, 22:33:36
Würde spontan auch mal sagen: geht nur als Klasse.

Ohne Gewähr:

namespace Alice
{
class Tier {
operator Bob::Tier() {
//Konvertierung, Rückgabe des entsprechenden Tieres in Bob
};
};
};

namespace Bob
{
class Tier {
operator Alice::Tier() {
//Konvertierung, Rückgabe des entsprechenden Tieres in Alice
};
};
};

Gast
2006-09-26, 22:41:52
Funktionen und Namespaces muss man aber nicht mit }; abschließen.

kloffy
2006-09-26, 23:02:46
Funktionen und Namespaces muss man aber nicht mit }; abschließen.

Jepp, das stimmt wohl, ist schon ewig her das ich was in C++ geschrieben hab. Um mich zu vergewissern, das der Rest stimmt hab ich dieses kleine Programm geschrieben.

#include <iostream>

namespace Bob
{
class Tier;
}

namespace Alice
{
class Tier {
public:
int type;
Tier(int _type): type(_type){}
operator Bob::Tier();
};
}

namespace Bob
{
class Tier {
public:
int type;
Tier(int _type): type(_type){}
operator Alice::Tier();
};
}

namespace Alice
{
Tier::operator Bob::Tier() {
return Bob::Tier(type);
}
}

namespace Bob
{
Tier::operator Alice::Tier() {
return Alice::Tier(type);
}
}

int main(int argc, char* argv[])
{
Bob::Tier b(1);
Alice::Tier a = b;

std::cout << a.type << ',' << b.type << '\n';

return 0;
}

Edit: Problem gelöst.