У меня проблема со следующей задачей. У меня есть два класса Config
(базовый) и Ising
(производный), каждый из которых имеет std::array
из 12 bool
. Я создал функцию Incr()
, которая выполняет следующие действия:
- если i-й элемент массива равен false Incr()
устанавливает его как true и завершается;
- если i-й элемент массива равен true, устанавливает его в значение false и затем перемещается к 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;
}
Спасибо всем, кто поможет