У меня проблема с двумя классами, которые когда-то были хорошо разделены, но теперь они хотят соединиться.
Не вдаваясь в подробности проблемы, вот она:
Раньше у меня был класс Triangle, который содержал 3 вершины в пространстве.
class Triangle
{
Vertex a,b,c ; // vertices a, b and c
} ;
В программе было много экземпляров Треугольника, поэтому у каждого была своя копия своих вершин. Функции-члены, такие как getArea()
, getCentroid()
и т. Д., Были написаны в классе Triangle
, и, поскольку каждый экземпляр Triangle
имел копии вершин a, b и c, обнаружение области или центроида не зависело от других классов. Как и должно быть!
Затем я захотел перейти к представлению стиля буфера вершинного массива / индекса по другим причинам. Это означает, что все вершины хранятся в одном массиве, расположенном в объекте Scene
, и каждый Triangle
сохраняет только ССЫЛКИ на вершины в Scene
, а не копии самих вершин. Сначала я попробовал переключиться на указатели:
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
} ;
(Если вам интересно узнать о преимуществах, я сделал это по причинам, главным образом связанным с треугольниками, которые имеют общие вершины. Если * a перемещается, все треугольники, которые используют эту вершину, обновляются автоматически).
Это было бы действительно хорошим решением! Но это не сработало надежно, , потому что std :: vector делает недействительными указатели , и я использовал std :: vector для списка главных вершин в классе Scene
.
Поэтому мне пришлось использовать целые числа:
class Triangle
{
int a,b,c ; // integer index values
// into the Scene object's master vertex list
} ;
Но теперь у меня появилась эта новая проблема связи: чтобы найти свою собственную область или центроид, классу Triangle
нужен доступ к class Scene
там, где раньше его не было. Похоже, что я что-то заподозрил, но не совсем.
WWYD