如何在另一个类头文件中定义类构造函数?

时间:2019-03-20 09:35:03

标签: c++ constructor header-files

这是一个基本问题,但给我带来了困难。我有类A,并且在头文件中,我想从另一个头文件定义另一个类构造函数B。我在下面尝试了此代码,我确定这不是正确的方法。

A.h

class A{
public:
    A();
    B b();  //Constructor from another Class that defined in another header file
    void Operation();
};

我需要在B中调用构造函数A.h,以便可以在构造函数B中调用构造函数A,还可以在其中的类B中使用函数A::Operation()

A.cpp

#include "A.h"
#include "B.h"
A::A{
    b();  //call constructor b
}

void A::Operation(){
    b.someFunction();  //use function from class B, error here
}

按预期,我得到的错误是在b.someFunction()

  

表达式必须具有类类型

有人知道如何在另一个类头文件中正确定义另一个类的构造函数吗?并在主类构造函数中调用其他构造函数并全局使用其他类的函数?很抱歉出现基本且令人困惑的问题。

3 个答案:

答案 0 :(得分:3)

这不是构造函数:

class A{
public:
    A();
    B b();  //This is a function named b, returning an object of type B
    void Operation();
};

与此处相同:

A::A{
    b();  //call function b from above, that returns a B object
}

这里也一样:

void A::Operation(){
    b.someFunction();  // Without invoking method b, you apply the dot operator on the method - which is illegal.
}

您可能想要一个B类型的对象,并在其上调用someFunction方法。也许你想要

class A{
public:
    A();
    B b; // this is object named b, of type B
    void Operation();
};

然后,如果B的构造函数需要参数,则可以:

A::A () : b(constructor parameters) {
}

如果不需要传递参数,则可以省略b的构造,而该语言将仅使用默认的B构造函数(不带参数)。

A::A ()  {
}

答案 1 :(得分:2)

调用或调用B的构造函数的方法是创建B的实例。

创建B实例的过程涉及调用/调用B的构造函数。实现(也称为编译器)负责在创建对象的过程中调用构造函数的机制。构造函数的工作是确保初始化该对象以供后续使用。

实际上,在除对象构造之外的任何上下文中调用构造函数都是没有意义的。在一些高级用例中,可以有效地手动调用构造函数(例如,使用placement new表达式初始化内存块,使其包含一个对象)。但是,这样做是为了从指定的内存创建对象。这与您要寻找的完全不同。

要在头文件B中(插入)构造a.h,头文件a.h必须提供B声明及其构造函数的可见性。

例如,假设b.h声明了类B,则标头a.h可能会这样做

#include "b.h"

class A
{
   public:
       A() : b()  {} ;
       void Operation();
   private:
       B b;      //  A contains an instance of B
};

在上面(自下而上)中,声明B b指定A具有类型为B的成员,名为b

A的构造函数的定义

A() : b()  {} ;

使用初始化程序列表初始化(构造)该成员b。假设类B的构造函数不能接受任何参数。

您在类A中拥有的声明(已从上面提供的示例中删除了该声明)

B b();  //Constructor from another Class that defined in another header file

不是您所描述的。它实际上是类A的成员函数的声明,该成员函数名为b()并返回B。调用此类函数通常需要B 拥有有效的构造函数(通常是副本或move构造函数)。但是,这样的声明不是B的构造函数。

答案 2 :(得分:0)

仅在{strong> A.h 中使用#include "B.h",并在 A.h 中使用B b;对象。

#include "B.h"
class A{
  A();
  B b;
  void operation();
}

通过这种方式,编译器将获得class B构造函数和其他函数所需的所有信息,以及该编译单元 A.cpp 的信息,链接器将在以后链接函数名称时完成其工作它在其他编译单元 B.cpp 中的逻辑。