C++ typ nowej zmiennej "odziedziczony" po jednym z rodziców

Odpowiedz Nowy wątek
2015-02-10 01:18
Czarny Samiec
0

Witam,

Muszę napisać program, jednym z jego funkcji jest "parowanie" obiektów, które mają wspólną klasę bazową, ale niekoniecznie pochodzą z tej samej klasy,a następnie utworzenie obiektu "dziecka" które jest typu jednego z rodziców. Nie jestem zbyt biegły w C++, ale szukałem niestety bezskutecznie. Ma ktoś jakiś pomysł? A może jest jakieś gotowe rozwiązanie?

Pozostało 580 znaków

2015-02-10 01:23
0

Napisz w pseudokodzie przykład użycia. Brzmi jak abstrakcyjna fabryka.

edytowany 1x, ostatnio: spartanPAGE, 2015-02-10 01:23

Pozostało 580 znaków

2015-02-10 01:42
Czarny Samiec
0

Powiedzmy mamy klasę A i z niej dziedziczą B1, B2, B3, B4
Tworzymy po 2 obiekty Bn i dobieramy w pary.
Następnie dla każdej pary tworzymy nowy obiekt typu Bn, gdzie n jest numerem któregoś rodzica

Pozostało 580 znaków

2015-02-10 02:22
1

Śmieszny problem :D O to chodziło?

#include <iostream>
#include <memory>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;

struct A 
{
    virtual void greet() const { cout << "I'm A" << endl; }
};

struct B1 : public A 
{
    virtual void greet() const override { cout << "I'm B1" << endl; }
};

struct B2 : public A 
{
    virtual void greet() const override { cout << "I'm B2" << endl; }
};

struct B3 : public A 
{
    virtual void greet() const override { cout << "I'm B3" << endl; }
};

struct B4 : public A 
{
    virtual void greet() const override { cout << "I'm B4" << endl; }
};

template<typename Mother, typename Father>
unique_ptr<A> createChild(const Mother&, const Father&)
{
    if (rand() % 2 == 0)
        return make_unique<Father>();
    else
        return make_unique<Mother>();
}

int main()
{
    srand(time(0));

    createChild(B1(), B2())->greet();
    createChild(B1(), B3())->greet();
    createChild(B1(), B4())->greet();
    createChild(B2(), B3())->greet();
    createChild(B3(), B4())->greet();

    return 0;
}
serio, * == 0? + Ucz ładnie dzieci używać &lt;random&gt; :) - spartanPAGE 2015-02-10 02:28
Nawet przyszło mi do głowy pisać w komentarzu, że ten sposób generowania liczb losowych jest już niepolecany :P Co do porównania, w tym przypadku chodzi o konkretną wartość, więc wolę tak. Testowanie boola czy nienullowości wskaźnika to już oczywiście bez ==. Kwestia stylu. - twonek 2015-02-10 02:30

Pozostało 580 znaków

2015-02-10 02:59
Czarny Samiec
0

Dziękuję bardzo, ale pojawiają się kolejne problemy. Powiedzmy, że są 3 warstwy klas: Z A dziedziczy B C i D. Z B dziedziczy B1,B2,B3, z C C1 i C2, a z D D1 i D2. Tylko klasy z numerkiem nie są abstrakcyjna. Każda ma jakieś swoje pola. I teraz dziecko ma dziedziczyć wartości pól po rodzicach, jak mają takie same pola to jest wybierana średnia, a jak oboje rodzice nie posiadają tego pola to jest przepisywane od tego drugiego rodzica.

Pozostało 580 znaków

2015-02-10 03:17
1
#include <iostream>
#include <string>
#include <random>
using namespace std;

using Str = string;

template<typename StrT = Str>
struct A{ 
    using Str = StrT;
    using CStrRef = const StrT &;
    A(CStrRef name): name(name){} 
    void greet(){ cout << "I am " << name << endl; }
    Str name;
};

struct B1:A<>
{ B1(): A<>("B1"){}};
struct B2:A<>
{ B2(): A<>("B2"){}};
struct B3:A<>
{ B3(): A<>("B3"){}};
struct B4:A<>
{ B4(): A<>("B4"){}};

template<
    typename OmniParent,
    typename Parent1, 
    typename Parent2, 
    typename URNG
>
inline OmniParent breed(URNG &urng, double chance){
    bernoulli_distribution dist(chance);
    return dist(urng)? (OmniParent)Parent1():(OmniParent)Parent2();
}

int main(){
    using A = A<>;
    default_random_engine gen;
    breed<A, B1, B2>(gen, 0.1).greet();
    breed<A, B1, B3>(gen, 0.2).greet();
    breed<A, B1, B4>(gen, 0.3).greet();
    breed<A, B2, B3>(gen, 0.4).greet();
    breed<A, B3, B4>(gen, 0.5).greet();
    return 0;
}

//EDIT: tak w ramach poprzedniego; Nie lubię wirtualnych metod.

  • a jak oboje rodzice nie posiadają tego pola to jest przepisywane od tego drugiego rodzica

Jeśli oboje tego nie mają, to jakim cudem ma to wziąć od drugiego? on też nie ma tego pola.

edytowany 2x, ostatnio: spartanPAGE, 2015-02-10 03:20
Po co A jest szablonem? No chyba że żeby pokazać, że można dziedziczyć po klasie szablonowej. - twonek 2015-02-10 03:37
Ot, natręctwo - spartanPAGE 2015-02-10 03:44

Pozostało 580 znaków

2015-02-10 03:24
Czarny Samiec
0

Pomyłka. Chodzi o to, że wartości pól które ma jeden rodzic są przepisywane od niego.

trochę to za dużo jak na co łaska - spartanPAGE 2015-02-10 03:51

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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