Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Rekomendowane odpowiedzi

Opublikowano

Witam mam pewien problem ponieważ chcę zrobić "loadera modów" ale podczas tworzenia klasy dziedzicznej od C_mod wyskakuje mi błąd o braku domyślmego konstruktora <_<

Kod błędu :

c:\users\suchyba\documents\visual studio 2010\projects\world of tanks 2d v2\world of tanks 2d v2\components.h(56): error C2512: 'C_ModPanther' : no appropriate default constructor available

Kod ,w którym występuje błąd :

class C_mod
{
private:
	C_mod* N_mod;
	C_listOfComponents* N_listOfComponents;
protected:
	std::string Name;
	std::string Version;
public:
	C_mod()
	{
		N_mod = new C_ModPanther();
		N_listOfComponents->RegisterMod(N_mod, 1);
	}
	virtual ~C_mod()
	{
		
	}
	std::string get_modName()
	{
		return Name;
	}
	virtual void OnEnable() = 0;
};
/*###################################################################*/
/*------------------------------MODS---------------------------------*/
/*###################################################################*/
class C_ModPanther : public C_mod
{
private:
	C_Tank* N_Tank;
	C_listOfComponents* N_listOfComponents;
public:
	C_ModPanther()
	{
		Name = "Panther Mod";
		Version = "1.0.0";
	}
	~C_ModPanther()
	{
		
	}
	void OnEnable()
	{
		std::cout<<"loading mod : "<<Name<<" "<<Version<<std::endl;
		N_Tank = new C_TankPanther;
		N_listOfComponents->RegisterTank(N_Tank, 1);
		std::cout<<"loading tank : "<<N_Tank->getName()<<std::endl;
	}
};

 

Opublikowano

N_mod = new C_ModPanther();
Jak ty sobie wyobrażasz coś takiego w konstruktorze klasy bazowej?

 

Co do samego błędu daj kod, który go powoduje

Opublikowano

 

N_mod = new C_ModPanther();
Jak ty sobie wyobrażasz coś takiego w konstruktorze klasy bazowej?

 

Co do samego błędu daj kod, który go powoduje

Błąd występuje w tym miejscu :

 

N_mod = new C_ModPanther();
 

A jeżeli to jakiś banalny błąd to sorry ale jestem początkujący w dziedzinie programowania obiektowego (to w sumie pierwsza moja aplikacja pisana w OOP)

Opublikowano

Ciągle występuje ten błąd z domyślnym konstruktorem :

1>c:\users\suchyba\documents\visual studio 2010\projects\world of tanks 2d v2\world of tanks 2d v2\components.h(56): error C2512: 'C_ModPanther' : no appropriate default constructor available

Dodałem to w ciele klasy.

Opublikowano

Jest problem z dziedziczeniem konstruktora. W klasie C_mod powinien (tak mi się wydaje) być wirtualny konstruktor. Poczytaj o tym gdzieś.

Opublikowano

Konstruktor nie może być dziedziczony. Tak chociaż czytałem w moim kursie, a z resztą jak podaje przed definicją konstruktora "virtual" podkreśla błąd : "Error: 'virtual' is not allowed"

Opublikowano

powtórzę

Jak ty sobie wyobrażasz coś takiego w konstruktorze klasy bazowej?

 

Klasa C_ModPanther nie jest jeszcze znana.

 

+ daj cały ten plik, bo błąd jest w 56 linii to brakuje jakichś 45

Opublikowano
#include <string>
#include <time.h>
#include "objects.h"

class C_mod;
class C_listOfComponents;
class C_ModPanther;
class C_TankPanther;
/*#########################################################*/
class C_listOfComponents
{
private:
	C_Tank* TanksTable[20];
	C_mod* ModsTable[10];
public:
	C_listOfComponents()
	{
		for(int i = 0; i < 20; ++i)
		{
			TanksTable[i] = NULL;
		}
		for(int j = 0; j < 10; ++j)
		{
			ModsTable[j] = NULL;
		}
	}
	~C_listOfComponents()
	{
		
	}
	void RegisterTank(C_Tank* N_Tank , int id_T)
	{
		TanksTable[id_T] = N_Tank;
	}
	void RegisterMod(C_mod* N_mod, int id_Mo)
	{
		ModsTable[id_Mo] = N_mod; 
	}
	C_mod* get_ModsTable(int id)
	{
		return ModsTable[id];
	}
};
/*####################################################################*/
class C_mod
{
private:
	C_mod* N_mod;
	C_listOfComponents* N_listOfComponents;
protected:
	std::string Name;
	std::string Version;
public:
	C_mod()
	{
		N_mod = new C_ModPanther();
		N_listOfComponents->RegisterMod(N_mod, 1);
	}
	virtual ~C_mod()
	{
		
	}
	std::string get_modName()
	{
		return Name;
	}
	virtual void OnEnable() = 0;
};
/*###################################################################*/
/*------------------------------MODS---------------------------------*/
/*###################################################################*/
class C_ModPanther : public C_mod
{
private:
	C_Tank* N_Tank;
	C_listOfComponents* N_listOfComponents;
public:
	C_ModPanther()
	{
		Name = "Panther Mod";
		Version = "1.0.0";
	}
	C_ModPanther (const C_ModPanther&){}
	~C_ModPanther()
	{
		
	}
	void OnEnable()
	{
		std::cout<<"loading mod : "<<Name<<" "<<Version<<std::endl;
		N_Tank = new C_TankPanther;
		N_listOfComponents->RegisterTank(N_Tank, 1);
		std::cout<<"loading tank : "<<N_Tank->getName()<<std::endl;
	}
};
/*##################################################################*/
/*----------------------------TANKS---------------------------------*/
/*##################################################################*/
class C_TankPanther : public C_Tank
{
public:
	C_TankPanther()
	{
		Name = "Panther";
	}
	~C_TankPanther()
	{
		
	}
};

