2017-09-14 12 views
0

のオーバーロード、私は単純なクラスのための演算子をオーバーロードする方法を知っていると、以下のコードはサンプルです。QDataStream演算子<< Iは、仮想オペレータとして<strong>抽象クラス</strong>ため<strong>< <</strong>演算子をオーバーロードしたい抽象クラス

class NormalClass 
    { 
    public: 
     int firstField() const; 
     void setFirstField(int firstField); 

     int secondField() const; 
     void setSecondField(int secondField); 

    private: 
     int m_firstField; 
     int m_secondField; 
    }; 
    QDataStream &operator<<(QDataStream &out, const NormalClass &obj) 
    { 
     out << obj.firstField(); 
     out << obj.secondField(); 
     return out; 
    } 

しかし、今の我々は今、私はChildClassがそれを実装する必要がありAbstractBaseClassため< <演算子をオーバーロードしたい

class AbstractBaseClass 
{ 
public: 
    AbstractBaseClass() {} 

    int BaseFirstField() const; 
    void setBaseFirstField(int BaseFirstField); 

    int BaseSecondField() const; 
    void setBaseSecondField(int BaseSecondField); 

private : 
    int m_BaseFirstField; 
    int m_BaseSecondField; 

}; 


class ChildClass : public AbstractBaseClass 
{ 
public: 
    ChildClass() {} 


    int ChildFirstField() const; 
    void setChildFirstField(int ChildFirstField); 

private: 

    int m_ChildFirstField; 

} 

下回るようAbstractBaseClass、ChildClassを持っているとしましょう。 、仮想外のクラス宣言を使用すると、任意のアイデアを持っています:

これは、コンパイラが文句を言い

#ifndef ABSTRACTBASECLASS_H 
#define ABSTRACTBASECLASS_H 

#include <QDataStream> 

class AbstractBaseClass 
{ 
public: 
    AbstractBaseClass(); 

    int BaseFirstField() const; 
    void setBaseFirstField(int BaseFirstField); 

    int BaseSecondField() const; 
    void setBaseSecondField(int BaseSecondField); 

private : 
    int m_BaseFirstField; 
    int m_BaseSecondField; 
}; 

virtual QDataStream &operator<<(QDataStream &out, const AbstractBaseClass &obj)=0; 



#endif // ABSTRACTBASECLASS_H 

私の試しているのですか?

答えて

1

私が試してコンパイルしたものは、この方法についてどう思いますか、これ以上の成果はありますか?

これは抽象クラスである

の.h

#ifndef ABSTRACTBASECLASS_H 
#define ABSTRACTBASECLASS_H 

#include <QDataStream> 

class AbstractBaseClass 
{ 
public: 
    AbstractBaseClass(); 

    int BaseFirstField() const; 
    void setBaseFirstField(int BaseFirstField); 

    int BaseSecondField() const; 
    void setBaseSecondField(int BaseSecondField); 

    virtual QDataStream &serialize(QDataStream &stream)=0; 

private : 
    int m_BaseFirstField; 
    int m_BaseSecondField; 
}; 

QDataStream &operator<<(QDataStream &out, AbstractBaseClass &obj); 

#endif // ABSTRACTBASECLASS_H 

た.cpp

#include "abstractbaseclass.h" 

AbstractBaseClass::AbstractBaseClass() 
{ 
    m_BaseFirstField = 0; 
    m_BaseSecondField = 0; 
} 

int AbstractBaseClass::BaseFirstField() const 
{ 
    return m_BaseFirstField; 
} 

void AbstractBaseClass::setBaseFirstField(int BaseFirstField) 
{ 
    m_BaseFirstField = BaseFirstField; 
} 

int AbstractBaseClass::BaseSecondField() const 
{ 
    return m_BaseSecondField; 
} 

void AbstractBaseClass::setBaseSecondField(int BaseSecondField) 
{ 
    m_BaseSecondField = BaseSecondField; 
} 


QDataStream &operator<<(QDataStream &out, AbstractBaseClass &obj) 
{ 
    return obj.serialize(out); 
} 

と子クラス

class ChildClass : public AbstractBaseClass 
{ 
public: 
    ChildClass(){} 

    int ChildFirstField() const 
    { 
     return m_ChildFirstField; 
    } 
    void setChildFirstField(int ChildFirstField) 
    { 
     m_ChildFirstField = ChildFirstField; 
    } 

private: 

    int m_ChildFirstField; 

    // AbstractBaseClass interface 
public: 
    QDataStream &serialize(QDataStream &stream) override 
    { 
     stream << BaseFirstField(); 
     stream << BaseSecondField(); 
     stream << ChildFirstField(); 
     return stream; 
    } 
}; 
関連する問題