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

3

这是一个基础问题,但是让我很难受。我有一个类A,在头文件中,我想定义另一个来自另一个头文件的类构造函数B。我尝试了下面的代码,但我确定那不是正确的方式。

A.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()处。

表达式必须具有类类型

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


2
B b(); 是一个函数声明。 - Ayxan Haqverdili
2
我认为你的术语有点错误。看起来更像是要定义成员变量(而不是构造函数),然后初始化该成员(而不是调用构造函数)。这里有一份好书单链接 - molbdnilo
3个回答

5

这不是一个构造函数:

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
@gameon67 不是的,这是成员初始化列表。构造函数委托是当类本身的名称被使用时,但 b 是一个成员变量的名称。例如 A::A(int x) : A(), b(x) {} 就是构造函数委托。 - Michael Veksler
我明白了,感谢您的澄清。构造函数委托对我来说是一个新的东西,所以我误解它与其他术语。 - gameon67

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的成员,名为bA的构造函数定义。
A() : b()  {} ;

使用初始化列表来初始化(构造)该成员b。这假设类B有一个可以接受无参数的构造函数。

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

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

不是你所描述的那样。实际上,它是类A的成员函数声明,名为b(),返回一个B。调用这样的函数通常需要B具有一个可用的构造函数(通常是复制或移动构造函数)。然而,这样的声明并不是B的构造函数。


0

只需在A.h中包含#include "B.h",并在A.h中拥有B b;对象。

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

这样编译器将从 B类 的构造函数和其他函数中获得所需的所有信息,用于编译单元 A.cpp,链接器稍后将把函数名链接到其在另一个编译单元B.cpp 中的逻辑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接