C ++中的错误消息:函数/变量“未在此范围内声明”,变量“为私有”

时间:2019-09-04 15:28:14

标签: c++ codeblocks

我对编程特别是C ++还是陌生的,我正在尝试为汽车经销商设置Code :: Blocks程序。应该可以买卖汽车并打印出有关汽车的信息。不同的车辆都分为不同的类别。在主要功能中,我实现了带有选择菜单的界面,用于进行诸如卖车之类的可能操作。

尽管我已经在头文件(watercraftType.h,watercraft.h,amphibian.h)中声明了函数/变量,但我不断收到不理解的错误消息(例如“未在此范围内声明”)。 ,motorbike.h,car.h,vehicle.h,vehicleDealer.h),并将它们包含在相应的源文件和主要功能中(根据需要)。

我收到以下错误消息:

  

watercraft.h中的错误消息:“ double Watercraft:maxdepth”是   私人的; “ WatercraftType :: type”是私有的

     

car.h中的错误消息:“ int Car :: doors”是私人的

我不明白为什么错误消息会在 在watercraft.h中声明变量。在car.h中的错误 消息在类构造函数的声明期间显示。

  amphibian.cpp中的

错误消息:“ catchYear”未在此声明   范围;未在此范围内声明“ AVC”,“ WATERJET”,“ PROPELLER”

我已经包含了标题“ vehicle.h”,其中包括了声明 对于catchYear(),以及文件中的标头“ amphibian.h”, 包括标题“ watercraft.h”。 “ watercraft.h”包括 枚举类的声明为“ watercraftType.h” WatercraftType。

  

main.cpp中的错误消息:在情况2中:“ Motorbike”,“ Motorrad1”为   未在此范围内声明;之前的预期类型说明符   “摩托车”;如果是3,则为:cin >> vType ;:与“ operator >>”不匹配   (操作数类型为“ std :: istream {aka std:basic_istream}”和   “ WatercraftType”)

我不明白为什么收到这些错误消息,因为我 使用与案例1中的Car类完全相同的语法。

//vehicle.h
#ifndef VEHICLE_H_INCLUDED
#define VEHICLE_H_INCLUDED
#include <string>

class Vehicle
{
    public:
        std::string id;
        std::string model;
        virtual ~Vehicle();
        virtual void printVehicle();
        static bool checkID(std::string vId);
        int catchYear();

    private:
        int year;

    protected:
        Vehicle(std::string vId, std::string vModel, int vYear);
};

#endif // VEHICLE_H_INCLUDED



//car.h
#ifndef CAR_H_INCLUDED
#define CAR_H_INCLUDED
#include "vehicle.h"
#include <string>

class Car : public Vehicle
{
        public:
            Car(std::string vId, std::string vModel, int vYear, int vDoors, bool vRightHandDrive);
            void printVehicle();

        private:
            int doors;
            bool rightHandDrive;
};

#endif // CAR_H_INCLUDED



//watercraft.h
#ifndef WATERCRAFT_H_INCLUDED
#define WATERCRAFT_H_INCLUDED
#include "watercraftType.h"

class Watercraft
{
    private:
        double maxdepth;
        WatercraftType type;

    protected:
        Watercraft(double vMaxdepth, WatercraftType vType);
        void printVehicle();
};

#endif // WATERCRAFT_H_INCLUDED



//watercraftType.h
#ifndef WATERCRAFTTYPE_H_INCLUDED
#define WATERCRAFTTYPE_H_INCLUDED

enum class WatercraftType {AVC, WATERJET, PROPELLER};

#endif // WATERCRAFTTYPE_H_INCLUDED



//amphibian.h
#ifndef AMPHIBIAN_H_INCLUDED
#define AMPHIBIAN_H_INCLUDED
#include "car.h"
#include "watercraft.h"

class Amphibian : public Car, public Watercraft
{
    public:
        Amphibian(std::string vId, std::string vModel, int vYear, int vDoors, double vMaxdepth, WatercraftType vType);
        void printVehicle();
};

