构造函数列表中带有/ Multiple Arguments的构造函数不能正常工作C ++

时间:2012-10-23 19:26:32

标签: c++ xcode constructor g++ initialization

我正在尝试编译类A,它有一个类B的成员,其中类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 个答案:

答案 0 :(得分:1)

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

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

构造函数应更改为:

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

我为在这个问题上浪费的任何时间道歉;事实证明这是更简单的事情。希望其他人会看到这个问题,并意识到他们正在犯的错误。

答案 1 :(得分:0)

我唯一能想到的就是你使用copy constructor

SessionMediator a = b;SessionMediator a (b);

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

答案 2 :(得分: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_;
};

答案 3 :(得分:-1)

嗯,当你这样做时:

 Tilemap map_;

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

额外的:

 Tilemap::Tilemap(const Tilemap&)

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