【发布时间】:2010-09-06 16:08:38
【问题描述】:
我遇到了 2 个曾经很好分开的班级的问题,但现在他们想要结合。
没有过多讨论问题的细节,这里是:
我曾经有一个包含 3 个空间位置顶点的三角形类。
class Triangle
{
Vertex a,b,c ; // vertices a, b and c
} ;
程序中有很多 Triangle 实例,因此每个实例都保留了自己的顶点副本。 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 移动,则使用该顶点的所有三角形都会自动更新)。
这将是一个非常好的解决方案!但它不能可靠地工作,because std::vector invalidates pointers,我在 Scene 类中使用 std::vector 作为主顶点列表。
所以我不得不使用整数:
class Triangle
{
int a,b,c ; // integer index values
// into the Scene object's master vertex list
} ;
但是现在我遇到了这个新的耦合问题:要找到它自己的区域或质心,Triangle 类需要访问 class Scene,而之前它没有。看起来我已经 fsck`d 了一些东西,但不是真的。
WWYD?
【问题讨论】:
-
这种语言如何不可知?
-
这些课程让我想起了 George Costanza:“我已经耦合了!我已经耦合了!”
-
1 类到 2 类:youtube.com/watch?v=cVgBuwM9zcQ
-
看起来“场景”应该由“三角形”组成。您是否考虑过(并拒绝)这种可能性?