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

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

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

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

05.09.2010, 16:17. Просмотров 2819. Ответов 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++")
Посмотрите здесь:

Двусвязный список - Error C2011: ElementsList: переопределение типа "struct" C++
Вопрос про "Наследование" и "Объединение" C++
C++ Упражнение из "Философия С++" Б. Эккель т. 1. Не понимаю что имеется ввиду.
visual studio 2012 - ошибка "переопределение типа" C++
C++ Книги по С++ (что читать после книги Дейтела "Как программировать на С++")
Наследование классов "Заявка", "Техническое задание", "Техническое предписание" C++
Глобальное переопределение "operator <<" для char * C++
C++ Переопределение операторов, создание класса "Матрица"
C++ Реализация класса "Студент" и наследование от него класса "Аспирант"
Перегрузка функций "ввести в поток", "вывести с потока", "умножить вектор на число" C++
C++ C2011 переопределение типа "enum" RFMapTool c:\dxsdk\include\d3d8types.h
Переопределение оператора "меньше" пользовательского типа для работы с set C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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++
2298 / 1668 / 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
Форумчанин
Эксперт С++
4263 / 2795 / 219
Регистрация: 12.12.2009
Сообщений: 7,122
Записей в блоге: 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
Эксперт С++
1603 / 995 / 118
Регистрация: 27.09.2009
Сообщений: 1,918
Завершенные тесты: 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
Форумчанин
Эксперт С++
4263 / 2795 / 219
Регистрация: 12.12.2009
Сообщений: 7,122
Записей в блоге: 1
Завершенные тесты: 1
05.09.2010, 19:07  [ТС]     Наследование, переопределение функций (из книги "Философия C++") #6
Nick Alte, спасибо, работает) Я что-то похожее даже сам пробовал.
Yandex
Объявления
05.09.2010, 19:07     Наследование, переопределение функций (из книги "Философия C++")
Ответ Создать тему
Опции темы

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