从另一个类启动类的构造函数

Initilize constructor of class from another class

本文关键字:构造函数 启动 另一个      更新时间:2023-10-16

我有带有构造函数 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();
}

它适合你吗?