![]() |
Порядок объявления классов (нужна помощь)
Вложений: 1
Здравствуйте.
нужен совет и помощь по устранению нижеизложенной проблемы. (работающий код не требуется, просто скажите что сделать, дабы компилятор не выдавал ошибки) Код в файле (если прикрепился). Там только интерфейс. При компиляции порядка 12-ти ошибок (считает, что массив пассажиров на самом деле массив переменных неизвестного типа). При перемещении включённого в Bus класса Passanger кол-во ошибок меняется.(после Автобуса - 9,перед- 12). Прошу объяснить зелёному.-( |
у тебя "круговая" зависимость. В пассажирах определена функция с аргументом типа автобус, а в автобусе определены типа пассажиры.
Завтра в книге полюбопытствую, может и есть в Cях какие хитрые конструкции. Но сомневаюсь, пока мое решение - поправить структуру, убрав "круговую" зависимость |
Цитата:
Пока я вижу только 3 выхода: 1) Снести функцию "платить" у пассажира (не вариант) 2) Снести поле у автобуса (тем более не вариант) 3) метод платить связать с классом транспортное средство, добавляя поле "деньги", которое "грузовику" нафиг не надо. (очень плохой вариант, но из 3-х зол...) З.Ы.Дело в том, что работая над прогой закоментил спорные моменты, думая, что "потом как-нибудь разберусь и исправлю". Когда наступило "потом" выяснилось, что если что-то изменить придётся менять значительную часть.-( Кроме этого ещё статические и динамические диаграммы... В общем, ничего приятного. |
почему поле вместимость у автобуса измеряется в "пассажирах"? Чем измерение в "целых" попугаях не понравилось? (int pass[50] ?)
|
Цитата:
|
Цитата:
Код:
// Объявляем нужные классы А сам код всё-таки стоит переработать |
Ещё несколько ошибок:
class Minivan:public Bus,public Truck Классы Bus и Truck являются производными от класса Vehicle. Таким образом, объект класса Minivan будет содержать два комплекта полей класса Vehicle. Исправляется это использованием "виртуальных классов" (class Bus:virtual public Vehicle и class Truck:virtual public Vehicle). Теперь class Minivan:public Bus,public Truck создаст только один комплект полей для общего класса Vehicle Ну и конечно-же char* GetCompany(void); int SetCompany(char*); Если рассудок и жизнь дороги вам, держитесь подальше от торфяных болот указателей на символьные массивы. Ошибки в процессах выделения памяти и контроля размерности - одни из самых серьёзных и трудновычисляемых проблем. Если в программе нужно использовать строки, используйте объекты строк (string, AnsiString и т.д.) P.S. class Passanger { int pay(Bus&); int pay(Minivan&); }; Во-первых, здесь нагляднее будет использовать указатели вместо ссылок. Во-вторых, поскольку класс Minivan является потомком класса Bus, объявление отдельной функции для него - лишнее и даже нежелательное. |
El Scorpio, спасибо большое за помощь.)
Теперь ошибок, найденных компилятором, две, при чём идентичные по содержанию: класс Bus использует неопределённый класс Passanger; (уже исправлено) И отдельное спасибо за советы. Лишний раз убеждаюсь, что действительно ценные советы и опыт можно получить не столько от университета, сколько от знающих людей. Может потому что первый курс, может из-за изобилия предметов типа матана, дискретной математики и т.п. По поводу указателей - дурацкие требования к программе. Или используй указатель на символьный массив, или используй объекты строк, но только написанные собой.) Цитата:
|
Цитата:
|
Цитата:
Код:
class MyString |
Цитата:
Ещё несколько вопросов из числа глупых: Допустим у меня массив объектов "Пассажир"(внутри Автобуса). Passanger pass[200]; При этом все 200 создаются сразу же конструктором по умолчанию? Т.е. добавления(в "пустой" автобус)/удаления(по номеру) по одному пассажиру не получится? |
Цитата:
Обойти этот момент можно через "списки инициализации" Код:
// Вариант 1 Конкретно в этом случае каждый раз при создании объекта класса Bus для массива pass[200] будет 200 раз вызван конструктор Passanger (void). Именно по-этому статичные массивы в полях классов используются редко. Лучше использовать класс динамических массивов (vector, DynamicArray), размер которых будет задаваться по мере необходимости. P.S. Никогда не задавай размеры массивов числами - используй константы Код:
const int ArrSize = 20; |
El Scorpio, спасибо. Внял вашим советам, всё отлично.
Ещё один небольшой вопрос: int x,y,z; cin>>x; (1) cin>>y; (2) cin>>z; (3) (1)Пользователь вводит вместо чисел строку\слишком большое число. Как следствие - ввод (2-3) не запрашивается. Насколько я понимаю, эта проблема связана с буфером? Как её обойти помимо проверки введённых значений каждый раз? |
Время: 17:53. |
Время: 17:53.
© OSzone.net 2001-