Правильно установить возврат функции между базовым и производным классом - PullRequest
1 голос
/ 11 апреля 2019

У меня проблема со следующей задачей. У меня есть два класса 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;
}

Спасибо всем, кто поможет

1 Ответ

2 голосов
/ 11 апреля 2019

Что с этим не так?Нет необходимости в редизайне.

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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...