C ++:类中的直接访问器或访问函数?

时间:2012-08-09 18:06:27

标签: c++ class accessor

我有一个名为'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)... }}
    { }
};

对于这种特定情况,哪种方法更好?我将不胜感激任何其他建议。谢谢!

6 个答案:

答案 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)

好吧,我会说第一个更好的原因有几点:

  • 您不太可能在顶点坐标上执行其他处理中间设置或中间设置。
  • 由于顶点上的操作通常在循环中完成,而顶点通常与渲染有关,因此第一个选项(直接访问)可能会为您提供更好的性能。
  • 如果您要使用琐碎的getter和setter直接访问成员,则封装不是必须的。这只是教条的对象取向。

话虽如此,第二种方法也有优势,例如不变的界面对变化更具弹性。我仍然坚持第一个。

答案 4 :(得分:0)

如果你真的想要对成员进行直接写访问(在你看来你可以这样做,可能在这种情况下适合),那么我会建议使用内联函数。如果您愿意,这使您可以灵活地分析并在将来为访问注入额外的功能。

答案 5 :(得分:0)

我认为最好的解决方案是删除第二个选项的引用并添加setter。但如果这些是唯一的选择,那么第二种选择会略好一些。