2015-12-07 3 views
1

Я пытаюсь написать код для моего класса C++. Я использую eclipse. Я с трудом пытаюсь понять некоторые из инструкций в этой проблеме.Массив указателей в C++

Я создал базовый класс под названием «Корабль», а затем использовал наследование для моего класса CruiseShip и класса CargoShip.

Для класса Cruiseship, я поручил создать

Функция печати, переопределяет функцию печати в базовом классе. Функция печати CruiseShip должна отображать только имя судна и максимальное количество пассажиров .

И аналогично для грузового класса

Функция печати, переопределяет функцию печати в базовом классе. Функция печати CargoShip должна отображать только название судна и грузоподъемность судна.

Я не уверен, что означает «переопределить» функцию печати в базовом классе.

Он также инструктирует меня

Продемонстрировать классов в программе, которая имеет массив указателей кораблей. Элементы массива должны быть инициализированы адресами динамически распределенных объектов Ship, CruiseShip и CargoShip. Затем программа должна пройти через массив, вызывая функцию печати каждого объекта.

#include <iostream> 
#include <string> 
using namespace std; 

class Ship 
{ 
protected: 
    string ship_name; 
    int year_built; 
public: 
    Ship() 
    { 
     ship_name=""; 
     year_built=0; 
    } 
    void set_ship_name(string str) 
    { 
     ship_name=str; 
    } 
    void set_year(int y) 
    { 
     year_built=y; 
    } 
    int get_year() 
    { 
      return year_built; 
    } 
    string get_ship_name() 
    { 
      return ship_name; 
    } 

    void print(string, int) 
    { 
      cout<<"Ship name is "<<ship_name<<" and it was built in the year "<<year_built<<endl; 
    } 
}; 

class CruiseShip: public Ship 
{ 
private: 
    int max_passengers; 
public: 
    CruiseShip()// :Ship(str,year) 
    { 
    max_passengers=0; 
    } 
    void set_passengers(int pass) 
    { 
      max_passengers=pass; 
    } 
    int get_passengers() 
    { 
      return max_passengers; 
    } 
    void print1(string, int) 
    { 
      cout<<"Ship name is "<<get_ship_name()<<" and max number of passengers are "<<max_passengers<<endl; 
    } 

}; 

class CargoShip: public Ship 
{ 
private: 
    int cargo_capacity_in_tons; 
public: 
    CargoShip()//:Ship (str,year) 
    { 
     cargo_capacity_in_tons=0; 
    } 
    void set_capacity(int pass) 
    { 
     cargo_capacity_in_tons=pass; 
    } 
    int get_capacity() 
    { 
      return cargo_capacity_in_tons; 
    } 
    void print2(string, int) 
    { 
      cout<<"Ship name is "<<get_ship_name()<<" and its capacity is "<<cargo_capacity_in_tons<<" Tons."<<endl; 
    } 
}; 

int main(){ 
CruiseShip ship1; 
CargoShip ship2; 

string ship_name1; 
string ship_name2; 
int year_built1; 
int year_built2; 
int max_passengers; 
int cargo_capacity_in_tons; 

cout<<"What is the name of the cruise ship?"<<endl; 
cin>>ship_name1; 
ship1.set_ship_name(ship_name1); 

cout<<"What year was "<<ship_name1<<" built in?"<<endl; 
cin>>year_built1; 
ship1.set_year(year_built1); 


cout<<"What is the maximum capacity of "<<ship_name1<<"?"<<endl; 
cin>>max_passengers; 
ship1.set_passengers(max_passengers); 

//ship1.print(ship_name1, year_built1); 
ship1.print1(ship_name1, max_passengers); 

cout<<"What is the name of the cargo ship?"<<endl; 
cin>>ship_name2; 
ship2.set_ship_name(ship_name2); 

cout<<"What year was "<<ship_name2<<" built in?"<<endl; 
cin>>year_built2; 
ship2.set_year(year_built2); 

cout<<"What is the maximum capacity of "<<ship_name2<<" in tons?"<<endl; 
cin>>cargo_capacity_in_tons; 
ship2.set_capacity(cargo_capacity_in_tons); 

ship2.print2(ship_name2, cargo_capacity_in_tons); 


return 0; 
} 
+2

«Я использую eclipse как мой компилятор». Eclipse - это IDE, а не компилятор. – MrEricSir

+3

Что означало @MrEricSir, так это то, что вы должны google «виртуальные функции C++», а также «полиморфизм указателей базового класса C++». Большинство людей не помогут вам здесь b/c, вы не приложили усилий для исследования проблемы. – TriHard8

+0

Я этого не знал. Я отредактирую свой вопрос ... @MrEricSir – redcardinal

ответ

3

Давайте у вас есть следующие классы:

class Animal 
{ 
private: 
    int x; 
    int y; 
public: 
    virtual string sound() {return "Animal";} 
    void move() {x += 1; y+=1;} 
}; 

class Cow 
{ 
    string sound() {return "Muh"} //this is overriding 
    string sound(string soundYouWant) {return soundYouWant;} //this is not overriding as string sound(string soundYouWant) is not the same as string sound() 
    void move() {x += 1; y+=1;} //this is also not overriding as move() in Animal has no virtual 
}; 

Итак, подведем итог, наиважнейшая означает, у вас есть виртуальный метод в базовом классе, и вы вновь объявить его в производный класс. Таким образом, вы можете переопределить его для каждого производного класса (тело метода может быть различным для базового класса и каждого из его производных классов).

Теперь динамических распределенных массивов:

int size; 
std::cin >> size; 
int *array = new int[size]; //the array is stored on the heap 
delete[] array; //deallocates the array and so frees the memory 

Если вы создаете массив в стеке (без новых), вы должны либо жёстко его размер с помощью литералов (0, 1, 2, ...) или с использованием const int variableName. Таким образом, компилятор знает размер массива во время компиляции. Таким образом, вы должны знать размер массива при написании своей программы. Следовательно, компилятор не разрешил бы вам это делать: std::cin >> size;.

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

int *array: очевидно, что содержимое памяти интерпретируется как целые числа. *array указывает на первый элемент массива. int *array НЕ знает РАЗМЕР массива. Вы должны сами следить за этим.

new int[size]: Вы оставляете место для размера * целых чисел в куче.

Возможно, вы знаете, что C++ не имеет сборщика мусора. Это когда delete[] array; вступает в игру. Когда вам больше не понадобится array (сюда относятся другие указатели, указывающие на array), вы должны позвонить delete, чтобы освободить память. С небольшими программами с коротким ходом, забывая, что это не проблема, так как ОС (операционная система) освободит память после завершения вашей программы. Тем не менее, вы должны использовать delete, так как не использовать его очень плохо, и это приведет к проблемам с большими программами. Вы должны поместить delete в деструктор класса (~clasname()), если вы используете array в классе.

Смежные вопросы