我有这样的情况,有两个类,每个类都需要另一个的构造函数。这要求他们不仅要看到声明(原型),还要同时看到彼此的定义,这是不可能的。这意味着每个类必须至少从上面看到另一个构造函数的原型。
这是我的代码:
#include <iostream>
class Euros;
Euros::Euros(double euros = 0);
class Dollars
{
private:
double m_dollars;
public:
Dollars(double dollars = 0) : m_dollars(dollars)
{
}
operator double() const { return m_dollars; }
operator Euros() const { return Euros(m_dollars * 0.89); }
double getDollars() const { return m_dollars; }
void setDollars(double dollars) { m_dollars = dollars; }
};
class Euros
{
private:
double m_euros;
public:
Euros(double euros) : m_euros(euros)
{
}
operator double() const { return m_euros; }
operator Dollars() const { return Dollars(m_euros * 1.12); }
double getEuros() const { return m_euros; }
void setEuros(double euros) { m_euros = euros; }
};
这里,对于每个类,类型相互转换的操作是重载的,为此需要返回一个使用构造函数新创建的对面类的实例。欧元级的一切都很好,因为 它看到了 Dollars 类的完整定义,这意味着它也看到了构造函数。对于 Dollars 类,情况正好相反:它根本看不到欧元。在第 3 行,我声明了 Euros 原型,但这还不够,因为 要创建一个对象,您还需要一个构造函数。
我知道一个类的方法只需要在它里面声明,定义可以在它外面。但我不知道是否可以做相反的事情:在类中定义它,并在它之前声明它。在第 4 行,我尝试执行此操作,但收到错误“无效使用不完整类型 'class Euros'”。当然,这个错误还导致了其他错误,但这个错误是所有问题的根源。
尝试 google 导致我意识到我无法用搜索引擎可以理解的语言提出问题。如何解决这个恶性循环?
只需将“交叉”方法(其中之一)的实现移到类定义之外并放在下面 - 在第二个类的定义之后
你自己在问题中写过这个:“我知道一个类的方法只需要在它内部声明,并且定义可以已经在它之外。” 您只需以通常的方式将这些知识应用于转换运算符,而不是以某种“反转”的方式应用于构造函数。