C ++ включает в себя, пространство имен классов и создание экземпляров классов - PullRequest
0 голосов
/ 08 октября 2018

Я писал код, чтобы попытаться смоделировать какую-то службу такси, но я столкнулся с небольшой проблемой.

У меня есть класс RunServer ,который просматривает состояние команд, данных пользователем ( src :: control :: Global :: stat_commandPath ) и запрашивает дополнительный ввод на основе этих команд, прежде чем что-то делать с этим вводом.

Проблема в том, что я получаю «ошибку: ожидаемый спецификатор типа» (GCC-7.3.0, C ++ 11), и похоже, что это как-то связано с тем, как я распределяю пространства между классами.Если пространство имен объявлений удаляется из src / Vehicle / Car.h , эта проблема прекращается.

Это должен быть весь соответствующий код для этой проблемы.Извините, что так много, я обрезал все, что не похоже, что это оказывает влияние.Проблема заключается в src / control / RunServer.h , строки 66, 70 и 74. src / vehicle / Pickup.h и src / vehicle / Van.h имеют ту же структуру, что и src / vehicle / Car.h .

src / control / Global.h

#ifndef INCLUDED_src_control_Global_h
#define INCLUDED_src_control_Global_h

#include <string>

#include "../vehicle/Vehicle.h"


namespace src {
namespace control {


    class Global final
    {
        virtual void instantiable() = 0;

        private:

            static size_t
                stat_vehicleArrayLength;

            static src::Vehicle
            ** stat_vehicleArray;

        public:

            static std::string
                stat_commandPath,
                stat_stdcoutEnd;

        public:

            static bool
                // Deletes the pointer argument if adding fails.
                add_vehicle(
                    src::Vehicle *
                ),
                exists_vehicle(
                    std::string
                ),
                remove_vehicle(
                    std::string
                );

            static size_t
                get_vehicleAmount(),
                position_vehicle(
                    std::string
                );

            static src::Vehicle
            ** get_vehicles();
    };


}}


#endif

src / control / RunServer.cpp

#include <iostream>
#include <stdlib.h>  // exit()
#include <string>
#include <regex>

#include "../../lib/StringTools.h"
#include "../vehicle/Car.h"
#include "../vehicle/Pickup.h"
#include "../vehicle/Van.h"
#include "../vehicle/VehicleType.h"
#include "../person/Driver.h"
#include "../person/Passenger.h"
#include "Global.h"
#include "RunServer.h"


inline bool
src::control::RunServer::navigation(
    std::string input)
{
    if (input == "return")
    {
        src::control::Global::stat_commandPath.pop_back();
        return true;
    }
    if (input == "exit")
    {
        exit(0);
        return true;
    }
    return false;
}

void
src::control::RunServer::run()
{
    std::string input;

    // "0"   ~ Create...
    // "00"  ~ Create > Vehicle...
    // "000" ~ Create > Vehicle > Car
    // "001" ~ Create > Vehicle > Pickup
    // "002" ~ Create > Vehicle > Van
    // "01"  ~ Create > Person...
    // "010" ~ Create > Person > Driver
    // "011" ~ Create > Person > Passenger
    // "1"   ~ Destroy...
    // "10"  ~ Destroy > Vehicle
    // "11"  ~ Destroy > Passenger
    // "2"   ~ Print

    if (src::control::Global::stat_commandPath == "000" || src::control::Global::stat_commandPath == "001" || src::control::Global::stat_commandPath == "002")
    {
        // Create > Vehicle > (Car|Pickup|Van).
        std::cout << "\n";
        std::cout << "<vehicle identification (char array)>" << src::control::Global::stat_stdcoutEnd;
        getline(std::cin, input);

        if (src::control::RunServer::navigation(input))
        {
            return;
        }

        if (std::regex_match(input, std::regex("\\w+")))
        {
            if (src::control::Global::stat_commandPath.back() == '0' && !src::control::Global::add_vehicle(new src::vehicle::Car(input)))
            {
                std::cout << "\nA vehicle with this identifier already exists!\n";
            }
            else if (src::control::Global::stat_commandPath.back() == '1' && !src::control::Global::add_vehicle(new src::vehicle::Pickup(input)))
            {
                std::cout << "\nA vehicle with this identifier already exists!\n";
            }
            else if (src::control::Global::stat_commandPath.back() == '2' && !src::control::Global::add_vehicle(new src::vehicle::Van(input)))
            {
                std::cout << "\nA vehicle with this identifier already exists!\n";
            }
            else
            {
                std::cout << "\nAn error occured!\n";
            }
        }
    }
}

src / vehicle.h

#ifndef INCLUDED_src_vehicle_Car_h
#define INCLUDED_src_vehicle_Car_h

#include <string>

#include "Vehicle.h"


namespace src {
namespace vehicle {


    class Car final : public src::Vehicle
    {
        void instantiable() override {};

        public:

            Car();
            Car(
                std::string
            );

            int
                canAddPassenger(
                    src::person::Passenger *
                ) override;
    };


}}


#endif

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Проблема связана с делом.Кажется, что поиск пространства имен не чувствителен к регистру, в то время как объявление пространства имен.Изменение пространства имен src::vehicle::Car на src::avehicle::Car устранило проблему.

0 голосов
/ 08 октября 2018

Это совершенно неправильно:

        static bool
            // Deletes the pointer argument if adding fails.
            add_vehicle(
                src::Vehicle *
            ),
            exists_vehicle(
                std::string
            ),
            remove_vehicle(
                std::string
            );

Что вы пытаетесь достичь здесь?Разве это не должны быть 3 независимых прототипа?

        static bool
            // Deletes the pointer argument if adding fails.
            add_vehicle(
                src::Vehicle *
            );
        static bool exists_vehicle(
                std::string
            );
        static bool remove_vehicle(
                std::string
            );
...