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: 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() { } }; 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) ===|
|
|
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). |
|
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ś. |
|
Thud |
» 2013-07-11 16:24:49 Jak będzie mi się chciało to i tak napiszę potem przykładowy kod. |
|
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. |
|
Matej |
» 2013-07-11 21:28:51 class CLeader : public CMember { public: static std::string i; static std::string j; CLeader() : CMember( i, j ) { } };
Lista inicjalizacyjna i pamiętaj o funkcji main bo kompilator też wyrzuci ci błąd. |
|
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 . |
|
Thud |
» 2013-07-12 01:14:36 Kurde, widzę że ktoś mnie uprzedził... #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 ) { } }; int main() { return 0; } |
|
« 1 » |