Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наследовать vector 
V
    Опции темы
ZufuS
Дата 7.4.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Как наследовать vector? И как установить тип по умолчанию
PM   Вверх
Daevaorn
Дата 7.4.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(ZufuS @  7.4.2007,  14:51 Найти цитируемый пост)
Как наследовать vector?

как любой шаблонный класс
PS: лучше не наследовать вовсе - плохой дизайн
PM MAIL WWW   Вверх
codelord
Дата 7.4.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



Цитата(ZufuS @  7.4.2007,  09:51 Найти цитируемый пост)
Как наследовать vector? И как установить тип по умолчанию 

ты хочешь унаследовать только для того чтобы установить тип по умолчанию?
если да то это совсем не обязательно достаточно использовать так:
Код

#include <vector>
#include <iostream>
typedef std::vector<int>myvector; 

using namespace std;
int main(int argc, char **argv){
myvector lala;     //по умолчанию int :)
lala.push_back(1);
}




--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
ZufuS
Дата 7.4.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



В общем мне нужно создать класс, содержащий динамический массив. А насчёт типа по умолчанию я имел в виду чтобы при создании объекта без явного указания типа, массив объявлялся бы как, например, double.
PM   Вверх
Xenon
Дата 7.4.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Наследуй включением, а не классическим наследованием. Я так понял нужно нечто такое:
Код

template <class T = double>
class super_arr
{
private:
    std::vector<T> arr;
};

Но по-моему проще лучше самому написать тип vector smile


--------------------
user posted image  
PM MAIL   Вверх
ZufuS
Дата 7.4.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Цитата(Xenon @  7.4.2007,  16:28 Найти цитируемый пост)
Наследуй включением, а не классическим наследованием.

То есть при обращении к элементам и методам обработки массива мне придётся кроме объекта и метода писать между ними ещё arr? Это же не только удобство теряется, но и портится вид кода.

Цитата(Xenon @  7.4.2007,  16:28 Найти цитируемый пост)
Но по-моему проще лучше самому написать тип vector 

Проще чем подключить готовый? Сомневаюсь...

Цитата(Daevaorn @  7.4.2007,  14:45 Найти цитируемый пост)
PS: лучше не наследовать вовсе - плохой дизайн

А если меня полностью устраивает класс из стандартной библиотеки шаблонов, но мне нужно добавить 1-2 метода, как тогда быть? непонятно что плохого в дизайне.

Цитата(Daevaorn @  7.4.2007,  14:45 Найти цитируемый пост)
ак любой шаблонный класс

я так и подумал, но у меня что-то не получается  smile 
PM   Вверх
zkv
Дата 7.4.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(ZufuS @  7.4.2007,  19:02 Найти цитируемый пост)
То есть при обращении к элементам и методам обработки массива мне придётся кроме объекта и метода писать между ними ещё arr? Это же не только удобство теряется, но и портится вид кода.

зачем? Это будет противоречить принципу инкапсуляции данныхsmile Надо будет написать необходимый набор интерфейсных методов, а в них уже дотягиваться до объекта-вектора  smile 
PM MAIL   Вверх
ZufuS
Дата 7.4.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Цитата(zkv @  7.4.2007,  19:15 Найти цитируемый пост)
зачем? Это будет противоречить принципу инкапсуляции данных Надо будет написать необходимый набор интерфейсных методов, а в них уже дотягиваться до объекта-вектора   

В смысле чтобы, например, обращаться к элементам массива нужно написать
Код

operator[](int i) { return arr[i]; }

и так далее?
если да, то чем тогда плохо наследование?
PM   Вверх
Mayk
Дата 7.4.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(ZufuS @  7.4.2007,  23:21 Найти цитируемый пост)

если да, то чем тогда плохо наследование? 

Хотя бы синтаксически в функциях-членах оно выглядит не очень адекватно, если захочется использовать [] (а какой толк от вектора, если не использовать [] smile ? ).
Код

