Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tworzenie obiektu operatorem new tego samego typu co inny obiekt

Ostatnio zmodyfikowano 2014-06-23 20:06
Autor Wiadomość
colorgreen19
Temat założony przez niniejszego użytkownika
Tworzenie obiektu operatorem new tego samego typu co inny obiekt
» 2014-06-22 14:40:46
Nie wiem czy zrozumiały jest tytył, wiec przedstawie problem:
C/C++
int * A = new int; //tworzenie zmiennej

int * B = new int; //tworzenie kolejnej zmiennej tego samego typu co zmienna A;
a co jesli ja nie znam typu A, a chce stworzyć B takiego samego typu?
próbowałem tak:
C/C++
ItemAmmo * tmp = reinterpret_cast < ItemAmmo * >( m_slots[ spell ] );
Ammo * tmp1 = tmp->GetAmmo();
auto * skill = new auto( * tmp1 );
(
cout << typeid( * tmp1 ).name();
 zawiera poprawny typ (AmmoWizardBasic)), jednak wyskakuje błąd w ostatniej linijce, że nie można stworzyć obiektu Ammo bo to jest klasa abstrakcyjna, mimo, że przecież teoretycznie powinno tam utworzyć AmmoWizardBasic, a nie Ammo.
Jak można rozwiązać ten problem?
P-112495
Jacob99
» 2014-06-22 14:44:38
Nie do końca rozumiem twój problem. Po co ci takie sztuczki, skoro wiesz jaki typ chcesz utworzyć?
P-112496
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-06-22 14:46:25
no wlasnie pisze ze nie wiem. Tu akurat wiem, ale to ma być uniwersalny mechanizm obsługujący inne klasy, tu-> ataki postaci
e1/ kontynuacja tego: http://cpp0x.pl/forum/temat/?id=16076&p=2
P-112497
Monika90
» 2014-06-22 15:42:16
W klasie bazowej deklarujesz f. wirtualną clone(), przedefiniowujesz ją w klasach pochodnych, tak żeby tworzyła kopię obiektu dla którego została wywołana. Przykład:
C/C++
class Base
{
public:
    virtual Base * clone() const = 0;
    virtual ~Base() { }
};

class Derived
    : public Base
{
    Derived * clone() const override { return new Derived( * this ); }
};

class Derived2
    : public Base
{
    Derived2 * clone() const override { return new Derived2( * this ); }
};

int main()
{
    Base * p = new Derived();
    Base * p2 = p->clone();
}

To
new Derived( * this );
 używa kontruktora kopiującego, więc musi on utworzyć poprawną kopię obiektu, ewentualnie można użyć jakiegoś innego konstruktora.
P-112499
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-06-22 19:00:18
zrobiłem tak ale wyskakują błędy
error: use od deleted function 'AmmoWizardBasic::AmmoWizardBasic( const AmmoWizardBasic&)'
 i tego typu podobne....

e1/ czy to jest spowodowane tym ze niezdefiniowałem własnych konstruktorów kopiujących?
P-112520
Monika90
» 2014-06-22 19:55:32
To znaczy że klasa AmmoWizardBasic nie ma konstruktora kopiujacego. Normalnie kompilator sam definiuje konstruktor kopiujący, u Ciebie nie mógł tego zrobić z jakiegoś powodu - może ta klasa zawiera unique_ptr. Pokaż tę klasę.
P-112525
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-06-22 20:01:28
nie tylko dla tej klasy wywala błąd ale też dla innych np AmmoArcherBasic. Klasy te mają składowe głównie po klasie Ammo, zmieniają tylko kolory czy wygląd
Ammo.h
C/C++
class Ammo
{
public:
    Ammo();
    Ammo( int fuel, float angle, int angleOffset, int variation )
        : emitter( fuel, angle, angleOffset, variation )
    { };
    virtual ~Ammo();
    Ammo( Ammo & ammo ) //Jakieś takie wypociny
    {
        tex = ammo.tex;
        sprite = ammo.sprite;
        emitter = ammo.emitter; //!! błąd bo nie ma k. kopiującego i operatora przypisania
        lifetime = ammo.lifetime;
        angle = ammo.angle;
        use = ammo.use;
        manause = ammo.manause;
        velocity = ammo.velocity;
        damage = ammo.damage;
        m_hit = ammo.m_hit;
    }
   
