Wzorzec dekoracyjny a konstruktor domyślny.

2014-06-02 10:22
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;
}

Pozostało 580 znaków

2014-06-02 10:32
1

Dopisać konstruktor do Dekorator


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-06-02 11:35
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)" ([email protected]@[email protected]) referenced in function "public: thiscall Klimatyzacja::Klimatyzacja(class Produkt *)" ([email protected]@[email protected]@@@Z) c:\Users... ConsoleApplication11

Pozostało 580 znaków

2014-06-02 11:38
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-06-02 13:01
2

Uprawiasz programowanie planetarne?

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


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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