从另一个类初始化类的构造函数

时间:2014-12-31 11:04:32

标签: c++

我有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()'

5 个答案:

答案 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();
}

对你来说是对的吗?