Oto cały plik.

@edit

Jest już znany, bo jest prototyp klasy.

Opublikowano

Ale w tym prototypie klasy nie ma deklaracji konstruktora

 

porównaj to

#include <iostream>

using namespace std;
class A;
class B
{
public:
    A* a;
    B()
    {
        a = new A();
    }
};
class A
{
    public:
    A()
    {
        cout << "yay";
    }
};
int main()
{
    B b;
    return 0;
}
#include <iostream>

using namespace std;
class A
{
    public:
    A();
};
class B
{
public:
    A* a;
    B()
    {
        a = new A();
    }
};
A::A()
{
    cout << "yay";
}
int main()
{
    B b;
    return 0;
}
Opublikowano

Dzięki zadziałało a teraz jeszcze jedno małe pytanko czy takie coś jest możliwe ?

N_mod = new C_ModPanther;
Opublikowano

Tyle, że pojawiły się kolejne trzy błędy :

1.

1>c:\users\suchyba\documents\visual studio 2010\projects\world of tanks 2d v2\world of tanks 2d v2\components.h(64): error C2440: '=' : cannot convert from 'C_ModPanther *' to 'C_mod *'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Kod który go powoduje :

N_mod = new C_ModPanther;

2.

1>c:\users\suchyba\documents\visual studio 2010\projects\world of tanks 2d v2\world of tanks 2d v2\components.h(80): error C2011: 'C_ModPanther' : 'class' type redefinition

Kod który go powoduje :

class C_ModPanther : public C_mod

3.

1>          c:\users\suchyba\documents\visual studio 2010\projects\world of tanks 2d v2\world of tanks 2d v2\components.h(8) : see declaration of 'C_ModPanther'

Kod który go powoduje :

class C_ModPanther
{                   <-----------tutaj
public:
	C_ModPanther();
};

Kod całego pliku :

#include <string>
#include <time.h>
#include "objects.h"

class C_mod;
class C_listOfComponents;
class C_ModPanther
{
public:
	C_ModPanther();
};
class C_TankPanther
{
public:
	C_TankPanther();
};
/*#########################################################*/
class C_listOfComponents
{
private:
	C_Tank* TanksTable[20];
	C_mod* ModsTable[10];
public:
	C_listOfComponents()
	{
		for(int i = 0; i < 20; ++i)
		{
			TanksTable[i] = NULL;
		}
		for(int j = 0; j < 10; ++j)
		{
			ModsTable[j] = NULL;
		}
	}
	~C_listOfComponents()
	{
		
	}
	void RegisterTank(C_Tank* N_Tank , int id_T)
	{
		TanksTable[id_T] = N_Tank;
	}
	void RegisterMod(C_mod* N_mod, int id_Mo)
	{
		ModsTable[id_Mo] = N_mod; 
	}
	C_mod* get_ModsTable(int id)
	{
		return ModsTable[id];
	}
};
/*####################################################################*/
class C_mod
{
private:
	C_mod* N_mod;
	C_listOfComponents* N_listOfComponents;
protected:
	std::string Name;
	std::string Version;
public:
	C_mod()
	{
		N_mod = new C_ModPanther;
		N_listOfComponents->RegisterMod(N_mod, 1);
	}
	virtual ~C_mod()
	{
		
	}
	std::string get_modName()
	{
		return Name;
	}
	virtual void OnEnable() = 0;
};
/*###################################################################*/
/*------------------------------MODS---------------------------------*/
/*###################################################################*/
class C_ModPanther : public C_mod
{
private:
	C_Tank* N_Tank;
	C_listOfComponents* N_listOfComponents;
public:
	C_ModPanther::C_ModPanther()
	{
		Name = "Panther Mod";
		Version = "1.0.0";
	}
	~C_ModPanther()
	{
		
	}
	void OnEnable()
	{
		std::cout<<"loading mod : "<<Name<<" "<<Version<<std::endl;
		N_Tank = new C_TankPanther;
		N_listOfComponents->RegisterTank(N_Tank, 1);
		std::cout<<"loading tank : "<<N_Tank->getName()<<std::endl;
	}
};
/*##################################################################*/
/*----------------------------TANKS---------------------------------*/
/*##################################################################*/
class C_TankPanther : public C_Tank
{
public:
	C_TankPanther::C_TankPanther()
	{
		Name = "Panther";
	}
	~C_TankPanther()
	{
		
	}
};
Weteran
Opublikowano

Robisz to źle...
Nie zważając na to co inni ci napisali, proponuję ci abyś napisał to jeszcze raz, tylko tym razem tak, jak cie uczono(lub też nie) pisać programy w c++.
Czyli wpierw deklaracje klas, a potem definicje ich składowych, najlepiej w oddzielnych plikach (jedna klasa - dwa pliki).

A jeżeli koniecznie chcesz to naprawić to po pierwsze zamiast tego:

class C_ModPanther
{
public:
    C_ModPanther();
};
class C_TankPanther
{
public:
    C_TankPanther();
};

wstaw deklaracje zapowiadające

A po drugie, w klasie c_mod definicje konstruktora zastąp jego deklaracją, a definicje stwórz na zewnątrz klasy, pod klasą C_TankPanther i to samo zrób ze składową klasy C_ModPanther OnEnalbe()

  • 3 tygodnie później...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...