【问题标题】:How can I create an array of class objects whose constructor require few arguments?如何创建一个类对象数组,其构造函数需要很少的参数?
【发布时间】:2012-11-11 10:50:04
【问题描述】:

我已阅读有关解决方案 const A a[3] = { {0,0}, {1,1}, {2,2} }, 但在我的程序中 const 无法使用:

class Paper: public PaperQueue{  
  ...
  protected:
    typedef int (Utils::*funcPtr) (int, int); //I use external function there
    funcPtr p;                               
    Utils* fptr; 
  public:
    int pricefunc(){     
      addprice = (fptr->*p) (t,price);
    }

    Paper(int n, unsigned int pr):PaperQueue(n){         
       ...
       p=&Utils::commonpricefunc;    
    }
    void Put(int a){ 
       ...
    }
  ...
}    

class Bank{ 
  ...
  void Buy(Paper &p){
   (/*this function modifies many parameters in 'p'*/)
  ...
  }
  ...
}

int main(){
Bank B;    
int pn=5;
/* ? */ const Paper p[pn] = {{5,15},{5,15},{5,15},{5,15},{5,15}}; /* ? */
int paperloop=0;
...
p[paperloop].Put(p[paperloop].addprice);
B.Buy(p[paperloop]);
...

这给了我很多错误(使用 pricefunc()、Put()、Buy()、...),或者只是“可能未初始化可变大小的对象‘p’”。有没有办法让这个数组工作? (如果不向构造函数传递任何参数,一切正常!)

【问题讨论】:

  • 我需要创建一个数组,比如Paper (p[pn])(5,25) 之类的......每个构造函数都应该接收这些参数,而p[i] 不应该是只读对象。
  • 那只是代码中的粗体标记。

标签: c++ arrays class parameters constructor


【解决方案1】:

您不能对类(非 POD)使用初始化列表,因为这会绕过对构造函数的调用。您必须通过以下方式将其更改为 POD 或使用 std::vector:

如果类是可复制的,就像它看起来那样,你可以创建一个 std::vector 并用你想要的值填充它:

const vector<Paper> papers(5, Paper(5, 15));

如果你想用不同的值来初始化它,你可以使用一个初始化列表,但这只在 C++11 中支持:

const vector<Paper> papers = {Paper(1, 1), Paper(2, 2)};

如果没有 C++11,你将不得不一个一个地添加元素,但是你不能将向量设为 const:

vector<Paper> papers;
papers.push_back(Paper(1, 1));
papers.push_back(Paper(2, 2));

【讨论】:

  • 谢谢! int pn=5; vector&lt;Paper&gt; p(pn, Paper(5, 15)); 做到了。至少有些东西。
【解决方案2】:

请检查下面的代码,可以编译:

class Paper {
public:
    int x, y;
}; 

int main() {
    Paper p[5] = {{5,15}, {5,15}, {5,15}, {5,15}, {5,15}};
}

详情请参考this post,我觉得解释的很好

【讨论】:

  • 代码在 g++ 4.6.3 上兼容,但在我的程序 {5,15} 中是我尝试传递给构造函数的参数。
  • 好的,谢谢!当我写 p[5] 时,它似乎可以处理警告“警告:扩展初始化列表仅适用于 -std=c++0x 或 -std=gnu++0x ”
  • 有没有可能让它更漂亮?我希望有类似 p[n]...
猜你喜欢
  • 2017-05-24
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多