Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
#1

Наследование, переопределение функций (из книги "Философия C++") - C++

05.09.2010, 16:17. Просмотров 2847. Ответов 5
Метки нет (Все метки)

Читаю книгу Эккеля "Философия C++", есть там такое задание:
Создайте класс StringVector, производный от vector<void*>. Переопределите функции push_back() и operator[] так, чтобы они принимали и возвращали string*. Что произойдет при попытке вызова push_back() для void*?
Сначала решил переопределить push_back(), сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include<vector>
using namespace std;
class StringVector:vector<void*>{
public:
    void push_back(string* S){
        vector::push_back(S);
    }
};
 
 int main(){
StringVector ob;
string s="HELLO!!!";
ob.push_back(&s);
return 0;
}
g++ выводит:
a.cpp: In member function ‘void StringVector:ush_back(std::string*)’:
a.cpp:7: error: ‘template<class _Tp, class _Alloc> class std::vector’ used without template parameters
Потом сделал так:
C++
1
2
3
4
5
void push_back(string* S){
    static int i=0;
    (*this)[i]=S;
    ++i;
    }
так компилируется, но при выполнении пишет "Ошибка сегментирования"
Подскажите, как это правильно реализовать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2010, 16:17     Наследование, переопределение функций (из книги "Философия C++")
Посмотрите здесь:

Упражнение из "Философия С++" Б. Эккель т. 1. Не понимаю что имеется ввиду. - C++
#define FIELD(a) char* a##_string; int a##_size; Измените макрос FIELD(), так чтобы в нем присутствовал числовой аргумент index....

Наследование классов "Заявка", "Техническое задание", "Техническое предписание" - C++
Создать базовый класс ТЕХНИЧЕСКОЕ ЗАДАНИЕ со свойствами: номер, описание и методами: вывести всю информацию об объекте, добавить описание....

Вопрос про "Наследование" и "Объединение" - C++
Доброго времени суток. Изучаю ООП, пока что не удачно. Появилось пару вопросиков. первый вид Animals // Млекопитающие class...

Реализация класса "Студент" и наследование от него класса "Аспирант" - C++
Помогите, пожалуйста! Создать абстрактный базовый класс Person, описывающий обычного человека. Создайте производный класс Student,...

visual studio 2012 - ошибка "переопределение типа" - C++
имею head.h #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;Windows.h&gt; #pragma comment(lib, &quot;ws2_32&quot;) using namespace...

C2011 переопределение типа "enum" RFMapTool c:\dxsdk\include\d3d8types.h - C++
Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка C2011 _D3DZBUFFERTYPE: переопределение типа...

Двусвязный список - Error C2011: ElementsList: переопределение типа "struct" - C++
Что я сделал не правильно? typedef struct ElementsList { struct ElementsList *Prev; struct ElementsList *Next; ...

Переопределение оператора "меньше" пользовательского типа для работы с set - C++
Понимаю, что чтобы хранить в set элементы некоторого класса, нужно переопределить оператор &lt; для этого класса. Оператор переопределен,...

Ошибка "error C2011: переопределение типа" - C++
struct Tunit { public : int team; int team_agricultural; POINT location; POINT moveLocation; float max_helf; ...

Ошибка: "Переопределение; Другой класс хранения" - C++
При компиляции кода: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;iomanip&gt; using namespace std; const int kol_airp = 7;...

Переопределение операторов, создание класса "Матрица" - C++
Здравствуйте, нужна помощь, уже очень долго не могу понять в чём проблема. Создал класс матрица, не работает простой код. Проблема в...

Глобальное переопределение "operator <<" для char * - C++
Здравствуйте. Привожу пример для демонстрации проблемы. Помогите пожалуйста в ее устранении или нивелировании. std::ostream&amp;...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7967 / 4729 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
05.09.2010, 16:24     Наследование, переопределение функций (из книги "Философия C++") #2
Kastaneda,

C++
1
2
3
4
public:
        void push_back(string* S){
                vector::push_back(S);
        }
Ведь написано, что метод должен возвращать стринг.
C++
1
2
3
4
5
public:
        string push_back(string& S){
                vector<string>::push_back(S);
                return S;
        }
Полагаю как-то так. Могу быть не прав в корне.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.09.2010, 16:28     Наследование, переопределение функций (из книги "Философия C++") #3
Kastaneda,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
 
class StringVector : private std::vector<void*> {
public:
  void push_back(std::string* S) {
     std::vector<void*>::push_back(S);
  }
};
 
int main() {
  StringVector ob;
  std::string s="HELLO!!!";
  ob.push_back(&s);
  return 0;
}
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
05.09.2010, 18:47  [ТС]     Наследование, переопределение функций (из книги "Философия C++") #4
Lavroff, "Ведь написано, что метод должен возвращать стринг"
, это про оператор []
roman@roman-desktop:~/Myprogs$ g++ a.cpp
a.cpp: In member function ‘std::string StringVector:ush_back(std::string&)’:
a.cpp:7: error: cannot call member function ‘void std::vector<_Tp, _Alloc>:ush_back(const _Tp&) [with _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Alloc = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]’ without object
a.cpp: In function ‘int main()’:
a.cpp:15: error: no matching function for call to ‘StringVector:ush_back(std::string*)’
a.cpp:6: note: candidates are: std::string StringVector:ush_back(std::string&)

CyBOSSeR, скомпилировалось, сейчас [] переопределю, проверю на работоспособность.

Добавлено через 12 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
сейчас [] переопределю
Нда, не все так просто))

Добавлено через 2 часа 0 минут
Может кто-нибудь подскажет, как перегрузить оператор [], я сделал так:
C++
1
2
  string* operator [](int i){
    return (*this)[i];}
но, как я понимаю, получается бесконечная рекурсия. Пробовал всеразличные варианты с подстановкой "vector<void*>::" где , по моему мнению, это можно сделать, но толком ни чего не вышло. Мозг закипает
Nick Alte
Эксперт С++
1607 / 999 / 118
Регистрация: 27.09.2009
Сообщений: 1,926
Завершенные тесты: 1
05.09.2010, 19:00     Наследование, переопределение функций (из книги "Философия C++") #5
Надо обратиться к методу предка (в данном случае - к оператору индексации), обычным способом:
C++
1
2
3
4
string* operator [] (size_t index)
{
    return static_cast<string*>(this->vector<void*>::operator [] (index));
}
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
05.09.2010, 19:07  [ТС]     Наследование, переопределение функций (из книги "Философия C++") #6
Nick Alte, спасибо, работает) Я что-то похожее даже сам пробовал.
Yandex
Объявления
05.09.2010, 19:07     Наследование, переопределение функций (из книги "Философия C++")
Ответ Создать тему
Опции темы

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