Tengo un problema con 2 clases que alguna vez estuvieron muy bien separadas, pero ahora quieren aparearse.Cuando las clases quieren acoplar
Sin entrar demasiado en los aspectos específicos del problema, aquí está:
que solía tener un triángulo de clase que contenía 3 vértices espacio-posición.
class Triangle
{
Vertex a,b,c ; // vertices a, b and c
} ;
Hubo muchas instancias de Triangle en el programa, por lo que cada una había conservado su propia copia de sus vértices. Las funciones de miembro como getArea()
, getCentroid()
etc. se escribieron en la clase Triangle
, y dado que cada instancia Triangle
tenía copias de los vértices a, byc, al encontrar el área o centroide no dependía de otras clases. ¡Como debería ser!
Luego quise pasar a una representación de estilo de matriz de vértices/matriz de índices, por otros motivos. Esto significa que todos los vértices se almacenan en una única matriz ubicada en un objeto Scene
, y cada Triangle
solo conserva REFERENCIAS a los vértices en Scene
, no copias de los propios vértices. Al principio, traté de cambiar a cabo para los punteros:.
class Scene
{
std::vector<Vertex> masterVertexList ;
} ;
class Triangle
{
Vertex *a,*b,*c ; // vertices a, b and c are pointers
// into the Scene object's master vertex list
} ;
(En caso de que usted se está preguntando acerca de los beneficios, lo hice por razones que ver principalmente con los triángulos que comparten vértices Si * entonces a se mueve todos los triángulos que utilizar ese vértice se actualizan automáticamente).
¡Esta habría sido una muy buena solución! Pero no funcionó de manera confiable, because std::vector invalidates pointers, y estaba usando un std :: vector para la lista de vértices maestros en la clase Scene
.
Así que tuve que usar números enteros:
class Triangle
{
int a,b,c ; // integer index values
// into the Scene object's master vertex list
} ;
Pero ahora tengo este nuevo problema de acoplamiento: para encontrar su propia área o centro de gravedad, la clase de acceso a Triangle
necesidades class Scene
donde antes no lo hizo. Parece que he avergonzado algo, pero no realmente.
WWYD?
¿En qué idioma es este un lenguaje agnóstico? –
Cambiado a C++. – bobobobo
Estas clases me recuerdan a George Costanza: "¡He acoplado! ¡He acoplado!" –