我的以下任务有问题。我有两个类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;
}


谢谢大家的帮助

最佳答案

这怎么了无需重新设计。

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]);
}

10-08 09:42