Todo estaba bien hasta que moví mis objetos a un espacio de nombres. Y ahora el compilador afirma que mis atributos de Color son privados.C++ - ostream, friends y namespaces
Pensé que el objetivo de los amigos era compartir información encapsulada con los que una clase se hiciera amiga.
Color.h
friend ostream & operator << (ostream& output, const st::Color& color);
Color.cpp:
ostream & operator <<(ostream& output, const st::Color& color) {
output << "Colors:\nalpha\t: " << color.a << "\nred\t: " << color.r << "\ngreen\t: " << color.g
<< "\nblue\t: " << color.b << "\nvalue\t: " << color.color();
return output;
}
error:
Color.h||In function 'std::ostream& operator<<(std::ostream&, const st::Color&)':|
Color.h|52|error: 'unsigned char st::Color::a' is private|
Color.cpp|15|error: within this context|
Color.h|49|error: 'unsigned char st::Color::r' is private|
Color.cpp|15|error: within this context|
Color.h|51|error: 'unsigned char st::Color::g' is private|
Color.cpp|15|error: within this context|
Color.h|50|error: 'unsigned char st::Color::b' is private|
Color.cpp|16|error: within this context|
||=== Build finished: 8 errors, 0 warnings (0 minutes, 1 seconds) ===|
Entonces, ¿cuál es el trato? Estoy usando Code :: Blocks como mi IDE. Y ni siquiera mostrará ninguna propiedad o método cuando utilizo el operador de punto en el parámetro "color". Esto es obviamente un signo de que algo va mal ... en alguna parte.
He tomado la sobrecarga del operador amigo y compila muy bien. Ningún error en otro lugar. ¿Qué ofrece?
Se declara como sigue:
namespace st{
class Color {
friend ostream & operator << (ostream& output, const st::Color& color);
public:
....
private:
.....
};
};
Editar:
En mi CPP ahora he hecho esto:
namespace st{
ostream & st::operator <<(ostream& output, const st::Color& color) {
output << "Colors:\nalpha\t: " << color.a << "\nred\t: " << color.r << "\ngreen\t: " << color.g
<< "\nblue\t: " << color.b << "\nvalue\t: " << color.color();
return output;
}
}
st::Color::Color() {
reset();
}
st::Color::Color(const Color& orig) {
a = orig.a;
r = orig.r;
g = orig.g;
b = orig.b;
}
void st::Color::reset() {
a = 0;
r = 0;
g = 0;
b = 0;
}
... etc
}
Sin errores de compilación, pero es normal que tal situación para usar el espacio de nombres nuevamente en el encabezado? ¿O está completamente fuera de lo que debería estar haciendo?
Edit: @Rob gracias por su aporte también!
¿Qué quiere decir con "movido mis objetos a un espacio de nombres"? – jedwards
Mover el objeto entre un espacio de nombres. I.E namespace st {class ...} – Sidar
No use el espacio de nombres nuevamente en la definición de 'operator <<'. Esto no debería ser necesario. – pmr