繁体   English   中英

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

[英]How to define class constructor inside another class header file?

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

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

我需要在Ah调用构造函数B ,以便可以在构造函数A调用构造函数B ,还可以在A::Operation()中的Class B使用函数。

丙型肝炎

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

表达式必须具有类类型

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

这不是构造函数:

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

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

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

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

为了在头文件ah (输入)构造B ,头文件ah需要提供B声明及其构造函数的可见性。

例如,假设bh声明了B类,则标头ah可能会这样做

#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 s构造函数的定义

A() : b()  {} ;

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

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

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

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

仅在Ah中 #include "Bh"并拥有B b; 对象在Ah中

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

这样,编译器将获得class B构造函数和其他函数所需的所有信息,也适用于此编译单元A.cpp ,链接器将在以后将函数名称链接至其他编译单元B.cpp中的逻辑来完成其工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM