我有一个名为'vertex'的类的两个版本,一个使用坐标的直接访问器:
struct vertex
{
// Coordinates
std::array<double, 3> coords;
// Direct accessors
double & x;
double & y;
double & z;
// Constructor
template<typename... T> vertex(T &&... coordinates) :
coords{{ std::forward<T>(coordinates)... }},
x( coords[0] ), y( coords[1] ), z( coords[2] )
{ }
};
和其他使用访问功能的人:
struct vertex
{
// Coordinates
std::array<double, 3> coords;
// Access functions
double & x() { return coords[0]; }
double & y() { return coords[1]; }
double & z() { return coords[2]; }
// Constructor
template<typename... T> vertex(T &&... coordinates) :
coords{{ std::forward<T>(coordinates)... }}
{ }
};
对于这种特定情况,哪种方法更好?我将不胜感激任何其他建议。谢谢!
答案 0 :(得分:2)
我认为吸气剂更好。第一种方法创造了更大尺寸的物体,没有真正的好处。
答案 1 :(得分:2)
我通常会通过函数来进行封装。
但这是一个非常特殊的情况,因为你正在处理顶点。如果你计划操纵很多这些对象(渲染或变形网格),那么直接访问在性能方面有一些好处。
一些图形库在实时环境中使用直接访问(以及一些书籍也建议)用于类似矢量的操作,其中效率是必须的。
例如,请查看Ogre::Vector3。
尽管我不会在你的第一个解决方案中做你正在做的事情。像其他说的那样 你无缘无故地将已用空间加倍(最终有很多顶点)。 从我的观点来看,在高性能的背景下,这可能是最好的顶点:
class Vertex
{
public:
double X;
double Y;
double Z;
};
答案 2 :(得分:1)
我会使用该功能 - 它可以让您在将来更轻松地改变主意。此外,你不能这样做:
double & x() { return coords[0]; }
double & y() { return coords[1]; }
double & z() { return coords[2]; }
double x() const { return coords[0]; }
double y() const { return coords[1]; }
double z() const { return coords[2]; }
带有访问者。
答案 3 :(得分:1)
好吧,我会说第一个更好的原因有几点:
话虽如此,第二种方法也有优势,例如不变的界面对变化更具弹性。我仍然坚持第一个。
答案 4 :(得分:0)
如果你真的想要对成员进行直接写访问(在你看来你可以这样做,可能在这种情况下适合),那么我会建议使用内联函数。如果您愿意,这使您可以灵活地分析并在将来为访问注入额外的功能。
答案 5 :(得分:0)
我认为最好的解决方案是删除第二个选项的引用并添加setter。但如果这些是唯一的选择,那么第二种选择会略好一些。