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

[C++] Dziedziczenie problem

Ostatnio zmodyfikowano 2013-07-12 01:14
Autor Wiadomość
Bimbol
Temat założony przez niniejszego użytkownika
[C++] Dziedziczenie problem
» 2013-07-11 15:36:49
Witam,
bawię się w dziedziczeniu. Jak dotąd wszystko szło mi bez problemowo.
Jednak w końcu doszło do sytuacji, gdzie nie rozumiem czego czepia się kompilator.

test.h:
C/C++
class IDemonyWojny
{
protected:
    std::string m_ClanName;
public:
    IDemonyWojny()
        : m_ClanName( "Demony Wojny" )
    { }
    virtual ~IDemonyWojny() { m_ClanName = ""; }
    virtual void MemberInfo();
};

class CMember
    : public IDemonyWojny
{
protected:
    std::string m_Name;
    std::string m_Rank;
public:
    CMember( std::string Name, std::string Rank )
        : m_Name( Name )
        , m_Rank( Rank )
    { }
    void MemberInfo();
};

class CLeader
    : public CMember
{
public:
    CLeader() { } // Przy tym konstruktorze wyrzuca blad.
};

Wyrzuca błąd:
Z1\test.h||In constructor 'CLeader::CLeader()':|
 Z1\test.h|29|error: no matching function for call to 'CMember::CMember()'|
 Z1\test.h|29|note: candidates are:|
 Z1\test.h|22|note: CMember::CMember(std::string, std::string)|
 Z1\test.h|22|note:   candidate expects 2 arguments, 0 provided|
 Z1\test.h|16|note: CMember::CMember(const CMember&)|
 Z1\test.h|16|note:   candidate expects 1 argument, 0 provided|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===|
P-87540
Thud
» 2013-07-11 16:02:48
Założę się, że kompilatorowi chodzi o to, że zdefiniowałeś konstruktor, a w klasie, która dziedziczy klasę z konstruktorem, wcale go nie używasz do stworzenia obiektu (tak jakbyś używał funkcji która ma argumenty, a ich nie wpisał).

//Edit:
Jak sobie z tym nie poradzisz, to wrzucę potem przykładowy kod (albo ktoś inny).
P-87545
Bimbol
Temat założony przez niniejszego użytkownika
» 2013-07-11 16:15:39
Właśnie jak nie ma tego konstruktora w CLeader to działa. Nawet jak wstawiam tam argumenty i próbuje przypisać do tych wartości to nic nie daje.
Dopiero jak usunąłem przypisywanie w konstruktorze CMember, to się program skompilował.

Zrobiłem tak, że utworzyłem dwa konstruktory w CMember, jeden z argumentami a drugi bez. Gdy wyrzucam ten bez argumentów to znów są błędy więc widocznie tak musi być.

Dzięki za odpowiedź, troche mnie nakierowałeś.
P-87551
Thud
» 2013-07-11 16:24:49
Jak będzie mi się chciało to i tak napiszę potem przykładowy kod.
P-87556
Bimbol
Temat założony przez niniejszego użytkownika
» 2013-07-11 19:42:19
Przyda się, także będę oczekiwał w tym temacie.
P-87579
Matej
» 2013-07-11 21:28:51
C/C++
class CLeader
    : public CMember
{
public:
    static std::string i;
    static std::string j;
    CLeader()
        : CMember( i, j )
    { } // Przy tym konstruktorze wyrzuca blad.
};

Lista inicjalizacyjna i pamiętaj o funkcji main bo kompilator też wyrzuci ci błąd.
P-87594
domin568
» 2013-07-11 23:45:26
Możesz tez napisać w deklaracji konstruktora do parametrów przyjmowanych =0 czyli konstruktor (int =0) oraz kiedy do funkcji nie zostaną wysłane żadne argumenty to przypisze im wartość 0 .
P-87616
Thud
» 2013-07-12 01:14:36
Kurde, widzę że ktoś mnie uprzedził...
C/C++
#include <string>
using namespace std;
class IDemonyWojny
{
protected:
    std::string m_ClanName;
public:
    IDemonyWojny()
        : m_ClanName( "Demony Wojny" )
    { }
    virtual ~IDemonyWojny() { m_ClanName = ""; }
    virtual void MemberInfo();
};

class CMember
    : public IDemonyWojny
{
protected:
    std::string m_Name;
    std::string m_Rank;
public:
    CMember( std::string Name, std::string Rank )
        : m_Name( Name )
        , m_Rank( Rank )
    { }
    void MemberInfo();
};

class CLeader
    : public CMember
{
private:
    std::string One, Two;
public:
    CLeader()
        : CMember( One, Two )
    { } // Przy tym konstruktorze wyrzuca blad.
};
int main()
{
   
    return 0;
}
P-87618
« 1 »
  Strona 1 z 1