将对象分配给不同类的对象

时间:2020-09-18 13:30:57

标签: c++ class member assignment-operator

给出2个类class Euroclass 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的情况下实现呢?

1 个答案:

答案 0 :(得分:1)

您最有可能面临两个类之间的循环依赖问题。

您的欧元班级包含“ Dollar.h”,而您的美元班级最可能包含“ Euro.h”。包含项之一将被包含项保护(ifdef / pragma once)阻止。只有一个会出现在另一个之上,它们不能同时位于另一个之上。

解决方案使用转发声明

添加:

class Dollar; // forward declare class Dollar to allow using it

在欧元级别之上,反之亦然。

现在将前向声明的类型视为不完整类型-编译器可以在看到它的实际声明之前使用它,但仅用于特定用法:前向声明有助于在函数中使用该类签名,并且具有这种类型的指针或引用成员,但不是具有实际值类型的成员,也不是用于在标头内部实现的需要了解“完整类型”的方法。

如果在使用不完整类型时遇到错误:如果是在使用不完整类型的函数实现中-将函数实现移到cpp文件中,其中已经包含两个标头和类型被编译器视为完整类型。