Когда классы хотят соединиться

У меня проблема с двумя классами, которые когда-то были хорошо разделены, но теперь они хотят соединиться.

Не вдаваясь в подробности проблемы, вот она:

Раньше у меня был класс Triangle, который содержал 3 вершины пространственного положения.

class Triangle
{
    Vertex a,b,c ; // vertices a, b and c
} ;

В программе было много экземпляров Triangle, поэтому каждый сохранил свою собственную копию своих вершин. Такие функции-члены, как getArea () , getCentroid () и т. Д., Были написаны в классе Triangle , и поскольку каждый экземпляр Triangle имел копии Вершины a, b и c, находящие область или центроид, не зависели от других классов. Как и должно быть!

Тогда я захотел перейти к представлению стиля буфера вершинного массива / индекса по другим причинам. Это означает, что все вершины хранятся в одном массиве, расположенном в объекте Scene , и каждый Треугольник сохраняет только ССЫЛКИ на вершины в Сцена , но не копии самих вершин. Сначала я попытался переключиться на указатели:

class Scene
{
    std::vector masterVertexList ;
} ;

class Triangle
{
    Vertex *a,*b,*c ; // vertices a, b and c are pointers
    // into the Scene object's master vertex list
} ;

(Если вам интересно узнать о преимуществах, я сделал это по причинам, главным образом связанным с треугольниками, которые разделяют вершины. Если * a перемещается, то все треугольники, которые используют эту вершину, обновляется автоматически).

Это было бы действительно хорошим решением! Но это не сработало надежно, , потому что std :: vector делает недействительными указатели , а я использовал std :: vector для списка главных вершин в классе Scene .

Так Мне пришлось использовать целые числа:

class Triangle
{
    int a,b,c ; // integer index values
    // into the Scene object's master vertex list
} ;

Но теперь у меня есть эта новая проблема связи: чтобы найти свою собственную область или центроид, классу Треугольнику нужен доступ к сцене класса , где раньше этого не было , Похоже, что я что-то не так с fsck`ом, но не совсем.

WWYD?

6
задан Community 23 May 2017 в 09:57
поделиться