如何在C ++中测试相关对象是否相等?

时间:2014-05-04 03:08:54

标签: c++ inheritance compare

我有以下代表DNS的类层次结构:

class CZone {
    string                  m_Name;
    vector<RecordSurrogate> m_Records;
public:
                        CZone       ( string name ) : m_Name(name) {};
    bool                Add         ( const CRecord & );
    bool                Del         ( CRecord & );
    vector<CRecord>     Search      ( const string & ) const;
    void                Print       ( ostream & os ) const;
    friend ostream &    operator<<  ( ostream & os, const CZone & );
};

使用 Add() Del()方法,我想检查 m_Records 中是否存在具有给定名称的记录。我不能在这里使用 typeid ,但我可以通过 Type()返回的值识别不同的记录。

我写了bool CZone::recEqual(const CRecord &lhs, const CRecord &rhs) const medhod但是仍然坚持投诉

  

静态广播从'const CRecord'到'const CRecA'没有匹配的转换

这个结构:

bool CRecA::isEqual( const CRecord & rhs ) const {
    return ( m_Name == rhs.m_Name && m_IP == static_cast<const CRecA>(rhs) . m_IP );
}

基类:

class CRecord {
protected:
    string      m_Name;
public:
                            CRecord     ( void ) = default;
                            CRecord     ( string & name ) : m_Name(name) {}
                string      Name        ( void ) const { return m_Name; }
    virtual     string      Type        ( void ) const = 0;
    virtual    ~CRecord                 ( void ) {};
};

派生类:

class CRecA : public CRecord {
    CIPv4       m_IP;
public:
                CRecA       ( void ) = default;
    string      Type        ( void ) const { return "A"; }
    ostream &   operator << ( ostream & os ) const;
    CRecord *   copy        ( void ) const;

};

class CRecMX : public CRecord {
    string      m_Server;
    int         m_Prio;
public:
                CRecMX      ( void ) : m_Prio(0) {};
                CRecMX      ( string name, string server, int prio ) :
                    CRecord::CRecord(name), m_Server(server), m_Prio(prio) {}
    string      Type        ( void ) const { return "MX"; }
    ostream &   operator << ( ostream & os ) const;
    CRecord *   copy        ( void ) const;
};

代理类:

class RecordSurrogate {
public:
                        RecordSurrogate ( void );
                        RecordSurrogate ( const CRecord & );
                       ~RecordSurrogate ( void );
                        RecordSurrogate ( const RecordSurrogate & );
    RecordSurrogate &   operator=       ( const RecordSurrogate & );
    string              Name            ( void ) const;
    string              Type            ( void ) const;
private:
    CRecord * rp;
};

1 个答案:

答案 0 :(得分:1)

评论中的其他代码显示错误:

bool CRecA::isEqual(const CRecord& rhs) const
{
    return m_Name == rhs.m_Name && m_IP == static_cast<const CRecA>(rhs).m_IP;
}

您尝试将CRecord const&投射到CRecA const,这是不正确的。您需要将其转换为CRecA const&

原因很简单:您希望解释 原始对象作为其派生类 - 而不是将CRecord对象转换为{ {1}}对象。