Ich bin dabei, an einer Klasse zu arbeiten, und ich habe 3 Arrays in meiner Klasse, wo sie alle die gleichen Daten aber in einem anderen Format darstellen. Ich habe den Operator <<
überladen, der außerhalb meiner Klasse erklärt wird, die eine const-Referenz zu ihm nimmt und nicht als ein Freund dieser Klasse.C++ Überladen der I/O-Operatoren: Getting Past Ambiguity
SomeClass {
public:
// Nameless Union - All 3 Arrays Are of The Same Exact Data Type
// And All 3 Arrays Have The Same Exact Size. This Nameless Union
// Uses The Same Memory Address For All 3 Arrays And Their Elements.
// So An Element Is Changed By One Array Type, It Is Expected And
// Accepted For It To Change The Others. This Is Not 3 Different
// Arrays, This Is Still 1 Array Of Size 256, Just Different
// Representations Or Different Ways To Access Them.
union {
int m_256[256];
int m_16[16][16];
int m_4[4][4][4][4];
};
SomeClass() { std::fill(std::begin(m_256), std::end(m_256), 0); }
}; // SomeClass
std::ostream& operator<<(std::ostream& out, const SomeClass& c) {
out << std::endl;
for (unsigned box = 0; box < 4; box++) {
for (unsigned slice = 0; slice < 4; slice++) {
for (unsigned row = 0; row < 4; row++) {
for (unsigned col = 0; col < 4; col++) {
out << "(" << box << "," << slice << "," << row << "," << col << ") = "
<< c.m_4[box][slice][row][col] << std::endl;
}
}
}
}
return out;
} // operator<<
Dies ist, was ich derzeit habe. Was ich gerne tun könnte ist, auch die operator<<
mit dieser Klasse zu verwenden, aber in der Lage zu sein, einen Weg zu unterscheiden, dieselben Daten in einem anderen Format anzuzeigen.
Ich weiß, dass Sie dies nicht tun können: durch Hinzufügen eines zweiten
std::ostream& operator<<(std::ostream& out, const SomeClass& c) {
out << std::endl;
for (unsigned i = 0; i < 16; i++) {
for (unsigned j = 0; j < 16; j++) {
out << "(" << i << "," << j << ") = " << c.m_16[i][j] << std::endl;
}
}
return out;
} // operator<<
Und eine dritte
std::ostream& operator<<(std::ostream& out, const SomeClass& c) {
out << std::endl;
for (unsigned u = 0; u < 256; u++) {
out << u << " = " << m_256[u] << std::endl;
}
return out;
} // operator<<
Aufgrund der Tatsache, dass dies nicht eindeutig ist. Aber ich hätte gerne die Funktionalität, um es in einem der 3 verschiedenen Formate anzuzeigen.
Gibt es irgendwelche Arbeiten eine Runden oder Lösungen für dieses Problem? Ich möchte in der Lage sein, das Klassenobjekt einfach an den stream-Operator zu senden, und diese Typen von Operatoren können keine zusätzlichen Parameter akzeptieren, da sie binäre Operatoren und keine Funktion sind.
Geben Sie Überlastungen für die Union Elementtypen anstelle der Klasse; Verwenden Sie Namespaces und 'using'; Fügen Sie Ihrer Vereinigung eine 'enum' hinzu, um anzuzeigen, welches Mitglied aktiv ist, verwenden Sie [xalloc] (http://en.cppreference.com/w/cpp/io/ios_base/xalloc) und co, um einen benutzerdefinierten Manipulator zu erstellen, machen Sie drei Wrapper-Klassen mit ihren eigenen Überladungen ... es gibt viele Lösungen, aber letztendlich hängt es davon ab, wie die Operatoren aufgerufen werden sollen. – user657267