0

これが取引です。クラスFとクラスOの2つの異なるクラスがあります

class F {
    private:
        int x;
        int y; 
    public:
        int getXf(){ return x; }
        int getYf(){ return y; }
        f(int ,int);
};

class O {
    private:
        int n;
        int k;
        int x;
        int y;
        char type;
        int id;
        int t;
    public:
        O(int ,int ,int ,int ,int);
        int getX(){ return x; }
        int getY(){ return y; }
};

そして、値を初期化する3番目のクラスPがあります。クラスでは、オブジェクトの2つの配列を作成しています。

class Prog {                                                                   
    public:
        int count;
        int fcount;
        O *o[]; //here we are declaring the arrays of objects
        F *f[];           
    public :
        //void init(); Here is the function where we initializing the values
};

ここで、オブジェクトを作成しているステートメントの2つです。

for(int i=0;i<10;i++){
        randx = rand() % 10;
        randy = rand() % 20;

        o[i] = new O(100,50,i,randx,randy);
    }


    for(int i=0;i<3;i++){
        randx = rand() % 10;
        randy = rand() % 10;

        f[i] = new F(randx, randy);
    }

印刷するとき、すべてのオブジェクトがここにありますが、最初のクラスの最初の3つは秒のオブジェクトに置き換えられます。正確には、それぞれ10050(1st for)fromrandxrandy(2nd for)です。

4

3 に答える 3

6
O *o[];

これは、不完全な型である不明なサイズの配列を宣言します。C++ では、これをクラス メンバーとして使用することはできませんが、一部のコンパイラでは、サイズがゼロの配列として解釈して、拡張として使用できます。いずれにせよ、それはあなたが望むものではありません。

コンパイル時にバインドされた配列がわかっている場合は、それを指定する必要があります。

O *o[10];

それ以外の場合は、実行時に配列を動的に割り当てる必要があります。

std::vector<O*> o;

for(int i=0;i<10;i++){
    randx = rand() % 10;
    randy = rand() % 20;

    o.push_back(new O(100,50,i,randx,randy));
}

また、配列内の生のポインタではなく、オブジェクト、またはおそらくスマート ポインタを格納することをお勧めします。なんらかの理由で本当に生のポインターが必要な場合は、オブジェクトを使い終わったら、オブジェクトを削除することを忘れないでください。これは、自動的には行われないためです。また、Rule of Three を忘れないでください。

于 2013-01-10T14:48:35.480 に答える
5

配列を宣言していますが、それらにメモリを割り当てることはありません。表示されているのは、コードがスタック全体をどのように歩いているかです。

より適切なもの:

struct X {}; struct Y {};

class P {
public:
  P() : xs(new X*[10]), ys(new Y*[10]) { init(); }

  ~P() {
    // delete all objects
    for(std::size_t i = 0; i < 10; ++i)
      delete xs[i];
    for(std::size_t i = 0; i < 10; ++i)
      delete ys[i];

    delete[] xs;
    delete[] ys;
  }
private:
  void init() {
    // initialize
    for(std::size_t i = 0; i < 10; ++i)
      xs[i] = new X();
    for(std::size_t i = 0; i < 10; ++i)
      ys[i] = new Y();
  }

  // prevent assignment and copy
  P& operator=(const P& other);
  P(const P&);

  X** xs;
  Y** ys;
};

もちろん、 std::vectorデータを保存するためだけに使用する場合、この魔法はすべて不要になります。

于 2013-01-10T14:40:06.370 に答える
1

問題は、配列を宣言する方法によるものです。

O *o[/*No size here*/];
F *f[/*No size here*/];

配列のサイズを述べていないため、これは次と同等です

O **o;
F **f;

したがって、 「O へのポインターへのポインター」型と「F へのポインターへのポインター」型の 2 つのメンバーをそれぞれ宣言していますが、これらは初期化されておらず、それらが指すためのメモリを割り当てていません。つまり、実際には配列はなく、必要な配列のタイプを参照するために使用できるポインターだけです。

コンパイル時に使用するサイズがわかっている場合は、宣言でそのサイズを指定する必要があります。これにより、そのサイズの適切に割り当てられた配列が得られます。それ以外の場合は、 の使用を検討してstd::vectorください。

于 2013-01-10T14:47:44.123 に答える