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

Dziedziczenie konstruktora, C++

Ostatnio zmodyfikowano 2009-07-29 08:58
Autor Wiadomość
steckel
Temat założony przez niniejszego użytkownika
Dziedziczenie konstruktora, C++
» 2009-07-27 21:42:51
Czy jest to możliwe? Jeśli tak to jak? Mam problem z tym kodem:
C/C++
class cObject {
public:
    string m_strName;
    int m_iPositionX;
    int m_iPositionY;
    BITMAP * m_bmpImage;
    int m_iWidth;
    int m_iHeight;
    cObject();
    cObject( string, int, int, string );
    void print();
};

class cCharacter
    : public cObject
{
public:
    int m_iHP;
    int m_iAttack;
    int m_iDefense;
    int m_iInjuryMin;
    int m_iInjuryMax;
    int m_iSpeed;
};

class cMonster
    : public cCharacter
{
};

class cPlayer
    : public cCharacter
{
};
Będę musiał pisać konstruktor dla każdej z klas dziedzicznych? Jeśli nie to jak mogę się odwołać do konstruktora klasy cObject dla klasy cPlayer?
P-8836
DeBugger
» 2009-07-27 22:23:55
Bodajże się to robi tak (choć sam nie dziedziczyłem nigdy konstruktora):
C/C++
KlasaPochodna()
    : KlasaBazowa()
Ok, Fanael i Pan Piotr wszystko wyjaśnili.
P-8838
DejaVu
» 2009-07-27 22:27:46
Dokładniej:
C/C++
KlasaPochodna::KlasaPochodna()
    : KlasaBazowa() //jeśli konstruktor ma jakieś argumenty możemy je tu ustawić // tu jeszcze inicjacja zmiennych należących do klasy pochodnej
{
}
P-8839
steckel
Temat założony przez niniejszego użytkownika
» 2009-07-27 22:56:30
Rozumiem, że trzeba napisać konstruktory do klas pochodnych, ale wystarczy tam tworzyć zmienne, które nie są tworzone w konstruktorze bazowym. Dobrze kombinuję?
Wcześniej próbowałem to zrobić tak:
C/C++
pPlayer = new cPlayer::cCharacter::cObject( "Player", 100, 100, "pics/characters/template.bmp" );
logi:

error C2440: '=' : cannot convert from 'cObject *' to 'cPlayer *'
P-8841
DeBugger
» 2009-07-28 12:56:34
Napisałem Ci kod, może coś Ci przybliży:
C/C++
#include <iostream>
using namespace std;
class Bazowa
{
protected:
    int x; //zmienna chroniona
public:
    Bazowa();
    virtual ~Bazowa(); //destruktor musi być virtualny
};
class Pochodna
    : public Bazowa
{
public:
    int xret( void );
    Pochodna();
    virtual ~Pochodna(); //tutaj lepiej wstawić virtual
};
Bazowa::Bazowa()
    : x( 5 )
{
}
Bazowa::~Bazowa()
{
}
int Pochodna::xret( void )
{
    return x;
}
Pochodna::Pochodna()
    : Bazowa()
{
}
Pochodna::~Pochodna()
{
}
int main()
{
    Pochodna * foo = new Pochodna(); //"wydziedziczony" konstruktor - najpierw wywołuje się konstruktor klasy Pochodna, później Bazowa
    cout << foo->xret() << endl;
    delete foo;
}
P-8844
steckel
Temat założony przez niniejszego użytkownika
» 2009-07-28 19:34:26
Dzięki! Chyba sobie poradziłem, ale mam jeszcze coś takiego:
C/C++
1 > main.obj: error LNK2001: unresolved external symbol "class cPlayer * pPlayer"( ? pPlayer @ @ 3PAVcPlayer @ @ A )
1 > D:\p rojekty\inne\diablo\Debug\diablo.exe
    : fatal error LNK1120
    : 1 unresolved externals
Potencjalne błędy:
main.hpp
C/C++
extern cPlayer * pPlayer;
main.cpp
C/C++
pPlayer = new cPlayer();
pPlayer->print();
delete pPlayer;

P-8851
steckel
Temat założony przez niniejszego użytkownika
» 2009-07-28 19:56:21
Nie jestem zbytnio zorientowany w nazewnictwie. Możesz przybliżyć o co ci chodzi? Tu są konstruktory jakby co:
C/C++
cObject::cObject() {
    m_strName = "Object";
    m_iPositionX = 0;
    m_iPositionY = 0;
    m_bmpImage = create_bitmap( 50, 50 );
    m_iWidth = 50;
    m_iHeight = 50;
}

cCharacter::cCharacter()
    : cObject()
{
    m_iCurHP = m_iMaxHP = 100;
    m_iAttack = 20;
    m_iDefense = 20;
    m_iInjuryMin = 5;
    m_iInjuryMax = 10;
}

cPlayer::cPlayer()
    : cCharacter()
{
}
P-8852
steckel
Temat założony przez niniejszego użytkownika
» 2009-07-28 20:43:15
Dzięki! Myślałem, że to wystarczy:
C/C++
extern cPlayer * pPlayer;
A jak mogę wywołać konstruktory z parametrami z klas cObject i cCharacter do zmiennej typu cPlayer?
P-8857
« 1 » 2 3 4
  Strona 1 z 4 Następna strona