7

私は解決策について読みまし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'が初期化されていない可能性があります」を与えます。この配列を機能させる方法はありますか? (コンストラクターにパラメーターを渡さなければ、すべて正常に動作します!)

4

2 に答える 2

3

クラス (非 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 がないと、要素を 1 つずつ追加する必要がありますが、その場合、ベクトルを const にすることはできません。

vector<Paper> papers;
papers.push_back(Paper(1, 1));
papers.push_back(Paper(2, 2));
于 2012-11-23T04:54:10.207 に答える
0

以下のコードを確認してください。コンパイルできます。

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

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

詳細については、この投稿を参照してください。非常によく説明されていると思います

于 2012-11-23T04:35:50.807 に答える