c++ 重载运算符 <

需求 cpp 需要对 array 中的对象进行排列,使用 sort 的情况下,默认需要重载 <, 才能实现相关功能。 解决 选择的是,在结构体内部进行重载。 struct PatientDataHead { // increment id int32_t id; bool operator <(const PatientDataHead& head) const {return id < head.id;} }; std::array<PatientDataHead, kPatientNum> patient_data_heads_ {}; std::sort(patient_data_heads_.begin(), patient_data_heads_.end()); 参考 C++中自定义比较函数和重载运算符总结

<span title='2023-10-31 11:27:00 +0800 CST'>2023-10-31</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;38 words&nbsp;·&nbsp;RamLife

c++ warning: hides overloaded virtual function

需求 C++ 中警告: tcp_socket.h:15:10: warning: 'TcpSocket::readData' hides overloaded virtual function qabstractsocket.h:215:12: note: hidden overloaded virtual function 'QAbstractSocket::readData' declared here: different number of parameters (2 vs 0) 解决 这个问题的原因很简单,就是子类里面重载了父类的虚函数,被重载的虚函数在子类中将会被隐藏。 何为隐藏呢,应该是不能使用子类实例直接调用父类被隐藏的函数,调用时必须指定父类命名空间,往深了说也就是编译器如果在子类中发现了要使用的函数的名字,注意,是名字不包含函数签名,只要名字匹配上,就不会再去父类中去寻找这个名字的函数,即便子类中的函数参数不匹配,也不会再去父类中寻找。 原因 注意是防止书写错误,比如下面这个,如果在子类定义的时候,想的是重写 void foo(BookA *), 结果把 A 写成 B 了,那么这个警告就能提醒了。 class BookA; //改动处 class BookB; //改动处 class A { public: virtual void foo(BookA *) { //改动处 cout << "foo of A" << endl; } }; class B : public A{ public: void foo(BookB *) { //改动处 cout << "foo of B" << endl; } }; int main(void) { A *b = new B(); //改动处 b->foo(new BookB()); return 0; } 解决警告 如果确实是需要重载,又不希望有这个警告碍眼,可以使用 private 加上 using 来解决。 private 是为了防止子类的对象来使用父类的这个虚函数。...

<span title='2023-07-22 17:21:00 +0800 CST'>2023-07-22</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;141 words&nbsp;·&nbsp;RamLife