Dziedziczeniem klas - Factory Pattern

0

Witam,
podczas kompilacji kodu dostaję błąd :

error C2440: 'initializing' : cannot convert from 'ShapeFactory *' to 'AbstractFactory *'
 

i chciałbym się dowiedzieć dlaczego dostaję taki komunikat skoro ShapeFactory dziedziczy od AbstractFactory?

 
class FactoryProducer
{
public:
	
	static AbstractFactory* getFactory(string choice)
	{
		if (choice.empty())
			return NULL;
		for (auto & c : choice) c = toupper(c);

		if (choice == "SHAPE")
		{
			AbstractFactory* temp = new ShapeFactory();
			return temp;
		}
		else if (choice == "COLOR")
		{
			AbstractFactory* temp = new ColorFactory();
			return temp;
		}
		return NULL;
	}

};

Oraz dostaję ten błąd
error C2143: syntax error : missing ';' before '*'
którego wg nie rozumiem.

0

Pewnie ShapeFactory nie pochodzi od AbstractFactory, zaś powinno.

0

Pics or it didn't happen.
Pokaż jak deklarujesz te klasy i to dziedziczenie i pokaż w którym miejscu kodu pokazuje ci błędy kompilacji.

0

Tak to wygląda

class ShapeFactory : public AbstractFactory
{
public:

	Color* getColor(string color) override
	{
		return NULL;
	}

	Shape* getShape(string shapeType)
	{
		if (shapeType.empty())
			return NULL;
		for (auto & c : shapeType) c = toupper(c);

		if (shapeType == "CIRCLE")
		{
			return new Circle();
		}
		else if (shapeType == "RECTANGLE")
		{
			return new Rectangle();
		}
		else if (shapeType == "SQUARE")
		{
			return new Square();
		}
		return NULL;
	}	
};
 
0
    static AbstractFactory* getFactory(string choice)
    {
        for (auto &c:choice) c=toupper(c);
        if(choice=="SHAPE") return new ShapeFactory();
        if(choice=="COLOR") return new ColorFactory();
        return 0;
    }

I zastanów się nad stworzeniem mapy

0

Do FactoryProducer.h nie dołączyłeś ShapeFactory.h ani ColorFactory.h

0

Nadal nic. Ale chyba nie muszę dodawać do FactoryProducer.h bo mam zainkludowane w AbstractFactory.h .

0

Błąd składni to tylko wypatrzyłem : zamiast ; w for (auto &c:choice) c=toupper(c); chyba, że ten : ma być i coś robi :O.

0

To wklej nową wersje FactoryProducer.h

Wersja z mapą jak proponowałem wyżej:

AbstractFactory *getFactory(string choice)
  {
   typedef AbstractFactory *fun();
   static unordered_map<string,fun*> map=
     {
     	{"SHAPE",[](){ return (AbstractFactory*) new ShapeFactory(); } },
     	{"COLOR",[](){ return (AbstractFactory*) new ColorFactory(); } },
     };
   for(auto &c:choice) c=toupper(c);
   unordered_map<string,fun*>::iterator f=map.find(choice);
   return f!=map.end()?f->second():0;
  }

Przy dwóch tylko typach prawdopodobnie nie będzie zysku, natomiast przy 5-6 już będzie. I zrób może strupr() z tej pętli.

0

O to ci chodziło?

#pragma once

#include <string>

#include "AbstractFactory.h"
#include "ShapeFactory.h"
#include "ColorFactory.h"

class FactoryProducer
{
public:
	
	static AbstractFactory* getFactory(string choice)
	{
		if (choice.empty())
			return NULL;
		for (auto & c : choice) c = toupper(c);

		if (choice == "SHAPE")
		{
			AbstractFactory* temp = new ShapeFactory();
			return temp;
		}
		else if (choice == "COLOR")
		{
			AbstractFactory* temp = new ColorFactory();
			return temp;
		}
		return NULL;
	}

};

 
0

I to działa? Bez std:: przed string? Nie sądzę ;]

0

Chyba wiem gdzie leży problem. Otóż zmieniłem #pragma once na:

#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H

#include <string>

#include "ShapeFactory.h"
#include "ColorFactory.h"

using namespace std;

class AbstractFactory
{
public:
	
	virtual	Shape* getShape(string shape) = 0;
	virtual	Color* getColor(string color) = 0;

};

#endif

ale teraz kompilator wg nie "widzi" że jest taka klasa.

1

A co ma niby widzieć skoro nie includujesz klas których używasz? o_O Brak mi do ciebie słów. Wbij sobie do głowy ze jeśli uzywasz klasy X to ją includujesz. Koniec. Kropka. Nie zakładasz ze sie gdzieś przy okazji zaincluduje, nie zakładasz że mama ci to dopisze jak będziesz spał, nie zakładasz że zębowa wróżka zrobi to za ciebie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.