0

次のようなクラスを定義しました。

 class CircularBuffer {
   private:
     struct entry {
       uint64_t key;
       int nextPtr;
       int prevPtr;
       int delta;
     };

     int head, tail, limit, degree;
     entry *en;
   public:
     CircularBuffer(int a, int b)
     {
       limit = a;
       head = 0;
       tail = limit -1;
       degree = b;
       en = new entry[ limit ];
       for (int i=0; i<limit; i++) {
         en[i].key = 0;
         en[i].delta = 0;
         en[i].nextPtr = 0;
         en[i].prevPtr = 0;
       }
     };
     ~CircularBuffer() { delete [] en; }
  };

そして、別のファイルにこのクラスを含めました(ヘッダーファイル)

 #include "circular.h"
 class foo {
    CircularBuffer cb;
    foo() {}   //ERROR LINE
    void initialize() {
       cb = new CircularBuffer(10, 2);
    }
 };

ただし、これには次のようなエラーがあります。

 error: no matching function for call to ‘CircularBuffer::CircularBuffer()’
 note: candidates are: CircularBuffer::CircularBuffer(int, int)
 note:                 CircularBuffer::CircularBuffer(const CircularBuffer&)

そして、それは私にこのようにすることを強います:

 #include "circular.h"
 class foo {
    CircularBuffer cb;
    foo()
      : cb( CircularBuffer(10, 2) )
    {}

    void initialize() {}
 };

ただし、2番目の実装は必要ありません。私は最初のものが欲しいです。どうすれば修正できますか?

4

5 に答える 5

1

デフォルトのコンストラクタを追加できます

CircularBuffer()
{
    // set a and b to default values
}
于 2013-04-10T10:06:10.510 に答える
0

これは可能なはずです

#include "circular.h"
class foo {
    CircularBuffer cb;
    foo() {}
    void initialize() {
        cb = CircularBuffer(10, 2);
    }
};

バージョンの問題newは、ポインターを返す を使用していたが、メンバー変数cbがポインターではないことでした。

ただし、最善の方法は

#include "circular.h"
class foo {
    CircularBuffer cb;
    foo() : cb(10,  2) {}
};

または、コンストラクターにパラメーターを渡したい場合

#include "circular.h"
class foo {
    CircularBuffer cb;
    foo(int a, int b) : cb(a,  b) {}
};
于 2013-04-10T10:05:47.770 に答える
0

そして、それは私にこのようにすることを強います:

...
foo()
  : cb( CircularBuffer(10, 2) )
{}
...

ただし、2番目の実装は必要ありません。私は最初のものが欲しいです。どうすれば修正できますか?

これを強制するのではなく、次のことを強制します。

: cb(10, 2)

これが C++ で初期化する方法です。オープニングの後に来るものはすべて{割り当てであり、初期化ではありません。

「修正」は、初期化の代入ではなく初期化を使用することです。好き嫌いはあまりありません。これは C++ です。

于 2013-04-10T10:10:04.910 に答える
0

cbポインタとして定義するだけ

#include "circular.h"
 class foo {
    CircularBuffer * cb;
    foo() {}   //ERROR LINE
    void initialize() {
       cb = new CircularBuffer(10, 2);
    }
 };

delete cb;そして、記憶を漏らさないようにどこかに忘れないでください。

于 2013-04-10T10:10:29.413 に答える
-1

cb はポインターではなく、「new」を使用しているため、エラーが発生します。

しかし、ところで...コンストラクタの初期化はより効率的です:D

于 2013-04-10T10:06:22.060 に答える