映射和运算符重载 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&lt;(然后将其称为默认std::less...)。 @Aconcagua std::unique_ptr 有一个 operator&lt;。它不比较指针,所以在这种情况下它不是很好 @Caleth 已经注意到,想在另一条评论中完善; std::map&lt;CStudent, ...&gt; 是必需的。在给定的情况下,智能指针无论如何都会阻碍,至少std::unique_ptr - 如果学生参加多个科目怎么办? 【参考方案1】:

std::map&lt;std::unique_ptr&lt;CStudent&gt;, unsigned&gt; 是与std::map&lt;std::unique_ptr&lt;CStudent&gt;, double&gt; 不同的、不相关的类型。你需要选择其中之一,并坚持下去。

请注意,const 限定 mapOStudentGrade 参数在这里没有任何作用,除了阻止您移动分配 m_mapOStudentGrade。您需要这样做,因为您的 std::unique_ptr&lt;CStudent&gt; 不可复制。

另请注意,您将无法在地图中查找项目,因为没有任何外部 std::unique_ptr&lt;CStudent&gt;s 将与地图中的项目等效。您的示例不包含任何尝试,因此对您来说可能不是问题。

【讨论】:

参数不应该也是右值引用吗?否则我们如何将地图移动到参数中? @Aconcagua 不,它可以只是一个(非参考)左值参数。

以上是关于映射和运算符重载 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++类和对象--运算符重载

C++运算符重载时要遵循的规则

C++提高:运算符重载

C++提高:运算符重载

C++中赋值运算操作符和=重载有啥区别?

C++语法小记---运算符重载