【问题标题】:Assigning object to an object of different class将对象分配给不同类的对象
【发布时间】:2021-01-05 10:50:23
【问题描述】:

给定 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 operator = (const Dollar &amp;object),即使我包含了 Dollar.h 文件,它也不知道 Dollar 类型。

为什么会这样?如何在不声明两个类friend的情况下实现这一点?

【问题讨论】:

标签: c++ class member assignment-operator


【解决方案1】:

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

您的 Euro 课程包含“Dollar.h”,而您的 Dollar 课程很可能包含“Euro.h”。其中一个包含将被包含保护 (ifdef / pragma once) 阻止。只有一个会出现在另一个之上,它们不能同时出现在另一个之上。

解决方案是使用前向声明

添加:

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

欧级以上,反之亦然。

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

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

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2020-05-22
    • 2015-12-15
    • 1970-01-01
    • 2020-12-24
    • 2015-11-07
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多