Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
mironouz
0 / 0 / 0
Регистрация: 11.06.2012
Сообщений: 3
1

Ошибки при наследовании класса от вектора

13.01.2013, 02:51. Просмотров 919. Ответов 19
Метки нет (Все метки)

Пишу программу по СМО, столкнулся с трудностью при попытке сделать наследование очередью Cqueue вектора из STL.
Проблема состоит в том, что если наследуешь вектор с любым встроенным типом, например так:

C++
1
class Cqueue: public vector<int>
то никаких проблем нет. Стоит наследовать от вектора с моим классом заявок, то эклипс выдаёт ошибку, что 1 и 2 аргументы шаблона неверны. Сразу возникает вопрос: почему аргументы, если мне нужен только вектор заявок, то есть 1 аргумент.

Также выдаёт ошибку, что `Creq' was not declared in this scope, хотя хедер с интерфейсом заявок подключен.
Прикладываю архив с проектом eclipse. Крайне прошу помочь разобраться.
0
Вложения
Тип файла: rar SMO_LABA.rar (5.1 Кб, 4 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2013, 02:51
Ответы с готовыми решениями:

Ошибки при наследовании класса
Доброго времени суток!Возникли ошибки при компиляции кода Задание было...

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

Деструкторы при наследовании от абстрактного класса
Нужно ли что то писать в деструкторах ~StringObject(){}; ...

Инициализация полей класса при наследовании
Всем добрый вечер. Возникла у меня небольшая задачка, которую никак не могу...

Segmentation fault при наследовании класса
Доброго времени суток! Имею класс Initialise и класс Environment. В первом...

19
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
13.01.2013, 03:11 2
queue.h и req.h включают друг друга. Могу предложить поменять req.h так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef REQ_H_
#define REQ_H_
//#include "queue.h"
 
class Cqueue;
 
class Creq{
public:
    Creq();
    int get_operation();
    void go_to_queue(Cqueue**, Creq&);
    void delete_req();
private:
    int _operation;
    bool _in_use;
};
 
 
#endif /* REQ_H_ */
И да, лучше выкладывать на форум сам код, а не архивы с проектами и пр.
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
13.01.2013, 03:21 3
mironouz, не нужно наследовать от стандартных контейнеров, они не имеют виртуального деструктора.
0
mironouz
0 / 0 / 0
Регистрация: 11.06.2012
Сообщений: 3
13.01.2013, 03:35  [ТС] 4
А что можно сделать, если нужен функционал вектора + добавить пару своих функций?
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
13.01.2013, 03:41 5
Или сделайте отдельно эти функции, которые будут принимать в качестве параметра данный вектор, или же сделайте вектор объектом класса.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
13.01.2013, 03:45 6
mironouz, заменить наследование на композицию, т.е. сделать вектор членом класса и писать n нужных методов самому (ведь наверняка не все методы вектора нужны):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Cqueue {
 
public:
   typedef std::vector<Creq>::value_type value_type;
   typedef std::vector<Creq>::size_type  size_type;
   
   // ...
 
   void push_back(value_type const& value) {
      adaptee.push_back(value);
   }
 
   size_type size() const {
      return adaptee.size();
   }
 
   // В таком духе...   
 
 
private:
   std::vector<Creq> adaptee;
};
Ну или protected\private наследование, что тоже самое, только в профиль, но писать поменьше:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Cqueue : private std::vector<Creq> {
 
public:
   typedef std::vector<Creq>::value_type value_type;
   typedef std::vector<Creq>::size_type  size_type;
   
   // ...
 
   using std::vector<Creq>::push_back;
   using std::vector<Creq>::size;
   
   // В таком духе...   
};
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
13.01.2013, 03:52 7
gray_fox, какая разница protected, private или public наследование? Контейнеры STL не для этого разрабатывались, и в них не предусмотрена возможность наследования. Не нужно наследовать от STL контейнеров.

Добавлено через 3 минуты
mironouz, в Вашем случае подойдет включение вектора в качестве объекта, и делегирование его функций.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
13.01.2013, 03:55 8
Toshkarik, private\protected наследование - это не наследование по сути, привести экземпляр производного класса к базовому просто так не получится.
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
13.01.2013, 03:59 9
gray_fox, по какой такой сути? Это такое же наследование как и public, механизм не отличается. Хотя, дело конечно Ваше, но в будущем проблемы с деструктором обеспечены.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
13.01.2013, 04:04 10
Цитата Сообщение от Toshkarik Посмотреть сообщение
но в будущем проблемы с деструктором обеспечены.
Какие например?
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
13.01.2013, 04:07 11
gray_fox, ну а какие могут быть проблемы с невиртуальным деструктором? Да и сами по себе STL контейнеры не предназначены для этого. В интернете много информации по этому поводу.
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
13.01.2013, 04:11 12
Цитата Сообщение от Toshkarik Посмотреть сообщение
gray_fox, какая разница protected, private или public наследование? Контейнеры STL не для этого разрабатывались, и в них не предусмотрена возможность наследования. Не нужно наследовать от STL контейнеров.
так-то конечно не нужно
но если суб-класс будет неполиморфным, то ничего страшного не произойдет
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
13.01.2013, 04:11 13
Ну а так, конечно, если Вы не будете использовать полиморфизм, то ничего такого страшного не случится, но лучше избегать такого потенциально опасного кода.
0
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
13.01.2013, 04:12 14
Если ТС не собирается использовать класс Cqueue в динамическом полиморфизме и/или деструктор в классе Cqueue вообще не нужен (например, нет памяти, которую надо освободить), то вполне можно наследоваться от стандартных контейнеров.
Единственная проблема - стоит об этом забыть, и начнутся утечки памяти и прочие неприятные последствия
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
13.01.2013, 04:14 15
Toshkarik, если речь идёт об удалении объекта по указателю на базовый класс, то до этого не дойдёт: неполучится привести указатель на производный класс к указателю на базовый.
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
13.01.2013, 04:23 16
Ну явное приведение типов может это сделать, а так, да, по простому не получится.
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
13.01.2013, 04:26 17
Цитата Сообщение от gray_fox Посмотреть сообщение
неполучится привести указатель на производный класс к указателю на базовый.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>
 
#define PRINT std::cout << __FUNCTION__ << std::endl
 
class A {
public:
    A() { PRINT; }
    A(const A& a) { PRINT; }
    ~A() { PRINT; }
};
 
class Vector : private std::vector<A> {
public:
    Vector (size_t count) : std::vector<A>(count) { PRINT; }
    virtual ~Vector () { PRINT; }
};
 
int main () {
    Vector* v = new Vector(10);
    std::vector<A>* a = reinterpret_cast<std::vector<A>* >(v);
    if (!a) 
    { 
        std::cout << "can't cast to a base type!" << std::endl; 
    }
    else
    {
        delete a;
    }
}
кастуется, причем вполне по стандарту
0
Toshkarik
13.01.2013, 04:28
  #18

Не по теме:

alex_x_x, хотел привести точно такой же пример с reinterpret_cast, но стало лень :D

0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
13.01.2013, 04:31 19

Не по теме:

Toshkarik, чето меня накрыло
вот что значит не писать на плюсах полгода
:D


конечно dynamic_cast не проходит (было в мыслях dynamic, а написал reinterpret)
при наличии виртуального деструктора работало бы и так и так
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
13.01.2013, 04:34 20
Ну так то можно конечно много чего наворотить)
0
13.01.2013, 04:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2013, 04:34

Доступ к переменным базового класса при наследовании
Есть следующий код class Base { protected: int x; Base* enemy; ...

Ошибка: undefined reference to при наследовании класса
Здравствуйте форумчане. Пытаюсь наследовать класс MyService от OAuthService и...

Доступ к объекту базового класса при закрытом наследовании
Есть класс Pair из стандартной библиотеки. Он у меня содержит 2 массива...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru