我对以下任务有疑问。我有两个类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;
}
感谢所有能提供帮助的人
答案 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]);
}