【发布时间】:2019-09-01 22:12:34
【问题描述】:
我对以下任务有疑问。我有两个类Config(base) 和Ising(derived),每个类都有一个std::array 12 bool。我创建了一个函数Incr(),它执行以下操作
-如果数组的第i个元素为假Incr()设置为真并退出;
-如果数组的第 i 个元素为真,则将其设置为假,然后移动到第 i+1 个元素。
Incr() 如果我调用它两次(如foo.Incr().Incr())就必须工作,所以我认为它应该返回对Config 的引用
我现在需要(这是一个练习)创建一个 std::vector 的 4096 个 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;
}
感谢所有愿意提供帮助的人
【问题讨论】:
-
由于您在示例中知道
vec[i].Incr()返回对Config的引用,实际上是Ising,因此可以将其显式转换为Ising。请记住,向量的push_back()复制值 - 它不存储引用。