我怎样才能通过友谊正确地履行我的职能?
How can I get to my functions properly by friendship?
我有一个抽象类,如下所示:
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"。 有人可以帮我解决这个问题吗?我会很感激的!
您不能通过仅声明save
和load
来替换Polygon
的常规声明。 也就是说,您还必须在Polygon
之前声明它们。
然后,为了使整个程序进行编译,您需要在.cpp文件中定义save
和load
。
此外,您可能希望至少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
初始化其参数,则可能需要按值返回向量。 save
和load
似乎是成为Polygon
实际成员的好人选。友谊很少是一个好的设计选择。
更多关于使用friend
的信息:
friend
的一个典型用途是实现迭代器或任何旨在提供另一个类的特定"视图"的类。您希望授予对此"view"类的完全访问权限,因为它在概念上是它提供访问权限的类的一部分。
有些人还喜欢使用friend
重载流的operator<<
,而不是定义由operator<<
重载调用的print
公共方法,这是可以接受的。
最后,交换运算符(如operator+
)既可以作为公共成员将另一个实例作为参数实现,也可以实现为将两个实例作为参数的自由友元函数。第一种方法更简洁,而第二种方法更好地反映了算子的对称性。
我知道保存和加载函数位于另一个类之外。在这种情况下,应将该类的名称添加到函数定义中。
friend void StoreFunctionClass::save(std::vector<int>&);
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我怎样才能通过友谊正确地履行我的职能?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 如何在C++中正确地将我的语言字符输出到HTML文件中
- 如果我的类正确地管理了一个资源,那么拥有智能的poointer有什么意义
- 我如何正确地为std ::映射分配内存
- 我是否正确地将PCWSTR指向字符串文字
- 程序在第一次运行时正确地找到了最大值和最小值,但如果我再次运行,它会给我错误的答案
- 如何正确地将std::字符串转换为无符号char[]数组*.我觉得我做错了,有人给我指明了正确的方向
- 我是否正确地为 2D 数组添加了行与列
- 我是否正确地将枚举值与C++的"or"运算符进行比较?
- 我是否正确地将嵌套的 lua 表作为 C 函数的参数
- 在当前给定的通用场景中,我如何正确地为Hopcroft-Carp最大匹配算法构建图
- 变量的不完全类型-尽管我认为我已经正确地向前声明了
- 有人能检查一下我是否正确地做了这个哈希
- 我是否正确地指定了立方体映射的坐标
- 我无法正确地从向量中删除元素
- 我是否正确地将局部空间转换为世界空间坐标
- 如何将异常更正确地集成到我的代码和未来的代码中?(C++)
- 我是否正确地使用了move语义?好处是什么?