new + klasa abstrakcyja + kopiowanie

Odpowiedz Nowy wątek
2015-01-09 22:59
0

Witam ponownie. Najłatwiej odda mój problem poniższy kod:

class objectDef
{
public:
    sf::Shape*    visual;  // sf::Shape jest abstrakcyjna

    objectDef(sf::CircleShape)
    {
    visual = new sf::CircleShape(shape);
    // reszte kodu pomijam
     }
    objectDef(sf::ConvexShape)   / kazda z tych trzech dziedziczy z sf::Shape jednocześnie dodając co nieco od siebie jak np. getRadius() dla koła.
    {
    visual = new sf::CircleShape(shape);
    }
    objectDef(sf::RectangleShape)
   {
    visual = new sf::RectangleShape(shape);
    }

};

class shape
{
public:
   sf::Shape*    visual;

    shape(objectDef& obj)
   {
   visual = ???? // potrzebuję teraz skopiować całość z pod adresu obj.visual
                     // i zaalokowac to ponownie w nowej zmiennej/miejscu gdyż obj zaraz ulegnie zniszczeniu.
                    // tylko jak? chciałbym zachować właściwości każdej z 3 klas tzn specjalnie dostępne funkcje których sf::Shape (jak choćby wspomniany getRadius() dla koła) nie ma.  
                   //jednocześnie nie mogę stworzyć sf::Shape gdyż jest abstrakcyjna
   };

}

Pozostało 580 znaków

2015-01-10 00:19

Czy masz jakiś szczególny powód, dla którego musisz skopiować i zaalokować ponownie oprócz tego, że zaraz tamto ulegnie zniszczeniu? Bo jeśli nie, to po prostu opakuj ten wskaźnik w shared_ptr i możesz dalej używać nawet jak obiekt klasy objectDef zniknie.
Pseudokod:

class objectDef
{
public:
    shared_ptr<sf::Shape> visual;  // sf::Shape jest abstrakcyjna

    objectDef(sf::CircleShape)
    {
        visual = make_shared<sf::CircleShape>(shape);
        // reszte kodu pomijam
     }
};

class shape
{
public:
    shared_ptr<sf::Shape> visual;

    shape(objectDef& obj)
    {
        visual = obj.visual;
    };
};
Tak mi właśnie przez noc też przyszło, ze tylko utrudniam sobie życie bawiąc się tym ręcznie. Dzięki. - abbq 2015-01-10 09:11

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