«Касса» не была объявлена ​​в этой области - PullRequest
1 голос
/ 26 апреля 2020

У меня есть этот кусок кода

#ifndef STATION_H
#define STATION_H

#include <vector>
#include "Dispenser.h"
#include "Cashier.h"

//class Cashier;

class Station
{
private:
    int price;
    int dispenser_count;
    int cashier_count;
    std::vector<Dispenser> dispensers;
    std::vector<Cashier> cashiers;

public:
    Station(int, int, int);
    int GetPrice() const { return price; }

    Dispenser *LookForUnoccupiedDispenser(int &id);
    Dispenser *GetDispenserByID(int id);

    Cashier *LookForUnoccupiedCashier();
};

#endif // STATION_H

Когда я комментирую строку class Cashier, компилятор завершается с ошибкой 'Cashier' was not declared in this scope, даже если был включен Cashier.h. Раскомментирование делает возможным компиляцию, но меня беспокоит, что этого не должно быть.

Cashier.h

#ifndef CASHIER_H
#define CASHIER_H

#include "Station.h"

class Station;

class Cashier
{
private:
    bool busy;
    Station *at_station;

public:
    Cashier(Station *employer);

    bool IsBusy() const { return busy; }
};


#endif // CASHIER_H

Как это возможно? Он четко объявлен в заголовочном файле, и, насколько мне известно, #include делает только вставку содержимого файла в другой.

Спасибо за ответы заранее!

1 Ответ

2 голосов
/ 26 апреля 2020

Ваш station.h включает cachier.h. Это пример зависимости cycli c. Учитывая, что у вас есть только указатель на Station в Cachier, я бы предложил удалить зависимость station.h и объявить ее вперёд.

#include буквально не более чем дословное копирование и вставка этого файла в текущий модуль компиляции. Охранники защищают вас от воздействия бесконечного цикла включения, но из-за охранников один из #include s ничего не делает, то есть NOT засасывает объявление (или определение) соответствующего класса. Это приводит к ошибке, которую вы получаете. В station.h компилятор никогда не видел упоминания типа Cachier, когда видит тип Station.

...