Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基类和派生类的友元函数_C++_Class_Friend - Fatal编程技术网

C++ 基类和派生类的友元函数

C++ 基类和派生类的友元函数,c++,class,friend,C++,Class,Friend,我有一个基类分数和一个派生类分数。分数代表不合适的分数,而iFraction代表混合分数 class Fraction {...}; class iFraction : public Fraction {...}; 现在,我想声明这两个类的一个友元函数,即convertF。函数convertF可以将不合适的分数(分数)转换为混合分数(iFraction)。 我这么做有多冷? 实际上,我想这样声明函数: friend iFraction convertF (Fraction &Fra);

我有一个基类分数和一个派生类分数。分数代表不合适的分数,而iFraction代表混合分数

class Fraction {...};
class iFraction : public Fraction {...};
现在,我想声明这两个类的一个友元函数,即convertF。函数convertF可以将不合适的分数(分数)转换为混合分数(iFraction)。 我这么做有多冷? 实际上,我想这样声明函数:

friend iFraction convertF (Fraction &Fra);

但是,它不能在基本calss分数内声明。为什么?

因为
朋友关系不是继承的,所以需要将
convertF
声明为这两个类的朋友。但是,只有当函数需要访问这些类的内部时,您才需要它——您确定这些类的公共接口不够用吗

试图避免这种双重朋友的另一个原因是,它将通过
convertF
的签名在这些类之间创建循环依赖关系

更新:这正是您不能按照上面显示的方式声明好友函数的原因。要使其工作,编译器需要知道
iFraction
的完整定义,而基类
Fraction
的定义尚未完成,这是不可能的


从技术上讲,它可以反过来工作,通过向前声明
iFraction
。虽然我还是不认为这是一个好的解决方案。你确定你的类层次结构是正确的吗?

因为
朋友关系不被继承,你需要将
convertF
声明为两个类的朋友。但是,只有当函数需要访问这些类的内部时,您才需要它——您确定这些类的公共接口不够用吗

试图避免这种双重朋友的另一个原因是,它将通过
convertF
的签名在这些类之间创建循环依赖关系

更新:这正是您不能按照上面显示的方式声明好友函数的原因。要使其工作,编译器需要知道
iFraction
的完整定义,而基类
Fraction
的定义尚未完成,这是不可能的


从技术上讲,它可以反过来工作,通过向前声明
iFraction
。虽然我还是不认为这是一个好的解决方案。你确定你的类层次结构是正确的吗?

你不需要一个friend函数。有两种方法可以做到这一点:使用dynamic_cast或编写转换构造函数,该构造函数接受一个分数对象并将其转换为iFraction对象。我不太确定第二个选项是否是一个好的选项,但是我们可以尝试一下。

您不需要一个friend函数。有两种方法可以做到这一点:使用dynamic_cast或编写转换构造函数,该构造函数接受一个分数对象并将其转换为iFraction对象。我不太确定第二个选项是否是一个好的选项,但值得一试。

阅读以下内容:

始终首先尝试理解概念

读一下:


始终首先尝试理解概念

谢谢你的回答。现在,我明白为什么我不能这么做了。但是,我怎样才能实现将分数转换为Ifraction的目的?类分数有两个数据成员,一个是分子,一个是分母。iFraction类还有一个数据memeber iNum,它表示integer@user1305904,在仔细检查这些术语之后,现在我确信您的继承关系是错误的:混合分数不是不正确的分数。当然,两者之间的转换是完全合理的。你可能是对的。这段代码只是为了练习我的编程技巧。无论如何,谢谢你的意见。谢谢你的回答。现在,我明白为什么我不能这么做了。但是,我怎样才能实现将分数转换为Ifraction的目的?类分数有两个数据成员,一个是分子,一个是分母。iFraction类还有一个数据memeber iNum,它表示integer@user1305904,在仔细检查这些术语之后,现在我确信您的继承关系是错误的:混合分数不是不正确的分数。当然,两者之间的转换是完全合理的。你可能是对的。这段代码只是为了练习我的编程技巧。无论如何,谢谢你的意见。谢谢你的回答。然而,我不知道现在的动态演员是什么。我只是个新手,谢谢你的回答。然而,我不知道现在的动态演员是什么。我只是个新手。