【问题标题】:Correctly set return of a function between base and derived class正确设置基类和派生类之间的函数返回
【发布时间】: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() 复制值 - 它不存储引用。

标签: c++ class oop types


【解决方案1】:

这有什么问题?无需重新设计。

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

【讨论】:

  • 这里的问题似乎是我试图用 Config(基类)的元素推回 Ising(派生类)的向量。因此,.cpp 将无法编译。但关键是,为了 Incr() 然后 pusback 我需要 Incr() 来返回 Ising 而不是 Config。还是我错过了什么?
  • @JacquesLeen 你是说我的代码不能编译吗?你是说它没有做你想做的事吗?我觉得没问题。
  • 没关系我指的是我之前的例子......你的作品
猜你喜欢
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多