1

たとえば、List ADT を使用して、複数のクラスを持つ単純な病院のキュー システムを作成する必要があります。だから私の問題はtypedefにあります。型 def は 1 つのデータ型しか持てないため、これを行うにはどうすればよいですか。

  #include <string>
  #include "Patients.h"
  #include "Records.h"
  #include "Services.h"

const int MAX_SIZE = 10000;
typedef Patients ItemType;
typedef Records ItemType;         //Error Here
typedef Services ItemType;        //Error Here

class List
{
  private:
    ItemType items[MAX_SIZE];
    int      size;

  public:

List::List();

void List::display();

void List::replace(int index, ItemType item);

bool List::add(ItemType newItem);

bool List::add(int index, ItemType newItem);

void List::remove(int index);

ItemType List::get(int index); 

bool List::isEmpty(); 

int List::getLength();

};




#include <iostream>
#include "List.h"  // header file
using namespace std;
// constructor
List::List()
{
    size = 0;
}  

// add a new item to the back of the list (append)
bool List::add(ItemType newItem)
{
   bool success = size < MAX_SIZE;
   if (success)
   {  
      items[size] = newItem; // add to the end of the list
      size++;                // increase the size of the list by one
   }  
   return success;
}  

// add a new item at a specified position in the list (insert)
bool List::add(int index, ItemType newItem)
{
   bool success = (index >= 1) && (index <= size + 1) && (size < MAX_SIZE);
   if (success)
   {  
      for (int pos = size; pos >= index; pos--)
         items[pos] = items[pos-1];

      items[index-1] = newItem;
      size++;  // increase the size of the list by one
   }  
   return success;
}  

 // remove an item at a specified position in the list
void List::remove(int index)
{
   bool success = (index >= 1) && (index <= size);
   if (success)
   { 
      for (int fromPosition = index + 1; fromPosition <= size; fromPosition++)
         items[fromPosition - 2] = items[fromPosition - 1];

      size--; 
   }  

}  

// get an item at a specified position of the list (retrieve)
ItemType List::get(int index)
{
   ItemType dataItem;// = 0;
   bool success = (index >= 1) && (index <= size);
   if (success)
      dataItem = items[index - 1];

   return dataItem;
}  

// check if the list is empty
bool List::isEmpty()
{
   return size == 0;
}  

// check the size of the list
int List::getLength()
{
   return size;
}  


void List::replace(int index, ItemType item)
{
bool success = index >= 1 && index <= getLength();
if (success)
    items[index] = item;
}
4

2 に答える 2

1

テンプレートを使用する必要があります。

#include <list>

typedef std::list<Patient> Patients;
typedef std::list<Record> Records;
typedef std::list<Service> Services;
于 2013-01-11T19:35:53.503 に答える
0

Listクラスからクラステンプレートに変更することをお勧めします。std::list<>その他のアイデアについては、標準ライブラリでどのように機能するかを参照してください。

だから、あなたは持っているかもしれません:

template<class ItemType>
class List
{
  private:
    ItemType items[MAX_SIZE];
    int      size;
  public:
    ItemType List::get(int index); 
    ...
};

次に、リストを宣言するときに、リストのデータのタイプを指定できます。

List<Patients> allThePeople;
List<Records>  allThePapers;
List<Services> allTheWork;


もちろん、Listクラスの割り当て以外の理由でコードを作成している場合は、std::list代わりに実際に使用する必要があります。

于 2013-01-11T19:33:19.853 に答える