munsine Ответов: 3

Напишите программу на языке C++, которая создает класс транспортного средства и выводит классы автомобилей и велосипедов из класса транспортных средств. Все классы должны иметь соответствующие конструкторы и методы для отображения деталей транспортного средства.


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

Эта программа показывает 2 ошибки почему ?
ошибка:поле "myVehicle" имеет неполный тип транспортного средства [9]
Примечание: определение "класс транспортного средства" не является полным до закрытия скобки
В функции-члене 'void vehicle::valid_mileage (int)'
ошибка: определение функции здесь не допускается до маркера '{'

Что я уже пробовал:

#ifndef VEHICLE_H
#define VEHICLE_H

#include <iostream>
#include <fstream>
#include <iomanip>
#include <functional>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <sstream>
using namespace std;

//Vehicle Class
class Vehicle {
protected:
	Vehicle myVehicle[9];
	string make;  //make
    string model; // model
    string color;  // color
    int	year;  // year
    int mileage;  // miles on car
	string type;  //Type of vehicle

public:
	//Constructor that will set information for a new car
	void New_vehicle (string a, string b, string c, int d, int e) 
	{make = a; model = b; color = c; year = d; mileage = e;}
	
	Vehicle(); //Default constructor
	Vehicle(string, string, string, int, int, string);
	//mutator and accessor functions
	void setMake(string);
    void setModel(string);
    void setColor(string);
    void setYear(int);
    void setMileage(int);
	void setType(string);

    string getMake();
    string getModel();
    string getColor();
    int getYear();
    int getMileage();
	string getType();

	//Check mileage to see if valid
	void valid_mileage(int);

	//virtual function
	virtual void details() {
	}

};
//Sets to default values
Vehicle::Vehicle() {
	make = " ";
    model = " ";
    color = " ";
    year = 0;
    mileage = 0;
	type = " ";
}

Vehicle::Vehicle(string make, string model, string color, int year, int mileage, string type) {
    Vehicle::make =  make;
    Vehicle::model = model;
    Vehicle::color = color;
    Vehicle::year = year;
    valid_mileage(mileage);
	Vehicle::type = type;
}

void Vehicle::setMake(string make) {
    Vehicle::make = make;
}

void Vehicle::setModel(string model) {
    Vehicle::model = model;
}

void Vehicle::setColor(string color) {
    Vehicle::color = color;
}

void Vehicle::setYear(int year) {
    Vehicle::year = year;
}

void Vehicle::setMileage(int mileage) {
    valid_mileage(mileage);
}

void Vehicle::setType(string type) {
	Vehicle::type = type;
}


string Vehicle::getMake() {
    return make;
}
string Vehicle::getModel() {
    return model;
}
string Vehicle::getColor() {
    return color;
}
int Vehicle::getYear() {
    return year;
}
int Vehicle::getMileage() {
    return mileage;
}

string Vehicle::getType() {
	return type;
}


void Vehicle::valid_mileage(int mileage) {
    if (mileage>=0)
        Vehicle::mileage=mileage;
    else {
        Vehicle::mileage=0;
        cout << "WARNING! You have entered invalid mileage!\n";
    }

	    Vehicle& getVehicle(int n) {
        return myVehicle[n];
    }
};

#endif 

3 Ответов

Рейтинг:
1

OriginalGriff

У вас есть ложные и отсутствующие закрывающие фигурные скобки.
Есть еще один после определения details, пропавший без вести в конце valid_mileage и так далее.

Это одна из причин, по которой я ненавижу систему 1 ТБ - она значительно затрудняет сопоставление скобок, когда они находятся в неправильном месте, так как автоматический отступ не работает...


Рейтинг:
1

CPallini

Цитата:
Является ли это правильной программой решения вопроса
Нет, это не решение проблемы: вы предоставляете только то, что вам нужно. Vehicle класс, вы должны обеспечить также и то, и другое. Car и Bike класс.

Кроме того, какова цель массива Vehicleв Vehicle класс? Какова цель этого проекта? type член данных?

Постарайтесь свести количество деталей к минимуму и обеспечить необходимую иерархию классов.


Рейтинг:
0

Jochen Arndt

Первая ошибка находится здесь:

class Vehicle {
protected:
    Vehicle myVehicle[9];
// ...
};
Вы не можете использовать экземпляр класса как член его собственного класса.
error:field 'myVehicle' has incomplete type vehicle [9]
note: definition of 'class vehicle' is not complete until closing brace
В этот момент класс не определен, поэтому компилятор не знает, как с ним обращаться.

Вторая ошибка является источником блока кода
Vehicle& getVehicle(int n) {
    return myVehicle[n];
}
В вашем valid_mileage() функция. Похоже, что он был скопирован и вставлен не в то место.

Заметьте также, что :: является оператором разрешения области видимости для пространств имен и доступа к статическим членам класса. Чтобы получить доступ к нестатическим членам класса, когда имя члена также используется в качестве параметра, используйте этот указатель ... cppreference.com[^]:
void Vehicle::setMake(string make) {
    this->make = make;
}


munsine

Пожалуйста, исправьте и опубликуйте код.

Jochen Arndt

Первая ошибка не может быть исправлена. Это проблема проектирования и требует другой реализации. Или просто удалите этот член. Он не имеет цели и также не требуется для выполнения задания.

Второе: просто уберите этот блок.

Доступ участника: заменить "Vehicle::" на "this->"

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

См.также Решение 2 о том, что делать (вывод классов).

Я не буду писать код для вас. И другие здесь тоже не будут. Мы поможем с конкретными проблемами, такими как ваши сообщения об ошибках. Но мы не будем делать домашнее задание для других или писать код по требованию.

munsine

хорошо, пожалуйста, скажите, с какой строки мне нужно удалить коды и что нужно заменить.

Jochen Arndt

Вы читали мой предыдущий комментарий?

Какова цель члена myVehicle[9]?
Если его нет, удалите его.

Второе: просто уберите этот блок.
Какова цель этого блока в этой позиции?
Похоже, что он был вставлен в неправильном положении.

Вышесказанное относится к коду, написанному вами. Я только объяснил, что не так, что приводит к выброшенному сообщению об ошибке. Но только вы будете знать, почему и с какой целью вы это сделали. Поэтому, если я скажу вам что-то вроде "замените это на то в строке #x", это вам действительно не поможет.

Доступ участника: заменить "Vehicle::" на "this->"
около все встречаемости.