klasa, w której występują obiekty z innej klasy. Error z konstruktorem

0

Witem,
Piszę niezbyt spomplikowaną grę, w której m.in mam dwie klasy. Klasę postac i klasę przedmiot obie w osobnych plikach.
W postac.h:

#pragma warning (disable:4996)
#ifndef POSTAC_H_
#define POSTAC_H_
//******************************************************************
#include <cstring>
#include "przedmiot.h"
struct postac
{
	char imie[10];
	int hp;
	int wytrz;
	int str;
	int agi;
	double obrazenia;
	double obrona;
	int lvl;
	int exp;
	int req_exp;
	int pkt_nauki;
	przedmiot amulet;
	przedmiot lewa_reka;
	przedmiot prawa_reka;
	przedmiot zbroja;
	postac(const char *namea, int hpa, int wytrza, int stra, int agia, int lvla, int expa, int pkt_naukia);
};
inline postac::postac(const char *namea, int hpa, int wytrza, int stra, int agia, int lvla, int expa, int pkt_naukia)
{ // <-tutaj znajduje sie linijka, o którą się czepia w błędach
	strcpy(imie, namea ? namea : "");
	hp = hpa;
	wytrz = wytrza;
	str = stra;
	agi = agia;
	lvl = lvla;
	exp = expa;
	pkt_nauki = pkt_naukia;
}
//******************************************************************
#endif
 

no i klase przedmiot w pliku przedmiot.h

 
#pragma warning (disable:4996)
#ifndef PRZEDMIOT_H_
#define PRZEDMIOT_H_
//******************************************************************
#include <cstring>
struct przedmiot
{
	char nazwa[50];
	int obrazenia;
	int obrona;
	int hp;
	char przeznaczenie[15];
	przedmiot(const char *opis, int obrazeniaa, int obronaa, int hpa, const char *przeznaczeniea);
};
inline przedmiot::przedmiot(const char *opis, int obrazeniaa, int obronaa, int hpa, const char *przeznaczeniea)
{
	strcpy(nazwa,opis ? opis: "");
	obrazenia = obrazeniaa;
	obrona = obronaa;
	hp = hpa;
	strcpy(przeznaczenie, przeznaczeniea ? przeznaczeniea : "");
}
//******************************************************************
#endif

problem mam w tym, że w momencie kompliacji wywala mi takie błędy:
Error 1 error C2512: 'przedmiot' : no appropriate default constructor available c:\users\mateusz\desktop\gra\gra\postac.h 27 1

Error 3 error C2512: 'przedmiot' : no appropriate default constructor available c:\users\mateusz\desktop\gra\gra\postac.h 27 1

Error 4 error C2512: 'przedmiot' : no appropriate default constructor available c:\users\mateusz\desktop\gra\gra\postac.h 27 1

6	IntelliSense: no default constructor exists for class "przedmiot"	c:\Users\Mateusz\Desktop\gra\gra\postac.h	27	1

Co więcej napisałem funkcję, która ma być odpowiedzialna za zmianę przedmiotu z tych, które postać posiada na te, które gdzieś sobie znajdzie:

void wez_przedm(przedmiot &skad, postac &bohater)
{
	if (skad.przeznaczenie == "amulet")
	{
		przedmiot temp = bohater.amulet;
		bohater.amulet = skad;
		skad = temp;
	}
	else if (skad.przeznaczenie == "zbroja")
	{
		przedmiot temp = bohater.zbroja;
		bohater.zbroja = skad;
		skad = temp;
	}
	else if (skad.przeznaczenie == "lewa reka")
	{
		przedmiot temp = bohater.lewa_reka;
		bohater.lewa_reka = skad;
		skad = temp;
	}
	else if (skad.przeznaczenie == "prawa reka")
	{
		przedmiot temp = bohater.prawa_reka;
		bohater.prawa_reka = skad;
		skad = temp;
	}
	else if (skad.przeznaczenie == "dwureczny")
	{
		przedmiot temp = bohater.prawa_reka;
		przedmiot temp2 = bohater.lewa_reka;
		bohater.prawa_reka = skad;
		skad = temp;
		//bohater.lewa_reka = zajete;
	}
}
```cpp

Pytanie, czy powinienem umieścić ją w przedmiot.cpp czy postac.cpp.
Z góry dzięki za pomoc, pzdr.
1

Linijka:

przedmiot(const char *opis, int obrazeniaa, int obronaa, int hpa, const char *przeznaczeniea);

tworzy dodatkowy konstruktor. Konstruktor domyślny (bezargumentowy) nie zostaje dodany.

W obiekcie postać znajdują się 4 instancje(nie wskaźniki!) klasy przedmiot:

przedmiot amulet;
przedmiot lewa_reka;
przedmiot prawa_reka;
przedmiot zbroja;

Przy tworzeniu instancji postaci kompilator próbuje utworzyć 4 przedmioty. Ponieważ nie inicializujesz ich w konstruktorze kompilator szuka konstruktora bezargumentowego i nie znajduje go. Stąd błędy.

Musisz zrobić tak:

inline przedmiot::przedmiot(const char *opis, int obrazeniaa, int obronaa, int hpa, const char *przeznaczeniea)
   : amulet( "Opis domyślnego amuletu", 0, 0, 0, "amulet" ), /*pozostałe przedmioty*/
{
        strcpy(nazwa,opis ? opis: "");
        obrazenia = obrazeniaa;
        obrona = obronaa;
        hp = hpa;
        strcpy(przeznaczenie, przeznaczeniea ? przeznaczeniea : "");
}

Ale przedmiot może nie istnieć, więc musisz zamienić instancje obiektów na wskaźniki i inicjalizować je NULL'em.

Funkcja zmieniająca przedmiot powinna być metodą klasy postaci.

1 użytkowników online, w tym zalogowanych: 0, gości: 1