在基类和派生类之间正确设置函数的返回

时间:2019-04-11 09:57:19

标签: c++ class oop types

我对以下任务有疑问。我有两个类Config(基础)和Ising(派生),每个类的std::array为12 bool。我创建了一个函数Incr(),该函数执行以下操作

-如果数组的第i个元素为假Incr()将其设置为true并退出;

-如果数组的第i个元素为true,则将其设置为false,然后移至第i + 1个元素。

Incr()必须能够正常工作,如果我两次调用它(如foo.Incr().Incr()),所以我认为它应该返回对Config的引用

现在我需要(练习)创建4096个std::vector对象的Ising对象,这些对象都是通过将Incr()应用于先前的Ising对象而创建的。事实是该函数返回Config ...

我可以将其设置为返回一个Ising,但是对于具有返回其派生类的对象的基类方法来说,这似乎是一个非常糟糕的设计选择。

我想知道是否有更优雅的方法

这就是我正在使用的:

class Config {
public:

//ctor
  Config(){
    for(auto i=m_arr.begin(); i !=m_arr.end(); i++){
      *i = false;
    }
  };

//incr function
  Config& Incr(){
    for(auto i = m_arr.begin(); i != m_arr.end(); i++){
      if(*i ==false){*i = true; return *this;}
      else{
        *i=false; 
      }
    }
     return *this;
  };

private:
  std::array<bool,12> m_arr;

};


class Ising: public Config{
public:
  Ising(double g =1): m_g(g){
    };


private:
  double m_g;
};

int main(){
  Config f; //check ctor
  Ising is(3);
  is.Incr();
  std::vector<Ising> vec;
  vec.push_back(is);
  for(int i=0; i < 4096; i++){
    vec.push_back(vec[i].Incr());
 }

  return 0;
}

感谢所有能提供帮助的人

1 个答案:

答案 0 :(得分:2)

这是怎么了?无需重新设计。

Ising is(3);
is.Incr();
std::vector<Ising> vec;
vec.push_back(is);
for (int i = 0; i < 4096; i++) {
    vec[i].Incr();
    vec.push_back(vec[i]);
}