Wzorzec dekoracyjny a konstruktor domyślny.

0

Witam, otóż w Internecie znalazłem gotowy kod na wzorzec dekoracyjny, lecz chciałem go trochę przystosować do moich potrzeb, a mianowicie w gotowym kodzie to wygląda tak:

    class Mercedes : public Samochod {

	public: Mercedes():Samochod(){
		    samochod = "Mercedes";
			wartosc=500000;
	    }
    	
};

a konstruktor do tego wygląda tak:

Samochod(){
			samochod = "Samochod podstawowy";
			wartosc=0;
		}

Lecz ja chciałem zrobić coś takiego:

class Mercedes : public Samochod {
public: Mercedes() :Samochod("Mercedes", 50000){}
};

i konstruktor:

Samochod(string samochod, int wartosc){
		this->samochod = samochod;
		this->wartosc = wartosc;
	}

Lecz niestety podczas kompilacji pojawia mi się następujący błąd:

Error 1 error C2512: 'Dekorator' : no appropriate default constructor available c:\users... 53 1 ConsoleApplication11

Jak to poprawić?

Cały kod prezentuje się tak:

// ConsoleApplication11.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <string>
using namespace std;

/* Standardowy nieudekorowany samochod */
class Samochod {
protected:
	string samochod;
	double wartosc;

public:
	Samochod(string samochod, int wartosc){
		this->samochod = samochod;
		this->wartosc = wartosc;
	}

	virtual string about(){
		return samochod;
	}

	virtual double cena(){
		return wartosc;
	}
};

/* abstrakcyjny dekorator */
class Dekorator : public Samochod {

public:
	virtual string about(){
		return "hmm";
	}
};

/* teraz mamy 2 przykladowe marki samochodow */
class Mercedes : public Samochod {
public: Mercedes() :Samochod("Mercedes", 50000){}
};

class Fiat : public Samochod {
public: Fiat() :Samochod("Fiat", 10000){}
};

/* czas na same dodatki */
class Klimatyzacja : public Dekorator {
	Samochod *car;

public: Klimatyzacja(Samochod *samochod) :Dekorator(){
			car = samochod;
}

		string about(){
			return car->about() + " + klimatyzacja";
		}

		double cena(){
			return car->cena() + 1111;
		}
};

class OponyZimowe : public Dekorator {
	Samochod *car;

public: OponyZimowe(Samochod *samochod) :Dekorator(){
			car = samochod;
}

		string about()
		{
			return car->about() + " + opony zimowe";
		}

		/* niech ceny beda takie same */
		double cena()
		{
			return car->cena() + 31234;
		}
};

int _tmain(int argc, _TCHAR* argv[])
{

	Samochod *s1 = new Mercedes();
	Samochod *s2 = new Fiat();

	cout << "\nBez wyposazenia" << endl;
	cout << s1->about() << " " << s1->cena() << endl;
	cout << s2->about() << " " << s2->cena() << endl;

	return 0;
}

1

Dopisać konstruktor do Dekorator

0

Dopisałem, lecz teraz mam inny błąd, otóż mój kod obecnie wygląda tak:

// ConsoleApplication11.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <list>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <initializer_list>
#include <vector>
#include <iterator>
using namespace std;


int proba = 0;
int g = 0;
int zmiennadokonstruktora = 0;
string tablicadokonstruktora[40];
float zmienna[10];
int zmienna2[10], zmienna5[10];
string zmienna3[10], zmienna4[10];


/* Standardowy nieudekorowany samochod */
class Produkt {
protected:
	double wartosc;
	string nazwa;
	int miara;
	string jednostka;
	string produkt;
	int nowa_miara;

public:
	Produkt(string nazwa, float cenaa, int miara, string jednostka, int nowa_miara){
		tablicadokonstruktora[zmiennadokonstruktora] = nazwa;
		zmiennadokonstruktora = zmiennadokonstruktora + 1;
		this->nazwa = nazwa;
		this->wartosc = cenaa;
		this->miara = miara;
		this->jednostka = jednostka;
		this->nowa_miara = nowa_miara;
	}

	virtual string about(){
		return nazwa;
	}

	virtual double cena(){
		return wartosc;
	}
};

/* abstrakcyjny dekorator */
class Dekorator : public Produkt {

public:
	Dekorator();
	virtual string about(){
		return "hmm";
	}
};

/* teraz mamy 2 przykladowe marki samochodow */
class Maka : public Produkt {
public: Maka() :Produkt("maka", 1.99, 1000, "gram", 1000){}
};

class Gouda : public Produkt {
public: Gouda() :Produkt("gouda", 23.29, 1000, "gram", 1000){}
};

/* czas na same dodatki */
class Klimatyzacja : public Dekorator {
	Produkt *car;

public: Klimatyzacja(Produkt *samochod) :Dekorator(){
			car = samochod;
}
		double cena(){
			return car->cena() + 1111;
		}
};


int _tmain(int argc, _TCHAR* argv[])
{

	Produkt *s1 = new Maka();
	Produkt *s2 = new Gouda();

	cout << "\nBez wyposazenia" << endl;
	cout << s1->about() << " " << s1->cena() << endl;
	cout << s2->about() << " " << s2->cena() << endl;

	//dodajemy po klimie
	s1 = new Klimatyzacja(s1);
	s2 = new Klimatyzacja(s2);
	cout << "\nZ Klima" << endl;
	cout << " " << s1->cena() << endl;
	cout << " " << s2->cena() << endl;


	return 0;
}

Zaś błąd mam taki:

Error 3 error LNK2019: unresolved external symbol "public: __thiscall Dekorator::Dekorator(void)" (??0Dekorator@@QAE@XZ) referenced in function "public: __thiscall Klimatyzacja::Klimatyzacja(class Produkt *)" (??0Klimatyzacja@@QAE@PAVProdukt@@@Z) c:\Users... ConsoleApplication11

0

I którego słowa nie rozumiesz?
Linkier twierdzi że owszem zadeklarowałeś ale nie zdefiniowałeś tego konstruktora.

2

Uprawiasz programowanie planetarne?

To, że jakiś obiekt różni si od drugiego wartością pola, nie jest powodem do tworzenia nowej klasy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1