sat2707 / aicups

Официальный репозиторий документации aicups.ru
Apache License 2.0
37 stars 29 forks source link

C++ ошибка компиляции при попытке вынести код в отдельный cpp файл #24

Open ud1 opened 7 years ago

ud1 commented 7 years ago

Создал простой strategy.cpp файл

include "strategy.h"

void Strategy::on_tick(std::vector& myElevators, std::vector& myPassengers, std::vector& enemyElevators, std::vector& enemyPassengers) {

}

В pro файле: SOURCES += main.cpp core/strategy.cpp получаю ошибку компиляции:

https://pastebin.com/tTvEg0zW

lockie commented 7 years ago

Тут соль в том, что Debug определён в api.h, но сам api.h подключает strategy.h - циклическая зависимость, типа. Я чинил примерно так (файл strategy.h, с cpp не заморачивался):

#pragma once 
#include <vector>

class Elevator;
class Passenger;
class Debug;

#include "base_strategy.h"

class Strategy : public BaseStrategy
{
public:
    inline void on_tick(std::vector<Elevator>&, std::vector<Passenger>&,
                 std::vector<Elevator>&, std::vector<Passenger>&);
};

#include "api.h"

template <typename T> void BaseStrategy::debug(T smth)
{
    debugPtr->log(smth);
}

void Strategy::on_tick(std::vector<Elevator>&, std::vector<Passenger>&,
                       std::vector<Elevator>&, std::vector<Passenger>&)
{
  // код стратегии
}

и в base_strategy.h стирал тело у BaseStrategy::debug. Правда, против #11 это всё не помогло, но хотя бы локально компилилось.

678098 commented 7 years ago

Было бы неплохо разбить api.h на описание объектов типа пассажира/лифта, которые непосредственно требуются для стратегий, и на всё остальное (API_Elevators вынести вместе с инклудом strategy.h).

У меня по этой же причине не получается делать пары .h/.cpp, которые инклудят api.h.

Оставил пулл-реквест #62

lockie commented 7 years ago

@678098 Есть ощущение, что в пулл-реквесте забыто добавление нового хедера в переменную HEADERS в pro-файле (чтобы moc по нему тоже проходился).

А вообще язамёрж 😄