我对编程特别是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;
}
答案 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