Zapowiedzi klas, C++

0

Chciałbym prosić o pomoc. Przy kompilacji wywala błędy.
Projekt w załączniku

0

Nie chciało mi się przekopiowywać, no ale niech wam będzie :/

Person.h

#include "Position.h"
#include "Employer.h"
using namespace std;

class Person
{
public:
	
	Person(string name)
		:m_name(name), m_position("none", "none"), m_employer("none","none")
	{};
	~Person();
private:
	string m_name;
	bool m_employed;
	Position m_position;
	Employer m_employer;
};

 

Position.h

#pragma once
#include <string>

using namespace std;
class Position
{
public:
	Position(string name, string description)
		:m_name(name), m_description(description)
	{};
	~Position();
	string toString();

private:
	string m_name;
	string m_description;

};

 

Employer.h

#pragma once
#include <string>
#include "Position.h"
#include "Person.h"

using namespace std;


class Employer
{
public:
	
	Employer(string name, string market);
	~Employer();

	bool hire(Person & newHire, Position pos);
	string toString();

private:
	string m_name;
	string m_market;
};

Employer.cpp

#include "Employer.h"



Employer::Employer(string name, string market)
	:m_name(name), m_market(market)
{
}

Employer::~Employer()
{
}

bool Employer::hire(Person & newHire, Position pos)
{
	return false;
}


string Employer::toString()
{
	string x;


	return x;
}

Błędy:

Error	C3646	'm_employer': unknown override specifier	19	
Error	C2061	syntax error: identifier 'Person'	16	
Error	C4430	missing type specifier - int assumed. Note: C++ does not support default-int 	19	
Error	C2614	'Person': illegal member initialization: 'm_employer' is not a base or member	13	
 
0

masz zapętlenie, często wynika to ze złego rozplanowania. Szybką szpachlą było by forward declaration

#pragma once
#include <string>
#include "Position.h"
 
using namespace std;
 
class Person;

class Employer
{
public:
 
    Employer(string name, string market);
    ~Employer();
 
    bool hire(Person & newHire, Position pos);
    string toString();
 
private:
    string m_name;
    string m_market;
};

Poza tym czy Person na pewno ma mieć pracodawcę jako atrybut? Prędzej pracodawca by miał osobę. Chociaż można to też jakoś lepiej ogarnąć. Mógłbyś wywalić pracodawcę z Person i po kłopocie. Po co on Ci tam? Daj use case jakiś.

  • wywal using namespace std :p
0

Wywal implementacje do plików .cpp, w nagłówkach zostaw tylko deklaracje klas i ich metod. Przed klasą daj deklaracje zapowiadające klas które są jej potrzebne. Np.:

#include <string>
using namespace std;

class Employer;
class Position;

class Person
{
public:
    Person(string name);
    ~Person();
private:
    string m_name;
    bool m_employed;
    Position* m_position;
    Employer* m_employer;
};
1

A tak btw: złą praktyką jest using namespace xxx w plikach nagłówkowych.

0

Hm, a dlaczego potrzebne jest "class Employer;" a "class Position;" już nie?

1

Ja to bym wytłumaczył gdzie problem leży ale mi się nie chce.

0

Poprawiłem, ale nadal robię błąd.
Person musi mieć takie atrybuty, bo tak. To ćwiczenie z podręcznika ;)

Person.h

#pragma once
#include <string>


class Employer;
class Position;

class Person
{
public:
	
	Person(std::string name);		
	~Person();
private:
	std::string m_name;
	bool m_employed;
	Position m_position;
	Employer m_employer;
};

Person.cpp

#include "Person.h"
#include "Position.h"
#include "Employer.h"

Person::Person(std::string name)
	:m_name(name), m_position("none", "none"), m_employer("none", "none")
{}

Person::~Person()
{
}

Position.h

#pragma once
#include <string>


class Position
{
public:
	Position(std::string name, std::string description);
	~Position();
	std::string toString();

private:
	std::string m_name;
	std::string m_description;

};

Position.cpp

#include "Position.h"


Position::Position(std::string name, std::string description) 
	:m_name(name), m_description(description)
{}

Position::~Position()
{
}

std::string Position::toString()
{
	std::string x;
	return x;
}

Employer.h

#pragma once
#include <string>



class Person;
class Position;

class Employer
{
public:
	
	Employer(std::string name, std::string market);
	~Employer();

	bool hire(Person & newHire, Position pos);
	std::string toString();

private:
	std::string m_name;
	std::string m_market;
};

Employer.cpp

#include "Employer.h"
#include "Position.h"



Employer::Employer(std::string name, std::string market)
	:m_name(name), m_market(market)
{
}

Employer::~Employer()
{
}

bool Employer::hire(Person & newHire, Position pos)
{
	return false;
}


std::string Employer::toString()
{
	std::string x;


	return x;
}

Błędy:

Error	C2440	'initializing': cannot convert from 'initializer list' to 'int'	Project1	person.cpp	7	
Error	C2079	'Person::m_position' uses undefined class 'Position'	Project1	person.h	17	
Error	C2079	'Person::m_employer' uses undefined class 'Employer'	Project1	person.h	18	
Error	C2439	'Person::m_position': member could not be initialized	Project1	person.cpp	7	
Error	C2439	'Person::m_employer': member could not be initialized	Project1	person.cpp	7	
4

Ach bo ty tam masz pola które są obiektami a nie wskaźnikami. Tak nie możesz zrobić. Jeśli polem klasy jest obiekt to definicja klasy tego obiektu musi być w tym miejscu znana (musisz mieć include nagłówka tej klasy). Deklaracja zapowiadająca wystarczy dla sygnatur metod i dla wskaźników, bo w takiej sytuacji informacja że cośtam jest typem jest wystarczająca.

0

Chyba działa, dzięki wielkie!

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