这是一个基本问题,但给我带来了困难。我有类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()
表达式必须具有类类型
有人知道如何在另一个类头文件中正确定义另一个类的构造函数吗?并在主类构造函数中调用其他构造函数并全局使用其他类的函数?很抱歉出现基本且令人困惑的问题。
答案 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 中的逻辑。