繁体   English   中英

设置和获取方法的模板

[英]Templates for setters and getters

我对模板不熟悉,但是我想知道是否可以将它们用于setter和getter方法。 例如在这种情况下:

double exmlClass::getA(void) const
{
    return a_;
}



void exmlClass::setA(const double& a)
{
    a_ = a;
}



double exmlClass::getB(void) const
{
    return b_;
}

如您所见,方法几乎相同,除了它们引用另一个私有变量(a_,b_,c_)。 在这种情况下,是否有更优雅的方式来编写这些函数? 如果使用模板很常见,那么我将举例说明如何在上面的代码中使用它们。

我要问的另一个问题是,如何正确声明getter和setter。 编码风格好吗?

double getA(void) const;
void setA(const double& a);

double getB(void) const;
void setB(const double& b);

double getC(void) const;
void setC(const double& c);

我的意思是说,getters应该始终为const,setters则应将其作为对象的参数引用,而不是复制它,这可能会更慢一些?

哈罗对反对者!

Boost.Fusion.Map是您要寻找的基础。

namespace result_of = boost::fusion::result_of;

class MyClass
{
public:
  struct AType {};
  struct BType {};
  struct CType {};

  template <typename Type>
  typename result_of::at< DataType, Type >::type &
  access(Type) { return boost::fusion::at<Type>(mData); }

  template <typename Type>
  typename result_of::at< DataType, Type >::type const &
  get(Type) const { return boost::fusion::at<Type>(mData); }

  template <typename Type>
  void set(Type, typename result_of::at< DataType, Type >::type const & v)
  {
    boost::fusion::at<Type>(mData) = v;
  }

private:
  typedef boost::fusion::map <
    std::pair<AType, int>,
    std::pair<BType, std::string>,
    std::pair<CType, float> > DataType;
  DataType mData;
};

以某种方式设计程序,从而减少了对getter和setter的需求。 您可以通过宏来创建它们,也可以实现某种属性语法(这是可能的,但是总有一些事情不正确)。但是,我想只在需要它们时编写访问器,或者用您的IDE生成它们是最好,最平常的方式。

至于第二个问题,至少应将其用于对象类型,而对于基元则不需要。 就个人而言,如果我仍然需要该对象的副本,我也不会使用它,但是其他人可能会声称这样做明确可能会更好。

我看不到的方式进行模板化,以直接帮助您紧凑化您的getter / setter对,除非你想你的会员包裹内模板访问像类 另一种可能性是使用#define宏来模拟C#属性(如果宏不使您或任何阅读您的代码的人感到害怕)。

您的getter返回(const)对成员的引用,返回对成员的指针还是复制它们取决于一些因素。 您必须考虑复制它们(在性能方面)是否昂贵,在语义复制它们是否有意义 ,以及返回的信息是否应该比从中获取的信息寿命更长(如果您返回指向成员的指针/引用,删除对象后,该指针/引用将立即悬空。 如果要允许成员为null的可能性,我会在引用上使用指针。

对于吸气剂,我倾向于返回除原语以外的任何东西的const引用,这些原语是我复制的。 对于设置器,通常具有const引用参数。

从技术上讲,可以创建一个exmlClass::set<PMF>函数模板,以使exmlClass::set<&exmlClass::a_>有效。 但是,有什么意义呢?

从理论上讲,您可以:

template<typename A, typename B, typename C>
class Object
{
private:
    A _a;
    B _b;
    C _c;

public:
    Object()
    {
    };  // eo ctor

    // properties

    A getA() const {return(_a);}
    void setA(const A& _val) {_a = _val;}

    // etc for B & C
}; // eo class Object

    // .....

    Object<int, double, char> myObject;

我看到了几个问题。 首先,获取者/设置者在传达给班级用户的内容中不应“抽象”。 您将如何称呼此吸气剂/阻气剂? 得到() ? getAValue()? 那有什么意思?

其次,它定义了3。您需要多少个对象? 1 2 4 9

第三,应根据其功能适当地命名Getters / setter:

getName()
getAddress()
getMovie()

听起来您只是想节省输入时间,而不是让设计复杂化的借口。

关于第二点,返回对对象的引用(最好是const),但不要打扰小的整数POD(纯旧数据)类型,例如int,char,bool等。

不,您无法定义任何种类的模板,这些模板可以使用无限制的名称集(例如getAgetB ,...)来创建函数或类似函数的事物。

宏可以做到这一点,但这是一个更糟糕的主意。

我通常通过const引用来传递/返回一个类对象,但是简单的内置类型(如double只是按值):

public:
  const ClassType& getObj() const;
  void setObj(const ClassType& obj);
  double getNum() const;
  void setNum(double num);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM