【问题标题】:QDataStream operator << overloading for Abstract class抽象类的 QDataStream 运算符 << 重载
【发布时间】:2018-02-22 23:21:11
【问题描述】:

我想将抽象类运算符重载为虚拟运算符,我知道如何为简单类重载运算符,下面的代码是一个示例。

  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;
    }

但是现在假设我们有如下所示的 AbstractBaseClass、ChildClass

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;

}

现在我想重载

这是我的尝试

#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

编译器报错:virtual outside class declaration,你知道吗?

【问题讨论】:

    标签: c++ qt operator-overloading abstract-class qdatastream


    【解决方案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;
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 2016-07-15
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2015-05-09
      • 1970-01-01
      相关资源
      最近更新 更多