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

Posted

技术标签:

【中文标题】如何在另一个类头文件中定义类构造函数?【英文标题】:How to define class constructor inside another class header file? 【发布时间】:2019-03-20 09:35:02 【问题描述】:

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

啊.h

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

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

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()

表达式必须有类类型

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

【问题讨论】:

B b(); is a function declaration 我认为你的术语有点不对劲。它看起来更像是您想要定义一个成员变量(不是构造函数)然后初始化该成员(而不是调用构造函数)。有好书清单here. 【参考方案1】:

这不是构造函数:

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 ()  

【讨论】:

感谢使用参数的额外解释。所以A::A () : b(constructor parameters) 这叫做构造函数委托对吗? @gameon67 不,这是成员初始化列表。构造函数委托是使用类本身的名称,但b 是成员变量的名称。比如A::A(int x) : A(), b(x) 是构造函数委托 我明白了,感谢您的澄清。构造函数委托对我来说是一个新事物,所以我想念用其他术语解释它【参考方案2】:

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

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

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

要在头文件a.h 内(代码中)构造B,头文件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

As构造函数的定义

A() : b()   ;

使用初始化列表来初始化(构造)成员b。这假定类 B 有一个不接受任何参数的构造函数。

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

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

不是你描述的。它实际上是一个类A的成员函数的声明,它被命名为b(),并返回一个B。调用此类函数通常需要B拥有一个工作构造函数(通常是复制或移动构造函数)。但是,这样的声明不是B 的构造函数。

【讨论】:

【参考方案3】:

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 .

【讨论】:

以上是关于如何在另一个类头文件中定义类构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个类中使用带有构造函数的类?

Kotlin 类与继承

如何允许移动构造并禁止分配和复制类的构造

如何在C ++中的另一个类中声明一个类的构造函数

在 C++ 中使用参数在构造函数中定义自己的类的数组

在另一个类的声明中将参数传递给类构造函数