Chciałbym prosić o pomoc. Przy kompilacji wywala błędy.
Projekt w załączniku
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
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
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;
};
A tak btw: złą praktyką jest using namespace xxx
w plikach nagłówkowych.
Hm, a dlaczego potrzebne jest "class Employer;" a "class Position;" już nie?
Ja to bym wytłumaczył gdzie problem leży ale mi się nie chce.
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
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.
Chyba działa, dzięki wielkie!