我有A类,带有构造函数A(int a)
A.H
calss A{
public : A(int a);
}
A.cpp
#include "a.h"
#include <iostream>
A::A(int a)
{
std::cout<<a<<end;
}
我需要从另一个B类初始化这个类,
我试过
B.h
class B{
public : B();
A tmp;
//A tmp(4); //this giving syntax error
}
和
B.cpp
B(){
tmp = A(4);
}
但我收到编译错误“error: no matching function for call to 'A::A()'
”
答案 0 :(得分:3)
问题是A
没有默认构造函数(因为如果你定义了另一个构造函数并且没有生成默认构造函数),那么A
个对象就不能默认构造。
解决方案是使用B
的每个构造函数的构造函数初始化列表,在其中为tmp
调用相应的构造函数。
class B {
A tmp;
public:
B() : tmp(4) {}
};
如果您可以使用c ++ 11,并且在B
的每个(或至少大多数)构造函数中,您可以使用相同的方式创建tmp
:
class B {
A tmp{4};
public:
B() {};
}
答案 1 :(得分:1)
构造函数不应该有返回类型。删除声明中的空白,你应该好好去。你的B班也一样。
答案 2 :(得分:1)
构造函数是特殊的成员函数,没有任何返回类型。
//A tmp(4); //this giving syntax error
这肯定会因为你提到
而给你一个错误 void A(int a)
这不是构造函数;因为它有返回类型(void)。 当您明确定义参数化构造函数(如A(int a))时,默认构造函数将消失并且对于此语句
A tmp;
要编译,你必须提供自己的默认构造函数。
答案 3 :(得分:1)
总是发布完整的错误消息会很棒。
我确信您会收到以下错误,而不是“没有匹配的功能”:
error: no matching function for call to ‘A::A()’
note: A::A(int)
这清楚地表明代码中缺少默认构造函数A :: A(),因为您提供了自己的构造函数。
建议:您已定义转换构造函数。最好使用“显式”关键字。
答案 4 :(得分:1)
*。h file
class A
{
public:
A(int a);
};
class B
{
public:
B();
A *tmpA;
};
* .cpp文件
A::A(int a)
{
MessageBox(NULL,L"",L"", MB_OK);
}
B::B()
{
tmpA = new A(4);
}
使用
{
B *b = new B();
}
对你来说是对的吗?