我正在尝试创建一个我所有工厂都会使用的接口(目前我只有一个工厂来创建“Image”类(这些是自制类))。对于我的任务,我必须创建并演示一个自制的照片编辑库。
#include <string>
#include "FreeImagePlus.h"
#include <memory>
#include "Image.h"
#include "IMedia.h"
#pragma once
using namespace std;
template<class T> class IFactory
{
public:
IFactory() { }
virtual ~IFactory() {}
virtual T* Create(string filename) = 0;
virtual void Initialize() = 0;
};
这是我的工厂将实施的界面。正如您所看到的,我已经创建了一个工厂将创建并返回的模板。
#include <string>
#include <memory>
#include <iostream>
#include "FreeImagePlus.h"
#include "IFactory.h"
#include "Image.h"
#include "IMedia.h"
#pragma comment (lib, "Libs/FreeImagePlusd.lib")
#pragma comment (lib, "Libs/FreeImaged.lib")
using namespace std;
class ImageFactory : public IFactory<IMedia>
{
public:
inline ImageFactory();
virtual ~ImageFactory();
unique_ptr<fipImage> CreateImage(string fileName);
virtual IMedia* Create(string fileName);
virtual void Initialize();
};
以上是我的工厂,我正在尝试添加界面。我对C ++的了解有限,但我看不出哪里出错了。每当我从我的main(在包含该库的另一个项目中)调用库时。以下是此
的.cpp#include "stdafx.h"
#include "ImageFactory.h"
using namespace std;
ImageFactory::ImageFactory() : IFactory()
{
}
ImageFactory::~ImageFactory()
{
}
void ImageFactory::Initialize()
{
}
IMedia* ImageFactory::Create(string fileName)
{
const char* file = fileName.c_str();
Image* i = new Image();
i->image->load(file);
i->Initialise();
if (!i->image->isValid())
{
throw exception("Image isn't valid. Please check the filepath and try again");
}
return i;
}
在我正在调用的main函数中(它位于一个单独的项目中,但是项目正确包含了库,我以前尝试过这一点已经成功,但是在包含界面后它已经破坏了我的代码..我知道我做错了什么):
IFactory<IMedia>* im = new ImageFactory();
IMedia* a = im->Create(filePath);
工厂将创建并返回IMedia,我可以用它来绘制图像。在运行和崩溃时(它给了我内存访问冲突,在检查时我遇到了这个0x001523dc {FipConsoleApp.exe!const ImageFactory :: vftable'} {0x0014109b {FipConsoleApp.exe!ImageFactory::
向量删除析构函数'(unsigned int)},...})。无论如何,目标是创建一个类型为T的工厂(在这种情况下具体是IMedia),它将创建并返回IMedia对象(更具体地说,我想创建一个Image文件,因为你可以在ImageFactory.cpp中看到我'我被骗了,刚刚创建并返回一个Image文件,这是IMedia的一个孩子。最终我会把它充实,但我只是想让一些东西起作用。)
我知道这段代码可能存在许多缺陷,而且可能很糟糕。请理解我对整个C ++都很陌生,所以我试图理解它,我很感激任何反馈,如果有什么不清楚,我会尽力解释它。我只是想看看是否有人可以注意到任何明显的错误,可能解释我做错了什么以及我应该进一步研究哪些与c ++相关的主题:)