struct A : std::vector<double>{
void member(int i){
(*this)[i] = -this->operator[](i);
}

int second()const{
const A& self = *this;
return self[1];
}
};


Цитата(ZufuS @  7.4.2007,  23:02 Найти цитируемый пост)

А если меня полностью устраивает класс из стандартной библиотеки шаблонов, но мне нужно добавить 1-2 метода, как тогда быть? непонятно что плохого в дизайне.

вопрос 1 --- что за методы?
наблюдение  2 --- функции-не члены никто не отменял. то есть
Код

template<class Container>
int myFunc(const Container& cont){
    return cont.size()^MAGIC_NUMBER;
}


(таким образом можно добиться работы этих функци не только для вектора, но и от чего-то более-менее эквивалентного, например deque'а)

Это сообщение отредактировал(а) Mayk - 7.4.2007, 19:50


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
ZufuS
Дата 7.4.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



В общем надо создать класс для полигона, который может иметь произвольное число точек, в нём будут функции, которые будут произвольно устанавливать точки, выводить на экран...0
Я пытаюсь сделать примерно так:
Код

#include <vector>
class Polygon: public vector<>
{
        void random();
        void draw();
};


это что такое?
Код

struct A : std::vector<double>{
void member(int i){
(*this)[i] = -this->operator[](i);
}

int second()const{
const A& self = *this;
return self[1];
}
};


PM   Вверх
bsa
Дата 7.4.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код
std::vector<int> array;
...
int i = array[10];
//или, что тоже абсолютно самое
int i = array.operator[](10);

PM   Вверх
Mayk
Дата 7.4.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(ZufuS @  8.4.2007,  00:43 Найти цитируемый пост)
В общем надо создать класс для полигона

Цитата(Xenon @  7.4.2007,  20:28 Найти цитируемый пост)
Наследуй включением, а не классическим наследованием

Это придаст ясность кода. 


Цитата(ZufuS @  8.4.2007,  00:43 Найти цитируемый пост)

это что такое?

это очень красивые эквиваленты выражения arr[i]. 

Цитата(ZufuS @  7.4.2007,  23:21 Найти цитируемый пост)

если да, то чем тогда плохо наследование? 


Кстати. Ещё плохие новости по поводу наследования в паре с шаблонами.
Если хочеться сэкономить несколько нажатий на кнопки, то наследования не подходит. Зачастую вместо arr.something придётся писать this->something.

Если ты унаследуешь от std::vector<>, то ты НЕ СМОЖЕШЬ на корректном компиляторе использовать некоторые методы из вектора явным образом.
В частности те, которые не принимают никаких аргументов, например size().
Код

#include <vector>

template<class T=double>
struct Polygon : std::vector<T>{
int halfSize(){
 return size()/2; //compile time error
}
};

int main(){
Polygon<> pol;
return pol.halfSize();
}


Цитата(g++4)

a.cpp: In member function ‘int Polygon<T>::halfSize()’:
a.cpp:6: error: there are no arguments to ‘size’ that depend on a template parameter, so a declaration of ‘size’ must be available
a.cpp:6: error: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)


Цитата(http://www.comeaucomputing.com/tryitout/)

Comeau C/C++ 4.3.9 (Mar 27 2007 17:24:47) for ONLINE_EVALUATION_BETA1
Copyright 1988-2007 Comeau Computing.  All rights reserved.
MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 6: error: identifier "size" is undefined
   return size()/2; //

и придётся использовать this->size() .



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
ZufuS
Дата 7.4.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Ясно, спасибо, также буду очень благодарен тому, кто подскажет из-за чего не компилируется проект. (C++ Builder)
Код

//unit1.cpp
Polygon plgn;

[C++ Error] Unit1.cpp(80): E2379 Statement missing ;
Код

//zUnit.h
class Polygon
{
};

----
изменил имя класса - заработало.

Это сообщение отредактировал(а) ZufuS - 7.4.2007, 22:47

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  lab1.rar 30,05 Kb
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1039 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.