构造函数正在调用一个使用当前类类型的函数

Constructor is calling a function which is using the current class type

本文关键字:类型 函数 一个 调用 构造函数      更新时间:2023-10-16
NavCal(int in){ read(in, *this) } //constructor for NavCal class

构造函数主体中函数void read(int, &Navcal)的第二个参数是对NavCal类型对象的引用。

当构造函数的定义在NavCal类之外并且物理上在read函数之下时,没有问题。但目前我必须在NavCal类中定义构造函数。当在NavCal类之上正向声明read函数时,编译器在看到正向声明时不会理解什么是NavCal类。

Q: 如何解决这个坏循环,同时将构造函数的定义保留在类中?

请解决下方的代码狙击

#include <iostream>
std::istream &read(std::istream&, NavCal&);
struct NavCal {
NavCal() = default;
NavCal(std::istream &is)
{
read(is, *this);
}
int getPr() const { return pr; };
int pr;
};
// nonmember functions
std::istream &read(std::istream &is, NavCal& navCal_1)
{
is >> navCal_1.pr;
return is;
}

当正向声明NavCal类上方的读取函数时,编译器在看到正向声明时不会理解什么是NavCal类别。

所以转发声明NavCal

struct NavCal;
void read(int, NavCal&);
struct NavCal
{
NavCal() { read(42, *this); }
};

这正是前瞻性声明的真正目的。宣布一个函数只是照常工作。


你说得对,另一种可能性,也是我仍然会考虑的可能性,是将声明与定义分开:

// NavCal.h
struct NavCal
{
NavCal();
};
// MyReadingStuff.h
#include "NavCal.h"
void read(int, NavCal&);
// NavCal.cpp
#include "NavCal.h"
NavCal::NavCal()
{
read(42, *this);
}

…但这并不总是方便/后勤/可能的。

事实上,即使在最后一个例子中,我也可能只是在MyReadingStuff.h中转发声明NavCal,以保存不必要的include(然后传播!(。所以这有点没有意义。:(