我怎样才能通过友谊正确地履行我的职能?

How can I get to my functions properly by friendship?

本文关键字:我的 正确地 友谊      更新时间:2023-10-16

我有一个抽象类,如下所示:

class Polygon {
public:
vector < int > sides;
virtual void circumreference()=0;
virtual void print() = 0;
void SaveAndRead() {
save(sides);
load(sides);
}
friend void save(std::vector < int >&);
friend void load(std::vector < int >&);
};

保存和加载不在类多边形中。我正在尝试调用函数保存并在函数 SaveAndRead() 中加载,但我有错误,例如"保存:找不到 ID"、"加载:找不到 ID"。 有人可以帮我解决这个问题吗?我会很感激的!

您不能通过仅声明saveload来替换Polygon的常规声明。 也就是说,您还必须在Polygon之前声明它们。

然后,为了使整个程序进行编译,您需要在.cpp文件中定义saveload

此外,您可能希望至少save参考const

//polygon.hpp
#include <vector>
void save(const std::vector < int >&);
void load(std::vector < int >&);
class Polygon {
public:
std::vector < int > sides;
virtual void circumreference()=0;
virtual void print() = 0;
void SaveAndRead() {
save(sides);
load(sides);
}
friend void save(const std::vector < int >&);
friend void load(std::vector < int >&);
};
// polygon.cpp
#include "polygon.hpp"
void save(const std::vector < int >&){
// Code for save
}
void load(std::vector < int >&){
// Code for load
}

非相关方面:

  • 如果使用load初始化其参数,则可能需要按值返回向量。
  • saveload似乎是成为Polygon实际成员的好人选。友谊很少是一个好的设计选择。

更多关于使用friend的信息:

friend的一个典型用途是实现迭代器或任何旨在提供另一个类的特定"视图"的类。您希望授予对此"view"类的完全访问权限,因为它在概念上是它提供访问权限的类的一部分。

有些人还喜欢使用friend重载流的operator<<,而不是定义由operator<<重载调用的print公共方法,这是可以接受的。

最后,交换运算符(如operator+)既可以作为公共成员将另一个实例作为参数实现,也可以实现为将两个实例作为参数的自由友元函数。第一种方法更简洁,而第二种方法更好地反映了算子的对称性。

我知道保存加载函数位于另一个类之外。在这种情况下,应将该类的名称添加到函数定义中。

friend void StoreFunctionClass::save(std::vector<int>&);