<链表C ++中结构成员的运算符重载
Posted
技术标签:
【中文标题】<链表C ++中结构成员的运算符重载【英文标题】:< operator overloading for struct member in linked list C++ 【发布时间】:2021-11-05 16:42:03 【问题描述】:所以基本上我有我的结构,它在将数据分配给链表的值之前保留数据并帮助我稍后检索它
struct Student
private:
string surname ;
string names ;
int index;
float mark;
这是我插入排序链表的实现
template<typename T>
void List<T>::insert(T v)
Node* pred = nullptr;
Node* succ = head;
while(succ != nullptr && succ->value < v) <- here
pred = succ;
succ = succ->next;
...
我的问题是我需要按 index 对其进行排序,而我的
bool operator<(const Student&)
return next->index < this->index;
我对 == 或 + 等运算符进行了重载,但从来没有
【问题讨论】:
您能否edit 提出您的问题,并用一个完整的minimal reproducible example 替换所有孤立的代码sn-ps,其他人都可以剪切/粘贴如图所示 i> 放入一个空文件,然后编译、运行并重现您的问题? “我的所有实现……似乎都不起作用”是什么意思?operator<
应该采用两个 Student
对象(通过引用),如果第一个小于第二个,则返回 true
。只写那个函数。
方便阅读全面的运营商:What are the basic rules and idioms for operator overloading?
您能否解释一下您认为operator<
应该如何/为什么起作用?从一个例子开始可能会有所帮助,比如从 Student a; Student b;
开始,添加合适的初始化,然后遍历表达式 a < b
,也就是 a.operator<(b)
的评估。 (强迫自己向别人解释你的推理是一种有效的调试技术,有时称为rubber duck debugging。)
对于像 “没有 [...] 似乎可以工作” 这样详细的问题描述,“因为他们有错误”的答案似乎处于大致相同的水平乐于助人。是什么导致您得出结论,您的问题中的operator<
版本不起作用?编译时出错? (复制粘贴错误信息。) 运行时出现奇怪的命令? (给出一个实际和预期结果的具体例子。)那些奇怪的“未定义行为”结果之一,比如格式化你的硬盘?
【参考方案1】:
index
是private
,这意味着您需要将其设为成员函数或将其声明为friend
。
struct Student
bool operator<(const Student& other) const
return index < other.index;
private:
string surname;
string names;
int index;
float mark;
;
您可以指定this->index
而不仅仅是index
,但大多数时候这不是必需的。
另外,作为旁注,如果您使用 C++ 20,我建议重载 spaceship operator,因为所有比较运算符(==
和 !=
除外)都会重载 automatically generate appropriate definitions:
auto operator<=>(const Student& other)
return index <=> other.index;
【讨论】:
"您需要将其设为成员函数或 [...]" -- 鉴于问题的版本仅显示此 binary 运算符,我猜它已经是一个成员函数。与您介绍operator<=>
的设置类似,不是吗? (当然,如果你不喜欢猜测,你可以在回答之前要求澄清。)以上是关于<链表C ++中结构成员的运算符重载的主要内容,如果未能解决你的问题,请参考以下文章