我正在尝试编译类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中)。
在这两个例子中,代码看起来与我完全相同。
答案 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参数。