映射和运算符重载 C++
Posted
技术标签:
【中文标题】映射和运算符重载 C++【英文标题】:Map and operator overloading c++ 【发布时间】:2018-03-26 08:41:03 【问题描述】:我知道这可能是一个愚蠢的问题,但我是 STL 的新手。我有以下问题。有一个抽象的基类,有一个派生类 (CSubject),我正在尝试声明一个地图 当我尝试为该地图创建一个设置器时,我收到以下错误“没有运算符”=“匹配这些操作数”我在 CSubject 类中声明了运算符'='。如果你能帮助我,我会非常感谢。感谢您的建议!
class CStudent
....
CStudent& operator = (const CStudent& rhs)
this->m_szFakultetNumber = rhs.m_szFakultetNumber;
this->m_szSpecialnost = rhs.m_szSpecialnost;
this->SetName(rhs.GetName());
this->SetEGN(rhs.GetEGN());
return *this;
;
class CSubject
private:
std::string m_szDisciplineName;
std::map<std::unique_ptr<CStudent>, unsigned>m_mapOStudentGrade;
public:
void SetDisciplineName(const std::string szDisciplineName)
m_szDisciplineName = szDisciplineName;
void SetStudentGrade(const std::map<std::unique_ptr<CStudent>, double>mapOStudentGrade)
m_mapOStudentGrade = mapOStudentGrade;
;
【问题讨论】:
据我所知,CSubject 并非源自 CStudent。 特刊。 :-) 少校,也许? 此外,为了能够在地图中使用,您还需要一个比较器;您可以显式实现一个,然后将其作为模板参数传递给映射,您可以专门针对 CStudent 使用std::less
,或者,最简单,为 CStudent 实现 operator<
(然后将其称为默认std::less
...)。
@Aconcagua std::unique_ptr
有一个 operator<
。它不比较指针,所以在这种情况下它不是很好
@Caleth 已经注意到,想在另一条评论中完善; std::map<CStudent, ...>
是必需的。在给定的情况下,智能指针无论如何都会阻碍,至少std::unique_ptr
- 如果学生参加多个科目怎么办?
【参考方案1】:
std::map<std::unique_ptr<CStudent>, unsigned>
是与std::map<std::unique_ptr<CStudent>, double>
不同的、不相关的类型。你需要选择其中之一,并坚持下去。
请注意,const
限定 mapOStudentGrade
参数在这里没有任何作用,除了阻止您移动分配 m_mapOStudentGrade
。您需要这样做,因为您的 std::unique_ptr<CStudent>
不可复制。
另请注意,您将无法在地图中查找项目,因为没有任何外部 std::unique_ptr<CStudent>
s 将与地图中的项目等效。您的示例不包含任何尝试,因此对您来说可能不是问题。
【讨论】:
参数不应该也是右值引用吗?否则我们如何将地图移动到参数中? @Aconcagua 不,它可以只是一个(非参考)左值参数。以上是关于映射和运算符重载 C++的主要内容,如果未能解决你的问题,请参考以下文章