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

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

Войти
Регистрация
Восстановить пароль
 
__sirroko
4 / 4 / 3
Регистрация: 03.03.2013
Сообщений: 55
#1

Реализация Fifo с разными типами данных - C++

06.04.2014, 00:45. Просмотров 460. Ответов 8
Метки нет (Все метки)

Доброго времени суток!

Задача следующая:
Есть абстрактный класс CData, от него наследуются классы CByte, CWord, CNumber.
Нужно создать класс CFifo (очередь для объектов выше перечисленных классов).
Добавление и удаление объектов в очередь реализовать
через перегрузку операторов << и >> соответственно.

Как перегрузить << и >> для ostream/istream я прекрасно понимаю, а вот как их перегрузить их в данном
случае, никак не могу сообразить.

Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2014, 00:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Реализация Fifo с разными типами данных (C++):

Переписать программу с разными типами данных - C++
Тема: Использование указателей для работы со сложными типами данных Вот я хочу чтобы мне помогли переписать эту программу чтобы она...

Матрица с разными типами данных в ней - C++
Мне нужно создать матрицу, которая содержала бы разные типы данных, содержащиеся, в ней. По сути обыкновенная таблица, только в виде...

Двухмерный массив с разными типами данных - C++
Доброе время суток. Есть задание Задание поменять нет возможности, да и самому доделать хочется. Есть кое какие наработки, и...

Сделать статический массив с разными типами данных - C++
Задача такова, есть ровно 60 магазинов. У каждого магазина по 6 параметров: 1) Адрес типа char 2) Заработок за сутки типа int 3)...

Список с разными типами данных, унаследованным от одного - C++
Доброго времени суток! У меня имеются унаследованные классы от одного , так же имеется vector&lt;общий_тип*&gt; arr. В программе создаются в...

Оценить время выполнения и сложность простейших операций с разными типами данных - C++
Меня интересует-вопрос: можно как-то оценить по-быстрому время, которое программа тратит на различные операции - сравнение, умножение,...

8
monolit
188 / 187 / 22
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
06.04.2014, 01:04 #2
Используй очередь указателей на CData. Т.е. работай с этими CData* (для них перезагружай >>, << и т.п.). И все будет нормально. Естественно, все объекты придется тоже выделять динамически - но это фигня.
0
__sirroko
4 / 4 / 3
Регистрация: 03.03.2013
Сообщений: 55
06.04.2014, 01:05  [ТС] #3
monolit, мне не понятно как задать прототипы для операторов. Как работать я, к счастью, понимаю)

А делать я скорее всего буду через typeid, а не через очередь указателей.
0
zvoronz
272 / 240 / 21
Регистрация: 29.05.2012
Сообщений: 889
06.04.2014, 01:08 #4
CFifo* operator>>(CData* data);
CFifo* operator<<(CData* data);
1
monolit
188 / 187 / 22
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
06.04.2014, 01:22 #5
Вон как zvoronz показал, делай. Почти самое нормально в данном случае (на порядок лучше того, что собрался делать ты, хотя ты этого еще не понял). Если понадобится тип того, что ты там извлек - определишь с помощью dynamic_cast'а...
1
__sirroko
4 / 4 / 3
Регистрация: 03.03.2013
Сообщений: 55
06.04.2014, 21:14  [ТС] #6
Написал небольшой примерчик, но выдает ошибки при компиляции.

Код:

test.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef _TEST_H
#define _TEST_H
 
class CTest
{
  int m_a;
 
public:
  CTest* operator>>(int *a)
  {
    *a = m_a;
    return this;
  }
 
  CTest* operator<<(int *a)
  {
    m_a = *a;
    return this;
  }
};
 
#endif // _TEST_H
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "test.h"
#include <iostream>
using namespace std;
 
