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: int * A = new int;
int * B = new int;
a co jesli ja nie znam typu A, a chce stworzyć B takiego samego typu? próbowałem tak: 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? |
|
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ć? |
|
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 |
|
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: 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. |
|
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? |
|
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ę. |
|
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 class Ammo { public: Ammo(); Ammo( int fuel, float angle, int angleOffset, int variation ) : emitter( fuel, angle, angleOffset, variation ) { }; virtual ~Ammo(); Ammo( Ammo & ammo ) { tex = ammo.tex; sprite = ammo.sprite; emitter = ammo.emitter; 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::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 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? |
|
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? |
|
« 1 » 2 |