#endif // AMPHIBIAN_H_INCLUDED



//amphibian.cpp
#include "amphibian.h"
#include "vehicle.h"
#include <iostream>

//Amphibian Konstruktor
Amphibian::Amphibian(std::string vId, std::string vModel, int vYear, int vDoors, double vMaxdepth, WatercraftType vType) :
            Car(vId, vModel, vYear, vDoors, false),
            Watercraft(vMaxdepth, vType)
            {}

//Methode printVehicle
void Amphibian::printVehicle()
{
    std::cout << "Id: " << id << "\n";
    std::cout << "Model: " << model << "\n";
    std::cout << "Year: " << std::to_string(catchYear()) << "\n";
    std::cout << "Doors: " << std::to_string(doors)<< "\n";
    std::cout << "MaxDepth: " << std::to_string(maxdepth) << "\n";
    switch(type)
    {
            case AVC:           std::cout << "Type: " << "AVC" << "\n";                 break;
            case WATERJET:      std::cout << "Type: " << "WATERJET" << "\n";            break;
            case PROPELLER:     std::cout << "Type: " << "PROPELLER" << "\n";           break;
            default:            std::cout << "Type: Unknown WatercraftType" << "\n";
    }
}



//main.cpp
#include "vehicle.h"
#include "car.h"
#include "motorbike.h"
#include "amphibian.h"
#include "vehicleDealer.h"
#include <iostream>
using namespace std;

