Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2013, 15:56   #1
Cutlet
Новичок
Джуниор
 
Регистрация: 31.05.2013
Сообщений: 9
По умолчанию Вектор указателей на абстрактный базовый класс

[C++] Задание на курсовую работу.
A. Разработайте иерархию родственных типов, корневой класс которой - абстрактный базовый класс, для моделирования и обработки данных предметной области.
B. Создайте обобщенный контейнерный класс (базовый) и от него, используя закрытое наследование, производный класс – шаблон для хранения указателей на абстрактный базовый класс согласно варианта (вариант - статический вектор).
C. Для хранения объектов каждого производного класса используйте структуру данных согласно варианта (вариант - статический вектор).

Смогла реализовать всё, кроме задания B. Базовый класс и от него шаблон написала, но не могу добавить указатели в вектор.

Вот код (естественно, не весь):
Код:
//-------Часть А
//-------АБК:
class Hardware
{public:
        virtual void Print () const = 0;
        Hardware () : Device ("Unknow") {};
        Hardware (AnsiString Device1) : Device (Device1) {};
        virtual ~Hardware () {};
        bool Find_Dev (AnsiString Str);
 protected:
        AnsiString Device;
};

//-------Часть B
//-------Базовый класс 'статический вектор'
class SV
{public:
        SV () {};
        ~SV () {};
        void* operator [] (int ind) {return Data[ind];};
 private:
        void *Data[5];
};
//-------Шаблон 'статический вектор' для хранения указателей на АБК
template <class V>
class SVector : private SV
{public:
        SVector (){};
        ~SVector () {SV :: ~SV ();}
        V& operator [](int index) {SV :: operator [] (index);};
};

//------Часть C
//------Шаблон 'статический вектор' для хранения объектов классов
template <class T>
class Vect
{private:
        T Info [3];
 public:
        Vect () {};
        ~Vect () {};
        void Print ();
        Vect& operator = (const Vect& T);
        T& operator [] (int index);
        void Find_Dev (AnsiString Str);
        void Find_Cap (int Cap1, int Cap2);
        void Sort (void);
        void Save (AnsiString FileName);
        void Load (AnsiString FileName);

//-------Вектора для хранения объектов
//Processor, Harddisk, Outside, Inside, Diskdrive - производные от АБК классы

Vect <Processor> Vect_Proc;
Vect <Harddisk> Vect_Disk;
Vect <Outside> Vect_Out;
Vect <Inside> Vect_In;
Vect <Diskdrive> Vect_Drive

//------Вектор для хранения указателей на АБК
SVector <Hardware*> ALL;

ALL[0]=&Vect_Proc; //тут вылетает ошибка
//[C++ Error] Unit1.cpp(447): E2034 Cannot convert 'Vect<Processor> *' to 'Hardware *'
Помогите, пожалуйста. Сроки уже поджимают.

Последний раз редактировалось Stilet; 31.05.2013 в 18:15.
Cutlet вне форума Ответить с цитированием
Старый 31.05.2013, 16:37   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Ну так Вы пытаетесь занести в вектор не поштучно указатели на элементы другого вектора (как можно бы...), а сам другой вектор. Компилятор и говорит: "извини, начальник, это ящик для фруктов, апельсин сюда положить могу, а 'мешок апельсинов' нет".
Abstraction вне форума Ответить с цитированием
Старый 31.05.2013, 16:58   #3
Cutlet
Новичок
Джуниор
 
Регистрация: 31.05.2013
Сообщений: 9
По умолчанию

Поштучно тоже пробовала. Тогда в момент выполнения программы вылетает ошибка адреса модуля.
Изображения
Тип файла: jpg Безымянный.jpg (32.7 Кб, 134 просмотров)
Cutlet вне форума Ответить с цитированием
Старый 31.05.2013, 17:02   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Ну, отлаживайте. Из видимого меня настораживает только то, что SVector :: operator [] возвращает неопределённое значение. Компилятор должен был ругнуться.
Abstraction вне форума Ответить с цитированием
Старый 31.05.2013, 17:10   #5
Cutlet
Новичок
Джуниор
 
Регистрация: 31.05.2013
Сообщений: 9
По умолчанию

Если б знала, что и как отлаживать.
С перегрузкой [] в классе SVector, вполне возможно, не всё так, как должно быть. Если у Вас есть какой-либо вариант реализации, буду рада.
Cutlet вне форума Ответить с цитированием
Старый 31.05.2013, 17:19   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Если б знала, что и как отлаживать.
Раскидываете по программе отладочный вывод - "вызван метод такой-то", "вызван метод сякой-то". Запускаете, ждёте пока упадёт, смотрите. В районе предполагаемого места падения добавляете ещё сообщений, уточняете ("метод такой-то вызван с такими-то аргументами").
Цитата:
С перегрузкой [] в классе SVector, вполне возможно, не всё так, как должно быть.
Компилятор предупреждение выдал? Если Вы этого ещё не сделали, выкрутите сообщения об ошибках на максимум (обычно это называется "уровень предупреждений Wall").
Ну, или просто посмотрите глазами на эту строку:
Код:
V& operator [](int index) {SV :: operator [] (index);};
Ничего не смущает?
Abstraction вне форума Ответить с цитированием
Старый 31.05.2013, 17:34   #7
Cutlet
Новичок
Джуниор
 
Регистрация: 31.05.2013
Сообщений: 9
По умолчанию

Компилятор нигде не ругается, за исключением того, что уже писала.
Если б я была достаточно сильна в Си, то смущало бы. А так, я лишь вижу, что внутри этой функции
Цитата:
V& operator [](int index) {SV :: operator [] (index);};
у меня вызывается функция из базового класса SV.

Сколько бы Вы меня носом не тыкали, проще будет помочь непосредственно с реализацией части В задания.
Cutlet вне форума Ответить с цитированием
Старый 31.05.2013, 17:44   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Если б я была достаточно сильна в Си, то смущало бы. А так, я лишь вижу, что внутри этой функции
Код:
V& operator [](int index) {SV :: operator [] (index);};
у меня вызывается функция из базового класса SV.
А как тогда Вы её написали? Что, по-Вашему, она должна делать?
Abstraction вне форума Ответить с цитированием
Старый 31.05.2013, 17:53   #9
Cutlet
Новичок
Джуниор
 
Регистрация: 31.05.2013
Сообщений: 9
По умолчанию

Приходила к преподу показать курсовик. Эту часть стали рассматривать чуть более подробно, т.к. она нужна для полиморфной обработки данных. Ну, и то, что тут написано, диктовал он. По его словам: берём ссылку на V и передаем в функцию базового класса, где используя void* компилятор должен, по идее, сам провести необходимое преобразование. Только что во что будет преобразовываться я уже не вкурила.
Cutlet вне форума Ответить с цитированием
Старый 31.05.2013, 18:01   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Ну, и то, что тут написано, диктовал он. По его словам: берём ссылку на V и передаем в функцию базового класса, где используя void* компилятор должен, по идее, сам провести необходимое преобразование.
Тогда резонно сообщить преподавателю, что в его диктовке косяк и оно ни разу не работает.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследования. К указанной ниже программы добавить базовый абстрактный класс. Кулибаба Петро C++ Builder 0 17.01.2013 22:26
Сортировка массива указателей на абстрактный базовый класс Frants Общие вопросы C/C++ 11 29.11.2012 19:44
Создать абстрактный базовый класс C++ MicRaiS Общие вопросы C/C++ 3 11.06.2012 13:14
Абстрактный базовый класс(задача) friman134 Общие вопросы C/C++ 2 17.12.2011 21:51