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

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

Восстановить пароль Регистрация
 
__sirroko
4 / 4 / 3
Регистрация: 03.03.2013
Сообщений: 55
06.04.2014, 00:45     Реализация Fifo с разными типами данных #1
Доброго времени суток!

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

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

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

А делать я скорее всего буду через typeid, а не через очередь указателей.
zvoronz
 Аватар для zvoronz
270 / 237 / 21
Регистрация: 29.05.2012
Сообщений: 889
06.04.2014, 01:08     Реализация Fifo с разными типами данных #4
CFifo* operator>>(CData* data);
CFifo* operator<<(CData* data);
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
06.04.2014, 01:22     Реализация Fifo с разными типами данных #5
Вон как zvoronz показал, делай. Почти самое нормально в данном случае (на порядок лучше того, что собрался делать ты, хотя ты этого еще не понял). Если понадобится тип того, что ты там извлек - определишь с помощью dynamic_cast'а...
__sirroko
4 / 4 / 3
Регистрация: 03.03.2013
Сообщений: 55
06.04.2014, 21:14  [ТС]     Реализация Fifo с разными типами данных #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)
zvoronz
 Аватар для zvoronz
270 / 237 / 21
Регистрация: 29.05.2012
Сообщений: 889
06.04.2014, 21:41     Реализация Fifo с разными типами данных #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;
}
__sirroko
4 / 4 / 3
Регистрация: 03.03.2013
Сообщений: 55
06.04.2014, 21:47  [ТС]     Реализация Fifo с разными типами данных #8
zvoronz, теперь вроде бы разобрался)
Спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2014, 22:05     Реализация Fifo с разными типами данных
Еще ссылки по теме:

C++ Двухмерный массив с разными типами данных
Матрица с разными типами данных в ней C++
C++ Visual Studio, в чем разница между разными типами проектов?

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

Или воспользуйтесь поиском по форуму:
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
06.04.2014, 22:05     Реализация Fifo с разными типами данных #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;
}
Как-то так, если схематично. Так что если что-то выглядит сложным, не значит, что это решенное задание)
Хотя может это известно, тогда извиняюсь)
Yandex
Объявления
06.04.2014, 22:05     Реализация Fifo с разными типами данных
Ответ Создать тему
Опции темы

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