Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,355
Записей в блоге: 2
Завершенные тесты: 1
#1

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

05.09.2010, 16:17. Просмотров 2897. Ответов 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;
    }
так компилируется, но при выполнении пишет "Ошибка сегментирования"
Подскажите, как это правильно реализовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2010, 16:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование, переопределение функций (из книги "Философия C++") (C++):

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Наследование: "БГТУ", "Факультет", "Группа", "Подгруппа" - C++
Определить иерархию классов (в соответствии с вариантом – выделить базовый и производные). Реализовать классы (самостоятельно задать...

Перегрузка функций "ввести в поток", "вывести с потока", "умножить вектор на число" - C++
Подскажите пожалуйста, как убрать ошибки с этой программы? (делала перегрузку &quot;ввести в поток&quot; и &quot;вывести с потока&quot;, а также &quot;умножить...

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

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

5
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
05.09.2010, 16:24 #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;
        }
Полагаю как-то так. Могу быть не прав в корне.
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.09.2010, 16:28 #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;
}
2
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,355
Записей в блоге: 2
Завершенные тесты: 1
05.09.2010, 18:47  [ТС] #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*>::" где , по моему мнению, это можно сделать, но толком ни чего не вышло. Мозг закипает
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
05.09.2010, 19:00 #5
Надо обратиться к методу предка (в данном случае - к оператору индексации), обычным способом:
C++
1
2
3
4
string* operator [] (size_t index)
{
    return static_cast<string*>(this->vector<void*>::operator [] (index));
}
1
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,355
Записей в блоге: 2
Завершенные тесты: 1
05.09.2010, 19:07  [ТС] #6
Nick Alte, спасибо, работает) Я что-то похожее даже сам пробовал.
0
05.09.2010, 19:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2010, 19:07
Привет! Вот еще темы с ответами:

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

Книги по С++ (что читать после книги Дейтела "Как программировать на С++") - C++
Добрый день господа!!! Я от можно сказать дочитываю Дейтела &quot;Как программировать на С++&quot; 5 издание, и от думаю какую следующую книгу...

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

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...


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

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

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