int main()
{
  CTest obj;
  obj << 1;
 
  int b;
  obj >> b;
 
  cout << b << endl;
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
main.cpp: In function ‘int main()’:
main.cpp:8:10: error: invalid conversion from ‘int’ to ‘int*[-fpermissive]
   obj << 1;
          ^
In file included from main.cpp:1:0:
test.h:15:10: error:   initializing argument 1 of ‘CTest* CTest::operator<<(int*)[-fpermissive]
   CTest* operator<<(int *a)
          ^
main.cpp:11:10: error: invalid conversion from ‘int’ to ‘int*[-fpermissive]
   obj >> b;
          ^
In file included from main.cpp:1:0:
test.h:9:10: error:   initializing argument 1 of ‘CTest* CTest::operator>>(int*)[-fpermissive]
   CTest* operator>>(int *a)
0
zvoronz
272 / 240 / 21
Регистрация: 29.05.2012
Сообщений: 889
06.04.2014, 21:41 #7
Для простых типов сделайте ввод в стек значению, не по указателю.
Вывод сделайте по ссылке.
Вот так в общем
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
31
32
33
34
#include <iostream>
 
using namespace std;
 
class CTest
{
  int m_a;
 
public:
  CTest* operator>>(int& a)
  {
    a = m_a;
    return this;
  }
 
  CTest* operator<<(int a)
  {
    m_a = a;
    return this;
  }
};
 
int main()
{
   CTest obj;
  obj << 17;
 
  int b;
  obj >> b;
 
  cout << b << endl;
   
   return 0;
}
Добавлено через 16 минут
Вот в этой реализации можно теперь делать цепочки как в cout, cin.
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
31
32
33
34
#include <iostream>
 
using namespace std;
 
class CTest
{
  int m_a;
 
public:
  CTest& operator>>(int& a)
  {
    a = m_a;
    return *this;
  }
 
  CTest& operator<<(int a)
  {
    m_a = a;    
    return *this;
  } 
};
 
int main()
{
   CTest obj;
  obj << 17 << 23 << 11;
 
  int b,c;
  obj >> b >> c;
 
  cout << b+c << endl;
   
   return 0;
}
1
__sirroko
4 / 4 / 3
Регистрация: 03.03.2013
Сообщений: 55
06.04.2014, 21:47  [ТС] #8
zvoronz, теперь вроде бы разобрался)
Спасибо!
0
monolit
188 / 187 / 22
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
06.04.2014, 22:05 #9
Каких простых классов, о чем вы?

Есть абстрактный класс CData, от него наследуются классы CByte, CWord, CNumber.
Нужно создать класс CFifo (очередь для объектов выше перечисленных классов).
В вышеприведенном коде непонятно что (точнее понятно, но с заданием никак не связано).

Вот интерфейс примерный того, что нужно (буду использовать stl, не пугатесь=) и замените тем, что нужно):
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
31
32
33
34
class CFifo {
   list<CData*> mQueue;
public:
  CFifo& operator<<(CData* val)
  {
    mQueue.push_back(val);
    return *this;
  }
 
  CTest& operator>>(CData*& a) // некогда думать, пусть так
  {
//тут всякие проверки на существование элементов, если нужно, учесть и т.п.
    a = mQueue.front();
   mQueue.pop_front();
    return *this;
  }
};
 
int main()
{
   CFifo queue;
   CByte* byte = new CByte();
   CWord* word = new CWord();
   queue << byte << word;
 
   CData* dst1;
   CData* dst2;
  obj >> dst1>> dst2;
 if (dynamic_cast<CByte*>(dst1)) {//такой тип
  //что-то делаем
 }
   
   return 0;
}
Как-то так, если схематично. Так что если что-то выглядит сложным, не значит, что это решенное задание)
Хотя может это известно, тогда извиняюсь)
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2014, 22:05
Привет! Вот еще темы с ответами:

Шаблонный класс для работы с разными типами данных и объявление методов в main - C++
есть класс шаблонный, но не могу объявить методы в main и сделать длядругих типов :(когда делала через шаблонные функции, то программа...

Инициализация объектов разными типами - C++
Дана такая main: int main() { C c1(6), c2 = 5, c3(c1 + c1); return 0; } Нужно определить класс С так, чтобы ошибочным было...

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

Массив с разными типами через memcpy() - C++
Здравствуйте! Подскажите пожалуйста, как через memcpy() организовать массив с разными типам? Я пытаюсь так: char * packet; ...


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

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

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