将对象分配给不同 class 的对象
Assigning object to an object of different class
给定 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 operator = (const Dollar &object)
时它不知道类型美元,即使我包含了 Dollar.h 文件。
为什么会这样,我如何在不声明彼此 类 的情况下实现此目的 friend
?
您很可能面临两个 class 之间的 循环依赖性 问题。
您的欧元 class 包含“Dollar.h”,而您的美元 class 很可能包含“Euro.h”。其中一个包含将被包含防护 (ifdef
/ pragma once
) 阻止。只有一个会出现在另一个之上,它们不能都在另一个之上。
解决方案是使用前向声明。
添加:
class Dollar; // forward declare class Dollar to allow using it
高于欧元 class,反之亦然。
前向声明类型现在被认为是不完整类型 - 编译器可以在看到它的实际声明之前使用它,但仅限于特定用途:前向声明有助于在函数签名中使用 class 并具有此类型的指针或引用成员,但不具有实际值类型成员或在 header 内实现的需要知道“完整类型”的方法".
如果您在使用 不完整类型时遇到错误 :如果它是在使用不完整类型的函数实现上 - 将函数实现移至您的 cpp 文件,其中 headers 已经包括在内,编译器认为该类型是一个完整的类型。
给定 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 operator = (const Dollar &object)
时它不知道类型美元,即使我包含了 Dollar.h 文件。
为什么会这样,我如何在不声明彼此 类 的情况下实现此目的 friend
?
您很可能面临两个 class 之间的 循环依赖性 问题。
您的欧元 class 包含“Dollar.h”,而您的美元 class 很可能包含“Euro.h”。其中一个包含将被包含防护 (ifdef
/ pragma once
) 阻止。只有一个会出现在另一个之上,它们不能都在另一个之上。
解决方案是使用前向声明。
添加:
class Dollar; // forward declare class Dollar to allow using it
高于欧元 class,反之亦然。
前向声明类型现在被认为是不完整类型 - 编译器可以在看到它的实际声明之前使用它,但仅限于特定用途:前向声明有助于在函数签名中使用 class 并具有此类型的指针或引用成员,但不具有实际值类型成员或在 header 内实现的需要知道“完整类型”的方法".
如果您在使用 不完整类型时遇到错误 :如果它是在使用不完整类型的函数实现上 - 将函数实现移至您的 cpp 文件,其中 headers 已经包括在内,编译器认为该类型是一个完整的类型。