c++ - C++抽象类不能被实例化
问题描述
我有这个抽象类
class ImageIO {
protected:
ImageIO() {}
public:
virtual bool load(const std::string & filename, const std::string & format) = 0;
virtual bool save(const std::string & filename, const std::string & format) = 0;
}
以及实施
class Image : public Array2D<Color>, public ImageIO {
private:
static int case_insensitive(string s) {
transform(s.begin(), s.end(), s.begin(), tolower);
if (s.compare("ppm") == 0) {
return 1;
}
return 0;
}
public:
bool load(const std::string& filename, const std::string& format) {
if (case_insensitive(format)) {
float* data = ReadPPM(filename.c_str(), (int*)width, (int*)height);
for (int i = 0, j = 0; i < width * height; i++, j += 3) {
buffer[i] = Color(data[j], data[j + 1], data[j + 2]);
}
delete[] data;
return true;
}
return false;
}
bool save(const std::string& filename, const std::string& format) {
if (case_insensitive(format)) {
float* data = new float[width * height * 3];
for (int i = 0, j = 0; i < width * height; i++, j += 3) {
data[j] = buffer[i].x;
data[j + 1] = buffer[i].y;
data[j + 2] = buffer[i].z;
}
bool write_check = WritePPM(data, width, height, filename.c_str());
delete[] data;
return write_check;
}
return false;
}
};
如果我尝试这个,我会不断收到一个抽象类无法实例化的错误
Image test = Image();
在我的主要。我也试过在头文件中声明 t=这两种方法
class Image : public Array2D<Color>, public ImageIO {
private:
static int case_insensitive(std::string);
public:
bool ImageIO::load(const std::string& filename, const std::string& format);
bool ImageIO::save(const std::string& filename, const std::string& format);
};
但后来我得到未解决的外部符号错误。我实现这两个功能的方式或声明类的方式是否存在问题?
编辑:如果我在头文件中声明这两种方法,那么错误是:
error LNK2019: unresolved external symbol "public: virtual bool __thiscall image::Image::[image::ImageIO]::load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?load@?QImageIO@image@@Image@2@UAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z) referenced in function _main
error LNK2019: unresolved external symbol "public: virtual bool __thiscall image::Image::[image::ImageIO]::save(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?save@?QImageIO@image@@Image@2@UAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z) referenced in function _main
如果我不这样做,错误是
error C2259: 'image::Image': cannot instantiate abstract class
我还添加了覆盖,没有任何变化。
解决方案
要专门回答有关未解析的外部符号的问题,您不需要ImageIO
保存/加载函数上的父说明符。您声明它Image
本身具有这些功能,这些功能会覆盖父级上的抽象功能。然后,您需要Image
在 cpp 文件中实现它们时指定。
图像.hpp
class Image : public Array2D<Color>, public ImageIO {
private:
static int case_insensitive(std::string);
public:
bool load(const std::string& filename, const std::string& format) override;
bool save(const std::string& filename, const std::string& format) override;
};
图像.cpp
bool Image::load(const std::string& filename, const std::string& format) {
if (case_insensitive(format)) {
//etc.
}
return false;
}
bool Image::save(const std::string& filename, const std::string& format) {
if (case_insensitive(format)) {
//etc.
}
return false;
}
推荐阅读
- python - 无法使用 pip 安装包 bpy
- c# - 如何将所选条目保持空白并使用 CollectionView - WPF
- javascript - For 循环和数组索引
- javascript - 带有 Angular 9 的 Ionic 5:如何从桌面(非移动设备)打印
- angular - Ionic Web 组件和 Angular 应用程序和静态预渲染
- python - python:我想通过相同的键合并不同的字典并将字典名称添加到键
- discord - 如何更改所有频道发送消息的用户权限?
- c++ - 卡在 DatachannelInterface
- python - 当我的病情 > 100 时无法退还 INR
- python - 如何在熊猫中读取具有多个货币符号的excel列?