Klasa abstrakcyjna a tworzenie jej pochodnego obiektu

0

Cześć. Wie ktoś może, jak poradzić sobie z takim problemem. Otóż, mam klasę abstrakcyjną. Ma ona 2 dzieci.
Chciałbym przechowywać w kontenerze wskaźniki na "rodzeństwo". Chciałbym w metodzie nowej klasy, móc kopiować, już istniejący konterner jednak nie moge tego zrobić w ten sposób bo Klasa Sklep, mająca dzieci warzywaniak, market, jest abstrakcyjna.

Vector.push_back(new Sklep(*member));  

gdzie member jest wskaźnikiem na kopiowaną podklasę.

0

Niech obiekt sam umie sie sklonować.

0

Sklep?

1

Nie, "rodzeństwo"

0

A o co chodzi z tym klonowaniem, gdzie mogę znaleŹć informacje nt. temat?

0

Niech klasa Sklep ma metodę abstrakcyjną clone() zwracającą Sklep* i niech jej podklasy ją implementują poprzez utworzenie nowego obiektu i skopiowanie się do niego. Czyli dla podklas to będzie coś w stylu

virtual Sklep* clone(){
  return new Warzywniak(this);
}

Zakładając że masz tam konstruktor kopiujący w tej klasie.

0

Dzięki ziomek, o to chodziło!! Korzystając z okazji chcaiłbym zadać Ci jeszcze jedno pytanie, bo tą funkcją wirtulana, rozwiązałeś u mnie kilka innych problemów. Dlaczego takie coś działa

 void Register::Add(Sklep *newone) {
	Vector.push_back(newone->clone());
}

A takie coś, powoduję już błędy w pamieci, gdy przechodze Vector, a niby to samo.

 void Register::Add(Sklep *newone) {
	Vector.push_back(new Sklep(*newone));
}

Czy z tego wynika, że klasa sklep nie potrafi prze konwertować się na podklase?

0

Ależ potrafi, tyle że piszesz new Sklep to co kompilator ma cię zignorować?

0

Nie rozumiem to co mam napisać? Nie mogę jawnie wywołać konstruktora podklasy?

0

@Brakl przecież to są dwie ZUPEŁNIE INNE RZECZY! Popatrz który konstruktor woła metoda clone(). Woła konstruktor klasy pochodnej a nie klasy bazowej!
Żeby zrobić coś takiego jak napisałeś to musiałbyś zrobić takie brzydkie coś:

 void Register::Add(Sklep *newone) {
    Warzywniak* wskaznik = dynamic_cast<Warzywniak*>(newone);
    if (wskaznik !=NULL){
        Vector.push_back(new Warzywniak(*newone));
    }else{
        Vector.push_back(new Market(*newone));  
    }
}

Korzystam tutaj z RTTI -> sprawdzam realny typ obiektu w trakcie wykonania programu i na tej podstawie wołam odpowiedni konstruktor. Ale sam widzisz że to słaba metoda. Jakbyś miał 100 podklas to byś miał 100 ifów ;] Wirtualna metoda clone() jest dużo lepsza.

0
Shalom napisał(a):

@Brakl przecież to są dwie ZUPEŁNIE INNE RZECZY! Popatrz który konstruktor woła metoda clone(). Woła konstruktor klasy pochodnej a nie klasy bazowej!
Żeby zrobić coś takiego jak napisałeś to musiałbyś zrobić takie brzydkie coś:

 void Register::Add(Sklep *newone) {
    Warzywniak* wskaznik = dynamic_cast<Warzywniak*>(newone);
    if (wskaznik !=null){
        Vector.push_back(new Warzywniak(*newone));
    }else{
        Vector.push_back(new Market(*newone));  
    }
}

No rozumie, ale pisząc

  void Register::Add(Sklep *newone) {
    Vector.push_back(new Warzywniak(*newone));
}

Zamkne sobie droge zeby stworzyc, market. Czyli metoda z clonem jest jedyna mozliwa?

1

Czy ty czytasz moje posty ze zrozumieniem? Przecież pokazałem ci jak można to zrobić żeby nie "zamykać sobie drogi"... Metoda z clonem jest jedyna poprawna i sensowna, ale na pewno nie jedyna możliwa ;]

0
Brakl napisał(a):
Shalom napisał(a):

@Brakl przecież to są dwie ZUPEŁNIE INNE RZECZY! Popatrz który konstruktor woła metoda clone(). Woła konstruktor klasy pochodnej a nie klasy bazowej!
Żeby zrobić coś takiego jak napisałeś to musiałbyś zrobić takie brzydkie coś:

 void Register::Add(Sklep *newone) {
    Warzywniak* wskaznik = dynamic_cast<Warzywniak*>(newone);
    if (wskaznik !=null){
        Vector.push_back(new Warzywniak(*newone));
    }else{
        Vector.push_back(new Market(*newone));  
    }
}

No rozumie, ale pisząc

  void Register::Add(Sklep *newone) {
    Vector.push_back(new Warzywniak(*newone));
}

Zamkne sobie droge zeby stworzyc, market. Czyli metoda z clonem jest jedyna mozliwa?

Sorry, juz rozumiem. 2 ostatnie posty do usuniecia. Dzięki, żeby więcej takich ludzi było to programowanie byłoby dużo prostsze.

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