int main()
{
    while (true)
    {
        VehicleDealer Haendler ("Dealer");
        int auswahl;

        cout << "Willkommen beim Autohändler: " << Haendler.name << ".\n"
                "Was möchten Sie tun?\n"
                "Drücken Sie die entsprechende Zahl auf der Tastatur.\n"
                "1 - Auto hinzufügen.\n"
                "2 - Motorrad hinzufügen.\n"
                "3 - Amphibienfahrzeug hinzufügen.\n"
                "4 - Fahrzeug entfernen.\n"
                "5 - Fahrzeuge anzeigen.\n"
                "Sonstige Einzelzahl: Autohändler verlassen.\n";
        cin >> auswahl;

        switch(auswahl)
        {
            case 1:
                {
                string vId;
                string vModel;
                int vYear;
                int vDoors;
                bool vRightHandDrive;
                cout << "Bitte geben Sie die nötigen Paramter zur Erstellung eines Autos ein.\n"
                "Bitte geben Sie die Fahrzeugnummer (7-stellig) ein.\n";
                cin >> vId;
                if (Vehicle::checkID(vId) == false)
                    {
                        cout << "Die Nummer ist falsch. Bitte geben Sie die Fahrzeugnummer (7-stellig) erneut ein.\n";
                        cin >> vId;
                    }
                cout << "Bitte geben Sie die Modellbezeichnung ein.\n";
                cin >> vModel;
                cout << "Bitte geben Sie die Anzahl der Türen ein.\n";
                cin >> vDoors;
                cout << "Bitte geben Sie das Herstellungsjahr des Autos ein.\n";
                cin >> vYear;
                cout << "Bitte geben Sie an, ob es sich bei dem Auto um einen Rechtslenker handelt.\n";
                cin >> vRightHandDrive;
                Car* Auto1;
                Auto1 = new Car(vId, vModel, vYear, vDoors, vRightHandDrive);
                if (Haendler.buyVehicle((Vehicle*)Auto1) == false)
                    {
                    cout << "Das Auto konnte nicht hinzugefügt werden.\n";
                    }
                break;
                }

            case 2:
                {
                string vId;
                string vModel;
                int vYear;
                cout << "Bitte geben Sie die nötigen Paramter zur Erstellung eines Motorrads ein.\n"
                "Bitte geben Sie die Fahrzeugnummer (7-stellig) ein.\n";
                cin >> vId;
                if (Vehicle::checkID(vId) == false)
                    {
                        cout << "Die Nummer ist falsch. Bitte geben Sie die Fahrzeugnummer (7-stellig) erneut ein.\n";
                        cin >> vId;
                    }
                cout << "Bitte geben Sie die Modellbezeichnung ein.\n";
                cin >> vModel;
                cout << "Bitte geben Sie das Herstellungsjahr des Motorrads ein.\n";
                cin >> vYear;
                Motorbike* Motorrad1;
                Motorrad1 = new Motorbike(vId, vModel, vYear);
                if (Haendler.buyVehicle((Vehicle*)Motorrad1) == false)
                    {
                    cout << "Das Motorrad konnte nicht hinzugefügt werden.\n";
                    }
                break;
                }

            case 3:
                {
                string vId;
                string vModel;
                int vYear;
                int vDoors;
                double vMaxdepth;
                WatercraftType vType;
                cout << "Bitte geben Sie die nötigen Paramter zur Erstellung eines Amphibienfahrzeugs ein.\n"
                "Bitte geben Sie die Fahrzeugnummer (7-stellig) ein.\n";
                cin >> vId;
                if (Vehicle::checkID(vId) == false)
                    {
                        cout << "Die Nummer ist falsch. Bitte geben Sie die Fahrzeugnummer (7-stellig) erneut ein.\n";
                        cin >> vId;
                    }
                cout << "Bitte geben Sie die Modellbezeichnung ein.\n";
                cin >> vModel;
                cout << "Bitte geben Sie das Herstellungsjahr des Amphibienfahrzeugs ein.\n";
                cin >> vYear;
                cout << "Bitte geben Sie die Anzahl der Türen ein.\n";
                cin >> vDoors;
                cout << "Bitte geben Sie die maximale Tiefe als Gleitkommazahl (mit Punkt) an.\n";
                cin >> vMaxdepth;
                cout << "Bitte geben Sie den Antriebstyp an (AVC, WATERJET, PROPELLER).\n";
                cin >> vType;
                Amphibian* Amphibian1;
                Amphibian1 = new Amphibian(vId, vModel, vYear, vDoors, vMaxdepth, vType);
                if (Haendler.buyVehicle((Vehicle*)Amphibian1) == false)
                    {
                    cout << "Das Amphibienfahrzeug konnte nicht hinzugefügt werden.\n";
                    }
                break;
                }

            case 4:
                {
                string vId;
                cout << "Bitte geben Sie die Fahrzeugnummer (7-stellig) des Fahrzeugs ein, das Sie entfernen wollen.\n";
                cin >> vId;
                if (Haendler.sellVehicle(vId) == false)
                    {
                    cout << "Das Fahrzeug konnte nicht entfernt werden.\n";
                    }
                break;
                }

            case 5:
                {
                cout << "Alle vorhandenen Fahrzeuge werden ausgegeben.\n";
                Haendler.printVehicles();
                break;
                }

            default:
                {
                cout << "Sie haben eine sonstige Ziffer gewählt. Das Programm wird beendet.\n";
                return 0;
                }
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您无法访问Watercraft:maxdepth和WatercraftType :: type,因为您已将它们声明为私有。为了在两栖类中使用它们,您需要将它们声明为public或private。

要解决Amphibian :: printVehicle()中的错误,您需要编写

`void Amphibian::printVehicle()
{
    std::cout << "Id: " << id << "\n";
    std::cout << "Model: " << model << "\n";
    std::cout << "Year: " << std::to_string(catchYear()) << "\n";
    std::cout << "Doors: " << std::to_string(doors)<< "\n";
    std::cout << "MaxDepth: " << std::to_string(maxdepth) << "\n";
    switch(type)
    {
            case WatercraftType::AVC:           std::cout << "Type: " << "AVC" << "\n";                 break;
            case WatercraftType::WATERJET:      std::cout << "Type: " << "WATERJET" << "\n";            break;
            case WatercraftType::PROPELLER:     std::cout << "Type: " << "PROPELLER"<< "\n";           break;
            default:            std::cout << "Type: Unknown WatercraftType" << "\n";
    }
}`

您可以在此处找到固定版本: https://godbolt.org/z/RF-Kqi