Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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+中的运算符+;_C++_Operator Overloading - Fatal编程技术网

C++ 过载问题<;C+中的运算符+;

C++ 过载问题<;C+中的运算符+;,c++,operator-overloading,C++,Operator Overloading,我有一个学生对象向量,我想使用#include和排序(list.begin(),list.end())对其进行排序 为了做到这一点,我知道我需要重载“嗯,你可以作为一个内部操作符: class Student { public: bool operator <(const Student& second) const; ... private: ... }; 班级学生 { 公众: bool操作符我不会在这里使用朋友,我也不确定它是否有效。我

我有一个学生对象向量,我想使用
#include
排序(list.begin(),list.end())对其进行排序


为了做到这一点,我知道我需要重载“嗯,你可以作为一个内部操作符:

class Student
{
    public:
    bool operator <(const Student& second) const;
    ...
    private:
    ...
};
班级学生
{
公众:

bool操作符我不会在这里使用朋友,我也不确定它是否有效。我会使用的是

class Student
{
  public:
    bool operator< (const Student& second) const;
};

bool Student::operator< (const Student& second) const
{
  return (Name() < second.Name());
}
班级学生
{
公众:
布尔运算符<(常数学生和第二个)常数;
};
bool Student::运算符<(const Student和second)const
{
返回(Name()

注意尾随的const,表示在操作符中没有说明使用的编译器,但我怀疑您使用的是一个相当新的编译器,它实现了“friend is not a declaration”“规则。类中的friend语句不作为函数声明;包含Student.h的其他模块看不到函数的任何声明。它仅在Student.cpp文件中可见。(较旧的编译器没有此规则,将friend声明视为函数声明。)

函数不需要是朋友,因为它不使用Student类的任何私有成员(我假设Name()是公共的)。将函数声明移到类之外,并将“friend”替换为“extern”,它应该可以工作


正如上面一些海报所建议的那样,可以将运算符设置为成员函数,但这不是必需的。通常不赞成将运算符设置为成员函数,因为这意味着这两个参数没有对称处理(一个是不可见的“this”参数,另一个是普通函数参数),这在某些情况下可能会导致令人惊讶的结果(例如,可能会对参数应用不同的类型转换)。

顺便说一句,对于这么简单的函数,我个人只会这样做,除非样式指南禁止在类定义中定义函数:

class Student
{
    friend bool operator <(const Student& first, const Student& second)
    {
        return first.Name() < second.Name();
    }
    ...
};
班级学生
{

friend bool运算符是否有必要标记函数声明extern?我只在头文件中声明了变量。很难为这个问题确定一个答案。我最初的尝试都是在类中定义的,我只是在阅读了某人的声明后出于绝望才尝试了“friend”版本除非您这样做,“排序”不会生效。事实证明,我实际上也有一个与指针相关的问题。没错,这并不是真的必要;类外的函数默认有外部链接。我习惯于将其放进去,以向读者表明该函数是在另一个源文件中定义的(而不是同一文件中其他地方定义的函数的前向声明)@Ross-我理解这种皱眉,但我个人对编写标准的人皱眉。逻辑上对称的方法是有一个静态成员函数,但显然这是不允许的。无论如何,我的习惯是因为朋友方法的问题而形成的-这些问题现在可能已经过去了,但我目前的习惯不会导致我e任何问题。在我看来,“如果它没有坏,就不要改正它”也适用于习惯。似乎很可能是“第一个”和“第二个”"friend版本中的参数是const。我想我最终决定将其作为我将选择的答案,因为它最直接地引导我识别指针的更大问题。这种方法通常是避免的,因为如果类型可转换为Student,代码将转换右侧类型,而不是left-side类型。一个friend函数将在两侧保持一致的行为。
class Student
{
  public:
    bool operator< (const Student& second) const;
};

bool Student::operator< (const Student& second) const
{
  return (Name() < second.Name());
}
class Student
{
    friend bool operator <(const Student& first, const Student& second)
    {
        return first.Name() < second.Name();
    }
    ...
};