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

Assigning object to an object of different class

提问人:june4 提问时间:9/18/2020 最后编辑:june4 更新时间:9/18/2020 访问量:62

问:

给定 2 个类和class Euroclass Dollar

我已经重载了赋值运算符,因此相同类型的对象将它们的私有值相互传递。

磁共振:

#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 类型的对象时将欧元转换为美元的行为,反之亦然。

但是,当声明另一个赋值运算符时,即使我包含了 Dollar.h 文件,它也不知道键入 Dollar。Euro operator = (const Dollar &object)

为什么会这样,我怎样才能在不相互声明两个类的情况下实现这一点?friend

C++ 成员 赋值运算符

评论

1赞 cigien 9/18/2020
也许使用正向声明。请做一个最小的可重复的例子
0赞 463035818_is_not_an_ai 9/18/2020
请发布一个最小的可重复示例。我的猜测是你有一个循环依赖,但我们需要查看代码
0赞 463035818_is_not_an_ai 9/18/2020
顺便说一句,应该返回引用,而不是 的副本。operator=*this
0赞 cigien 9/18/2020
这仍然不可重现。在哪里?Dollar.h

答:

1赞 Amir Kirsh 9/18/2020 #1

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

您的欧元等级包括“Dollar.h”,而您的美元等级很可能包括“Euro.h”。其中一个包含将被包含防护 ( / ) 阻止。只有一个会出现在另一个之上,它们不能都高于彼此。ifdefpragma once

解决方案是使用正向声明

加:

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

高于欧元级,反之亦然。

正向声明的类型现在被认为是一个不完整的类型 - 编译器可以在看到它的实际声明之前使用它,但仅限于特定用法:正向声明有助于在函数签名中使用类,并具有此类型的指针或引用成员,但不适用于具有实际值类型成员或在需要知道“完整类型”的标头中实现的方法。

如果在使用不完整类型时遇到错误:如果在使用不完整类型的函数实现时出现错误,请将函数实现移动到 cpp 文件中,其中两个标头都已包含,并且编译器将该类型视为完整类型。