0

クラスBのメンバーを持つクラスAをコンパイルしようとしています。ここで、クラスBにはデフォルトのコンストラクターがなく、その唯一のコンストラクターには複数の引数が必要です。簡単ですよね?どうやらそうではありません...

クラスA:

class SessionMediator
{
 public:
  SessionMediator()
      : map_(16,100,100)
  {}

  Tilemap map_, background_, foreground_;
};

クラスB:

struct Tile2D;

class Tilemap
{
 public:
  Tilemap(const unsigned int tile_size, const unsigned int width, 
          const unsigned int height)
      : tiles_(NULL), tile_size_(tile_size)
  {
    Resize(width, height);
  }

  inline void Resize(const unsigned int width, const unsigned int height)
  { /* Allocate tiles & assign to width_, height_... */ }

  unsigned int tile_size_, width_, height_;
  Tile2D* tiles_;
};

私は次のようにSessionMediatorをインスタンス化しています:

int main(int argc, char** argv)
{
  SessionMediator session;
  return 0;
}

これは私が得ているエラーです。Mac OS 10.5.8でXCodeをコンパイルしていますが、コンパイラはg++です。

session_mediator.h: In constructor 'SessionMediator::SessionMediator()':
session_mediator.h:19: error: no matching function for call to 'Tilemap::Tilemap()'
tilemap.h:31: note: candidates are: Tilemap::Tilemap(unsigned int, unsigned int, unsigned int)
tilemap.h:26: note:                 Tilemap::Tilemap(const Tilemap&)
session_mediator.h:19: error: no matching function for call to 'Tilemap::Tilemap()'
tilemap.h:31: note: candidates are: Tilemap::Tilemap(unsigned int, unsigned int, unsigned int)
tilemap.h:26: note:                 Tilemap::Tilemap(const Tilemap&)

(Duplicate of above here)
Build failed (2 errors)

私は基本的に同じことを行う短いコンパイル可能な例を書き、私が間違っていることを正確に理解しようとしました。これは、g++でエラーなしで問題なくコンパイルされます。

class A
{
 public:
  A(int x, int y, int z)
      : x_(x), y_(y), z_(z)
  {}  

  int x_, y_, z_; 
};

class B
{
 public:
  B() 
    : m_a(1,2,3)
  {}  

  A m_a;
};

int main(int argc, char **argv)
{
  B test;
  return 0;
}

最初の例で失敗するのはなぜですか?Tilemapの3argコンストラクター(Ex#1)は、Aの3 argコンストラクター(Ex#2)が呼び出されるのと同じ方法で呼び出されます。

コードは、2つの例の私とほとんど同じように見えます。

4

4 に答える 4

1

例を少し単純化しようとしていたので、誤って2つの重要なことを省略しました。SessionMediatorクラスの他のデータメンバーです。

問題は、Tilemapクラスの2つの追加メンバー("background_"と"foreground_")があり、最初のメンバー"map_"のようにコンストラクター初期化リストで初期化されていなかったことです。

コンストラクターは次のように変更する必要があります。

SessionMediator()
    : map_(16,100,100), background_(1,1,1), foreground_(1,1,1)
{}

この質問にご迷惑をおかけしましたことをお詫び申し上げます。それははるかに単純なものであることが判明しました。うまくいけば、他の誰かがこの質問を見て、彼らが犯している間違いに気付くでしょう。

于 2012-10-24T01:37:36.427 に答える
0

私が考えることができる唯一のことは、あなたがcopy constructor:を使用しているかどうかです。

SessionMediator a = b;またSessionMediator a (b);

のデフォルトのコピーコンストラクターがSessionMediatorデフォルトのコンストラクターを使用しようとするTilemapと、エラーが発生する状況になる可能性があります。

于 2012-10-23T19:42:45.167 に答える
0

map_(16u,100u,100u)SessionMediatorコンストラクター呼び出しを入れて、定数を符号なしにしてみてください。これが今頭に浮かぶ唯一のことです:-)。

これは私にとってはうまくコンパイルされます:

class Tilemap
{
public:
    Tilemap(const unsigned int tile_size, const unsigned int width, 
        const unsigned int height)
    {
    }
};

class SessionMediator
{
public:
    SessionMediator(): map_(16u,100u,100u){}

    Tilemap map_;
};
于 2012-10-23T20:10:00.737 に答える
-1

さて、あなたがするとき:

 Tilemap map_;

デフォルトのctorを呼び出していますが、定義されていないので、それがエラーメッセージです。

余分に:

 Tilemap::Tilemap(const Tilemap&)

C ++は、参照を取得するctorを生成します。したがって、有効な一致は、(1)3つの引数を取る定義したものと、(2)constrefを取る自動生成されたものです。

于 2012-10-23T19:30:37.040 に答える