首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setters和getter的模板

setters和getter的模板
EN

Stack Overflow用户
提问于 2010-11-16 22:23:32
回答 6查看 9K关注 0票数 8

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

代码语言:javascript
复制
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。它的编码风格好吗?

代码语言:javascript
复制
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);

我的意思是,getter应该始终是const,setter应该作为对对象的参数引用,而不是复制它,这可能会慢一点?

EN

回答 6

Stack Overflow用户

发布于 2010-11-16 23:50:37

哈罗,反对者!

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

代码语言:javascript
复制
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;
};
票数 4
EN

Stack Overflow用户

发布于 2010-11-16 22:30:52

以较少需要getter和setter的方式设计您的程序。您可以通过宏创建它们,或者实现某种属性语法(这是可能的,但总会有一些东西不能正常工作)。但是,我认为在需要时编写访问器或使用IDE生成访问器是最好也是最常用的方法。

至于你的第二个问题,你应该至少在对象类型中使用它,对于原语来说你并不真正需要它。就我个人而言,如果我无论如何都需要对象的副本,我也不会使用它,但是其他人可能会说,显式地这样做可能会更好。

票数 2
EN

Stack Overflow用户

发布于 2010-11-16 22:43:36

我看不到直接帮助您压缩getter/setter对的模板化方法,除非您想将成员包装在模板化的访问器类中,如this。另一种可能是使用#define宏来模拟C#属性(如果宏不会吓到您或任何阅读您代码的人)。

getters是否返回(const)对成员的引用,返回指向成员的指针,还是复制它们取决于几个因素。您必须考虑复制它们是否代价高昂(性能方面),复制它们在语义上是否有意义,以及您返回的信息是否有可能比您从中获取它的类更持久(如果您返回一个指向成员的指针/引用,那么一旦删除对象,它就会悬空)。如果你想允许成员为空的可能性,我会使用指针而不是引用。

对于getter,我倾向于为任何东西返回const引用,除了我复制的原语。对于setter,通常会有一个const引用参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4195100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档