将抽象类传递给I/O宏
passing abstract class to i/o macro
本文关键字:抽象类 更新时间:2023-10-16
我通过确保继承层次结构中的类实现虚拟读取和写入函数来实现序列化:
class base
{
...
virtual void read(std::istream&)=0;
virtual void write(std::ostream&) const=0;
virtual std::string is_a() const;
};
BEGIN_NAMESPACE_1(io)
SERIALISE(base)
END_NAMESPACE_1
其中宏"序列化"实现了"序列化"answers"挑战"功能的超载,以通过基类指针允许i/o轻松:
#define SERIALISE(TYPE)
void deserialise( boost::shared_ptr<TYPE>& dat, std::istream& ifs )
{
std::string type;
read(type, ifs);
dat = TYPE::make_##TYPE(type);
dat->read(ifs);
}
void serialise( const boost::shared_ptr<TYPE>& dat, std::ofstream& ofs )
{
write(dat->is_a(), ofs);
dat->write(ofs);
}
但是,如果基类包含纯虚拟函数,我会得到编译器错误"不能分配抽象类型"基础"的对象,因为以下函数在"基础" ..." ..."中纯粹,大概是因为编译器试图尝试当类名传递给宏调用时,将抽象基类实例化。有没有一种方法来挽救此I/O设计?
您不能实例化抽象基类或将其用作函数的值参数。
模板explicit shared_ptr(y * p);要求:P必须是 可转换为T *。y必须是完整的类型。表达式删除p 必须是良好的,不得调用不确定的行为,不得 投掷例外。
效果:构建一个拥有指针p的共享_ptr
后结构:use_count()== 1&amp;&amp;get()== p。
投掷:std :: bad_alloc,或实现定义的异常 无法获得内存以外的资源。
异常安全:如果抛出异常,则称为delete p。
注意:P必须是通过C 分配的对象的指针 新表达式或为0。使用计数的后条件为1 即使P为0;在具有0的指针上调用DELETE 无害。
在这种情况下,编译器不必将模板共享为具有类型的类型值,因为它们永远无法实例化。
相关文章:
- 无法创建抽象类的实例
- 用pybind11包装C++抽象类时出错
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 抽象类错误,请参阅声明" "是抽象的
- 将自定义函数传递到基抽象类中以延迟执行
- 将包含抽象类和普通类C++包导出到 Python
- C++:处理抽象类中的错误时出现问题
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在 C++ 中使用另一个头文件中的抽象类
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- C++:从抽象类重写纯虚拟运算符重载
- 如何创建shared_ptr抽象类的容器
- .h 或.cpp文件中的抽象类或两者兼而有之?
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- E0322:不允许使用抽象类类型 " " 的对象
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 提升 - 类没有名为"序列化"的成员(抽象类)?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 对纯抽象类中方法的未定义引用