预制的课程实例

时间:2016-09-19 10:38:56

标签: c++ c++11

我有这样的课程:

class result{
public:
    int a;
    int b;
    int c;
};

a,b,c可以填充任何整数。然而,有一些着名的案例,我会过多地使用它们,例如(a = b = c = 0)的零案例或(a = b = c = 1)和其他一些人。

所以我想要一个简单的方法来获取这个实例,当我想要其中一个而不创建新对象并手动填充它时(真实案例包含更复杂的3个整数)。

我目前正在做的是这样的:

class result{
public:
    int a;
    int b;
    int c;
    static result get_zero(){
         return result{0,0,0};
    }
    static result get_idenity(){
         return result{1,1,1};
    }
};

并在主要:

auto id=result::get_identity();

这是实现我想要的好方法吗?有没有像这样的惯用方法?

4 个答案:

答案 0 :(得分:4)

如果在返回对象后可以修改它们,那么是的,这是正确的方法,因为你不能共享一个对象。

NRVO(http://en.cppreference.com/w/cpp/language/copy_elision)和move-semantics删除与按值返回对象相关的任何费用。

如果您知道永远不会更改这些对象,则可以返回result const &,并让对象本身成为您班级的静态成员。那时,你甚至在技术上都不需要getter / setter,因为静态成员是公共的并且已经标记为const。

class result{
public:
    int a;
    int b;
    int c;
    static result const zero_result{0,0,0};
    static result const & get_zero(){
         return result::zero_result;
    }
    static result const identity_result{1,1,1};
    static result const & get_idenity(){
         return result::identity_result;
    }
};
不过,不要忘记为.cpp文件中的静态数据成员分配内存:

result const result::zero_result;
result const result::identity_result;

答案 1 :(得分:2)

传统上我们可能只是创建一个static实例,您可以重复使用,从中复制等。

// someFile.h
extern const result ZERO, ID;

// someFile.cpp
const result ZERO{0, 0, 0};
const result ID{1,1,1};

或者,让您的类将这些实例作为static成员拥有,并让您的函数返回引用。

老实说,你现在的方法看起来效果很好,可能是最容易使用的。

答案 2 :(得分:1)

您的提案解决方案具有强大的编译器优化效率。实际上,当调用result::get_identity();时,会创建并返回新的result对象。

这将调用初始化构造函数,最好是调用移动构造函数。

您的编译器可能会使用RVO优化它。

从代码中创建 const static 对象可能是一个很好的方法,可以参考。

例如在你的班级中:

class Result {
  // something
  public:
    static const Result Zero;
    static const Result Identity;
};

// ... and then you can refer to it
do_something(Result::Zero);

通过这种方式,您可以引用只在程序启动时创建一次的对象,并避免始终实例化一个新的臭名昭着的对象。

答案 3 :(得分:-2)

你可以为你的结果制作一个静态类并使用它。我用c#制作的产品做了这个,效果很好