给出2个类class Euro
和class Dollar
我已经使赋值运算符超载,因此相同类型的对象会彼此传递其私有值。
MRE:
#ifndef EURO_H
#define EURO_H
#include <iostream>
#include <iomanip>
#include "Dollar.h"
class Euro
{
public:
Euro();
~Euro();
Euro(int temporary);
Euro(const Euro &object);
Euro operator = (const Euro &other);
friend std::ostream & operator << (std::ostream &os, const Euro &object);
private:
double euro;
};
#endif // EURO_H
&
#ifndef DOLLAR_H
#define DOLLAR_H
#include <iostream>
#include <iomanip>
#include "Euro.h"
class Dollar
{
public:
Dollar();
~Dollar();
Dollar(int temporary);
Dollar(const Dollar &object);
Dollar operator = (const Dollar &other);
friend std::ostream & operator << (std::ostream &os, const Dollar &object);
private:
double dollar;
};
#endif // DOLLAR_H
现在,我正在尝试将将类型为Euro的对象分配给类型为Dollar的对象时,将欧元转换为美元的行为。
但是当声明另一个赋值运算符,例如Euro operator = (const Dollar &object)
时,即使我包含了Dollar.h文件,它也不知道类型Dollar。
为什么会这样,又如何在不将两个类彼此声明为friend
的情况下实现呢?
答案 0 :(得分:1)
您最有可能面临两个类之间的循环依赖问题。
您的欧元班级包含“ Dollar.h”,而您的美元班级最可能包含“ Euro.h”。包含项之一将被包含项保护(ifdef
/ pragma once
)阻止。只有一个会出现在另一个之上,它们不能同时位于另一个之上。
解决方案使用转发声明。
添加:
class Dollar; // forward declare class Dollar to allow using it
在欧元级别之上,反之亦然。
现在将前向声明的类型视为不完整类型-编译器可以在看到它的实际声明之前使用它,但仅用于特定用法:前向声明有助于在函数中使用该类签名,并且具有这种类型的指针或引用成员,但不是具有实际值类型的成员,也不是用于在标头内部实现的需要了解“完整类型”的方法。
如果在使用不完整类型时遇到错误:如果是在使用不完整类型的函数实现中-将函数实现移到cpp文件中,其中已经包含两个标头和类型被编译器视为完整类型。