pasar una variable miembro de vector por referencia a otro método de clase

NOTA: uso pseudocódigo en mi pregunta

digamos que tengo una clase llamada círculo con una interfaz llamada círculo.h que también tengo un método llamado readdata pero esto está definido en otra clase llamada rectángulo (rectangle.h es la interfaz) quiero llamar al método readdata en mi círculo class y pase mi variable miembro privada que es un vector. ¿Cómo se puede hacer esto? ¿Es correcto pasar una variable miembro PRIVADA por referencia a otra clase? ¿No está anulando todo el propósito de tener variables miembro privadas porque ahora le doy acceso al rectángulo de clase a la variable vectorial de clase circular, ya que la paso por referencia? Así es como lo hago (psuedocode)

circle.h

private:
vector<struct> vect;

public:
dataread()

circle.cpp

rectangle.h

readdata(vector &)




method dataread() //class method to fill up my struct
{
 rectangle::readdata(vect);   //i call rectangle readdata method but i
 pass in a reference to my memebr variable....is this safe?
}

¿Debería simplemente declarar el vector localmente (en el método de lectura de datos) y asignarlo a la referencia? cualquier ayuda sería muy apreciada. En este momento compila, pero me han dicho que esto no es una buena práctica de programación.

preguntado el 27 de julio de 12 a las 21:07

Es posible que desee formular su pregunta un poco más clara, porque es bastante difícil de entender lo que está preguntando (además: ¿por qué pseudocódigo? Podría ser más fácil de entender su pregunta con el código real). Como nota al margen circle.h es un archivo de encabezado, no una interfaz. Y realmente sin saber nada sobre las clases, sus invariantes y las condiciones previas y posteriores de los métodos, no hay forma de que podamos responder a su pregunta... -

Si se trata de una pregunta de diseño, debe explicar más cuál es su diseño. En algunos casos, puede tener sentido pasar un privado por referencia. No estoy seguro de por qué algo llamado Círculo tiene un vector o qué tiene eso que ver con un Rectángulo. Además, algo llamado datos de lectura no debería modificar el vector. -

3 Respuestas

No hay nada de malo en pasar referencias a miembros privados a métodos en otras clases. Por ejemplo:

void myClass::myMethod() {
    std::copy(myVector1.begin(), myVector1.end(), myVector2.begin());
}

Si bien eso no pasa una referencia a myVector1 directamente, pasa un iterador de escritura que es casi lo mismo. La clase está solicitando que algún objeto/función haga algo con sus datos. Siempre que ese otro objeto/función solo haga lo que se supone que debe hacer, no hay problema.

Respondido 27 Jul 12, 21:07

"Mientras ese otro objeto/función solo haga lo que se supone que debe hacer, no hay problema". Creo que no deberías confiar en esto. La encapsulación (miembros privados) tiene la intención de ofrecer protección en un entorno no colaborativo. - Razvan

Creo que entiendo lo que estás preguntando. Sí, puede pasar una referencia a sus datos privados y No, no debe hacerlo. Puede pasar una referencia constante para que no se pueda modificar o pasar un nuevo vector con el contenido copiado. Lo mejor que debe averiguar es por qué necesita hacerlo de esa manera, luego descubra el mejor método para obtener los datos allí.

Respondido 27 Jul 12, 21:07

En términos generales, no hay nada de malo en pasar una referencia a datos privados a un método/función. La pregunta no da suficiente información para decir si es correcta o no. en este caso específico. - Oso pardo

parece que es una cuestión de confianza. Porque si paso una referencia a un miembro privado de una clase (el vector) y el usuario lo llena con valores (estructuras) y deja el alcance de rwaddata, aún mantiene la referencia a mi variable privada y puede llenarlo con datos dañados o no válidos para su uso posterior. Si uso una copia local es el método readdata, entonces la otra clase no tiene referencia a mi vector y, por lo tanto, no puede meterse con él. rambokayambo

Pasar un puntero a un "área de memoria privada" no va necesariamente en contra de la idea de encapsulación porque el objeto que posee esa área de memoria decide a quién permitir el acceso. No permite que "cualquiera acceda a él". Por otro lado, esto no parece muy natural.

Debe devolver un puntero del método readdata y usarlo en su instancia de círculo. Al mismo tiempo, al hacer esto se rompe un principio que yo, personalmente, uso: el que asigna la memoria es responsable de ella, por lo que también debe ser el que la libere cuando corresponda. Teniendo esto en cuenta, probablemente sería una buena idea devolver el vector real y no un puntero (pero esto significa copiar una gran cantidad de memoria en caso de que no esté usando un compilador con "optimización de valor de retorno").

Respondido 27 Jul 12, 22:07

"pero esto significa copiar una gran cantidad de memoria": no necesariamente: la optimización del valor de retorno evita exactamente este tipo de ineficiencia. - Akappa

Hablaba de los conceptos teóricos. Está hablando de algunas optimizaciones de compiladores que ciertamente no están disponibles en todos los compiladores existentes. - Razvan

RVO es un concepto teórico: de hecho, es parte del lenguaje. Además, todos los compiladores que no sean horriblemente antiguos lo admiten. - Akappa

Si es parte del lenguaje, debe ser compatible con todos los compiladores compatibles. Entonces no es una cuestión de "horriblemente antiguo" o no. Sin embargo, Wikipedia dice esto: la optimización del valor de retorno es compatible con la mayoría de los compiladores. - Razvan

Tal vez te perdiste esa cosa de Wikipedia: "El término optimización del valor de retorno se refiere a una cláusula especial en el estándar C++ que permite que una implementación omita una operación de copia resultante de una declaración de devolución, incluso si el constructor de copia tiene efectos secundarios, algo que no está permitido solo por la regla como si". No se aplica, pero la implementación puede hacer así (y lo hacen, pruébalo tú mismo).- Akappa

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.