QDataStream 运算符 << 重载抽象 class
QDataStream operator << overloading for Abstract class
我想将 << 运算符重载为 抽象 class 作为虚拟运算符,我知道如何重载简单 class 的运算符,下面的代码是示例。
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;
}
现在我想为 AbstractBaseClass 重载 << 运算符,子类应该实现它。
这是我的尝试
#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,你有什么想法吗?
我试过编译成功了,你觉得这个方法怎么样,有没有更好的效果。
这是抽象的class
.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);
}
和childclass
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;
}
};
我想将 << 运算符重载为 抽象 class 作为虚拟运算符,我知道如何重载简单 class 的运算符,下面的代码是示例。
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;
}
现在我想为 AbstractBaseClass 重载 << 运算符,子类应该实现它。
这是我的尝试
#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,你有什么想法吗?
我试过编译成功了,你觉得这个方法怎么样,有没有更好的效果。
这是抽象的class
.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);
}
和childclass
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;
}
};