C++ 我怎样才能通过友谊正确地发挥我的作用?

C++ 我怎样才能通过友谊正确地发挥我的作用?,c++,vector,C++,Vector,我有一个抽象类,如: 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 < in

我有一个抽象类,如:

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 >&);

};
类多边形{
公众:
向量边;
虚空环绕()=0;
虚空打印()=0;
void SaveAndRead(){
保存(侧面);
负载(侧面);
}
朋友无效保存(std::vector&);
友元无效荷载(标准::向量&);
};
“保存”和“加载”是类外多边形。我试图在函数SaveAndRead()中调用函数save和load,但出现了诸如“save:ID未找到”、“load:ID未找到”之类的错误。
有人能帮我解决这个问题吗?我会很感激的

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

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

您不能仅将
保存
加载
声明为多边形的朋友,从而取代常规声明。
也就是说,您还必须在多边形之前声明它们

然后,为了使整个程序能够编译,您需要在.cpp文件中定义
save
load

另外,您可能希望
save
至少获取一个
const
引用

//polygon.hpp
#包括
无效保存(const std::vector&);
空荷载(标准::矢量&);
类多边形{
公众:
std::向量边;
虚空环绕()=0;
虚空打印()=0;
void SaveAndRead(){
保存(侧面);
负载(侧面);
}
朋友无效保存(const std::vector&);
友元无效荷载(标准::向量&);
};
//多边形.cpp
#包括“polygon.hpp”
无效保存(const std::vector&){
//保存代码
}
无效荷载(标准::向量&){
//装载代码
}

非相关方面:

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

有关使用
朋友的详细信息

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


有些人还喜欢重载
运算符,或者一字不差地粘贴整个错误消息。另外,这是一种糟糕的设计模式:
保存
加载
应该是多边形的一部分,而不是外部的,或者调用多边形的公共方法或构造函数,这样它就不必是
朋友
。感谢您的解释!我像你刚刚写的那样做了-我把这个函数作为类Polygon的成员。大多数程序员都在回顾友谊——我刚刚查过。非常感谢您抽出时间;)