c++ 如何让工厂方法返回一个派生类?

idfiyjo8  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(153)

此问题在此处已有答案

what is return type of new in c++?(2个答案)
10天前关门了。
我正在尝试创建一个工厂方法,但它目前正在抛出一个错误:

  1. core\loaders\loader.cpp:11:12: error: cannot convert 'Jpeg' to 'Loader*' in assignment
  2. 15 | loader = Jpeg(path);
  3. | ^~~~~~~~~~
  4. | |
  5. | Jpeg

字符串
我想返回一个从Loader派生的类,在本例中是Jpeg。如下面的代码所示,它确实扩展了Loader类,我所读到的是,你可以使用一个指向基类的指针,设置它,然后返回它,所以我试过这样做,但没有成功。我如何让我的工厂返回Jpeg(最终返回一个Png类)?
下面是我的Loader头和源代码:

  1. // loader.h
  2. class Loader {
  3. public:
  4. static Loader* get(char* path);
  5. };
  6. // loader.cpp
  7. Loader* Loader::get(char* path) {
  8. string pathStr(path);
  9. pathStr = pathStr.substr(pathStr.rfind(".") + 1);
  10. Loader* loader;
  11. if (pathStr == "jpeg" || pathStr == "jpg") {
  12. loader = Jpeg(path);
  13. }
  14. return loader;
  15. }


然后Jpeg类扩展了Loader类:

  1. class Jpeg : public Loader {
  2. protected:
  3. char* path;
  4. public:
  5. Jpeg(char* path) {
  6. this->path = path;
  7. }
  8. };

xzv2uavs

xzv2uavs1#

这个错误是不言自明的-loader的类型是Loader *,它是指向Loader类型的指针。你只能给指针分配一个地址。Jpeg(path)将创建一个class Jpeg类型的对象,而不是class Jpeg类型的指针。看看你的用例,你需要动态分配Jpeg类型的对象:

  1. loader = new Jpeg(path);

字符串
完成Jpeg对象后,确保使用delete操作符释放内存。
C++不鼓励使用裸指针,相反,你应该更喜欢使用smart pointers。智能指针是一种抽象数据类型,它模拟指针,同时提供附加功能,如自动内存管理。在你的代码中,你可以这样使用它们-

  1. std::shared_ptr<Loader> loader;
  2. if (pathStr == "jpeg" || pathStr == "jpg") {
  3. loader = std::make_shared<Jpeg>(path);
  4. }


你还需要修改Loader::get()函数的返回类型-

  1. std::shared_ptr<Loader> Loader::get(char* path) {
  2. ^^^^^^^^^^^^^^^^^^^^^^^


并且需要以类似的方式在函数声明中进行更改。
此外,当以C++编码时,避免使用char *类型,而更喜欢使用string类型。

  1. std::string s{"test.jpeg"};
  2. std::shared_ptr<Loader> x = Loader::get(s);


Loader::get()中,将参数类型更改为std::string &std::string引用):

  1. std::shared_ptr<Loader> Loader::get(std::string & path) {
  2. ^^^^^^^^^^^^^


需要在class Jpeg中进行更改:

  1. class Jpeg : public Loader {
  2. protected:
  3. std::string path;
  4. public:
  5. Jpeg(std::string & path) {
  6. this->path = path;
  7. }
  8. };

展开查看全部

相关问题