    sf::Vector2f GetPosition() const { return sprite.getPosition(); };
    //sf::RectangleShape shape;
    sf::Texture tex;
    sf::Sprite sprite;
    Particle emitter;
    sf::Time lifetime;
    float angle;
    int use;
    int manause;
    sf::Vector2f velocity;
    int damage;
   
    virtual void Update( sf::Time elapsed );
    virtual void Draw( sf::RenderWindow * okno ) = 0;
   
    virtual void Hit();
    virtual bool GetDelete() = 0;
    bool GetHit() const { return m_hit; };
   
    virtual Ammo * clone() const { };
protected:
    bool m_hit;
private:
};
Bardziej jednak składniam się ku temu, że składową jest Particle emitter, mój własny typ (dla którego tez wywala błąd) a nie może utworzyć poprawnego k. kopiującego bo zawira liste wskaźników (chociaż na tym etapie kopiowania, kiedy nie wywoła się funkcja Update() on i tak jest pusta)
Particle.h
C/C++
class Particle
{
public:
    Particle();
    Particle( int fuel );
    Particle( int fuel, int angle, int angleOffset, int variation );
    ~Particle();
    void Move( int posX, int posY );
    void SetAngle( int angle );
    void SetAngleOffset( int angleOffset );
    void SetColor( sf::Color color );
    void SetColorDie( sf::Color color );
    void SetPosition( int posX, int posY );
    void SetGravity( int gravity );
    void SetSpeed( int speed );
    void SetLifetime( float lifetime );
    void SetDiffusion( int diffusion );
    void SetLifetimeVariation( int variation );
    void SetSpeedVariation( int variation );
    void SetLifetimeDie( float dietime );
    void SetEmiting( bool emitting );
    void SetSize( int radius );
   
    void Hit();
   
    void OnOffEmiting();
   
    void CuttingToScreen( sf::Rect < int > rect );
    void Update( sf::Time elapsed );
    void Draw( sf::RenderWindow * okno );
   
    void ClearParticles();
    void AddParticles( int count );
    bool GetDelete();
   
    sf::Vector2f GetPosition() const;
   
protected:
private:
    struct P
    {
        sf::Vector2f velocity;
        sf::Vector2f position;
        sf::Color color;
        sf::Time lifetime;
        sf::CircleShape shape;
    };
    P p;
    std::list < P * > m_particles;
    std::list < P * >::iterator m_it;
   
    sf::RenderTexture render;
    sf::Sprite sprite;
   
    int m_fuel, m_positionX, m_positionY, m_gravity, m_speed, m_diffusion, m_lifetimeVariation, m_speedVariation, m_radius;
    float m_dietime;
    float m_ratioColorR, m_ratioColorG, m_ratioColorB;
    int m_angle, m_angleOffset;
    bool m_emitting, m_diffusionBool;
    sf::Color m_color, m_colorDie;
    sf::Time m_lifetime;
};
Musze napisać własny konstruktor który tą std::list "poprawnie obsłuży", nie?
P-112526
Monika90
» 2014-06-22 20:28:18
Ammo( Ammo & ammo )
tu powinno być
Ammo( const Ammo & ammo )


Particle nie jest kopiowalne, bo zawiera sf::RenderTexture, które nie jest kopiowalne.

Czy jesteś pewien że potrzebujesz tam list<P*> zamiast vector<P>, dlaczego?

P-112529
« 1 » 2
  Strona 1 z 2 Następna strona