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 的 3 arg 构造函数(在 Ex#1 中)的调用方式与 A 的 3 arg 构造函数的调用方式(在 Ex#2 中)相同。

在这两个示例中,代码似乎与我几乎相同。

4

4 回答 4

1

当我试图稍微简化我的示例时,我不小心遗漏了两件重要的事情:SessionMediator 类中的其他数据成员。

问题是我有两个额外的 Tilemap 类成员(“background_”和“foreground_”),它们没有像第一个成员“map_”那样在构造函数初始化列表中初始化。

构造函数应更改为:

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

对于在这个问题上浪费的任何时间,我深表歉意;事实证明,事情要简单得多。希望其他人会看到这个问题并意识到他们所犯的错误。

于 2012-10-24T01:37:36.427 回答
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 回答
0

我唯一能想到的是,如果您使用的是copy constructor

SessionMediator a = b;或者SessionMediator a (b);

您可能会遇到默认复制构造函数SessionMediator会尝试使用默认构造函数的情况,Tilemap这会导致您遇到错误。

于 2012-10-23T19:42:45.167 回答
-1

好吧,当你这样做时:

 Tilemap map_;

您正在调用默认 ctor - 但您没有定义一个,这是错误消息。

额外的:

 Tilemap::Tilemap(const Tilemap&)

C++ 生成一个为您提供参考的 ctor。所以有效的匹配是(1)你定义的那个需要 3 个 args 和(2)自动生成的那个需要 const ref。

于 2012-10-23T19:30:37.040 回答