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.

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