从另一个类启动类的构造函数
Initilize constructor of class from another class
我有带有构造函数 A(int a) 的类 A
啊
calss A{
public : A(int 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()'
"
问题是A
没有默认构造函数(因为如果您定义另一个构造函数并且不会生成默认构造函数),因此A
对象不能默认构造。
解决方案是对B
的每个构造函数使用构造函数初始化列表,其中您调用了 tmp
的相应构造函数。
class B {
A tmp;
public:
B() : tmp(4) {}
};
如果可以使用 c++11,并且在您创建的B
的每个(或至少大多数)构造函数中,tmp
使用方式相同,则可以使用:
class B {
A tmp{4};
public:
B() {};
}
构造函数不应具有返回类型。删除声明中的空白,您应该很高兴。你的B班也是如此。
构造函数是没有任何返回类型的特殊成员函数。
//A tmp(4); //this giving syntax error
这肯定会给你一个错误,因为你提到
void A(int a)
这不是构造函数;因为它有返回类型(void)。当您显式定义参数化构造函数(如 A(int a))时,默认构造函数将消失,对于此语句
A tmp;
要进行编译,您必须提供自己的默认构造函数。
总是发布完整的错误消息会很棒。
而不是得到"没有匹配的调用函数",我相信你会得到以下错误:
error: no matching function for call to ‘A::A()’
note: A::A(int)
这清楚地表明您的代码中缺少默认构造函数 A::A(),因为您已经提供了自己的构造函数。
建议:您已定义转换构造函数。最好使用"显式"关键字。
*.h 文件
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();
}
它适合你吗?
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 如何启动地图的复制构造函数?
- 在没有复制构造函数的对象的成员函数中启动 std::thread
- 稍后在构造函数中重新启动异常指令删除此指令
- 如何在类构造函数内部对同一类的成员函数启动pthread
- 将错误作为 Keys::KEYS 必须由构造函数启动
- 如何重新计算启动3D矢量的构造函数
- C++11 线程:在构造函数中启动并在析构函数中加入
- 在构造函数中使用"this"启动线程是安全的?
- 尝试在<int>构造函数中使用 vector 启动类时出错
- 构造函数中成员启动列表的计算顺序
- 从另一个类启动类的构造函数
- 没有用于启动"ostream_iterator"的匹配构造函数<int>
- 声明和访问在构造函数c++中启动的2D-vector
- [C++]:关于构造函数中的启动列表的问题
- 使用类构造函数在线程中启动成员函数
- 构造函数中变量的启动不起作用,而是给我一个随机数