[英]How to define class constructor inside another class header file?
这是一个基本问题,但给我带来了困难。 我有A
类A
并且要在头文件中从另一个头文件定义另一个类构造函数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.