如何创建一个类对象数组,其构造函数需要很少的参数?

Slo*_*oke 7 c++ arrays parameters constructor class

我已阅读有关解决方案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]);
...
Run Code Online (Sandbox Code Playgroud)

That gives me a LOT of errors(with pricefunc(),Put(),Buy(),...), or just "variable-sized object 'p’ may not be initialized". Is there any way to make this array work? (Everything works fine if not to pass any parameters to constructor!)

use*_*015 3

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

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

const vector<Paper> papers(5, Paper(5, 15));
Run Code Online (Sandbox Code Playgroud)

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

const vector<Paper> papers = {Paper(1, 1), Paper(2, 2)};
Run Code Online (Sandbox Code Playgroud)

如果没有 C++11,您必须将元素一一相加,但随后您无法使向量为 const:

vector<Paper> papers;
papers.push_back(Paper(1, 1));
papers.push_back(Paper(2, 2));
Run Code Online (Sandbox Code Playgroud)