0

私はc++割り当てのコードを書いていますが、Queue.hファイルとQueue.cppファイルがあります。しかし、main()に#include "Queue.h"を入れると、それらを利用できません。Queue.hファイルの12行目で上記の問題が発生しました。

error C2371: 'ItemType' : redefinition; different basic types

RecordServiceクラスをItemtypeとして配置したかったのです。

私のQueue.hファイルは以下のとおりです。

#pragma once
#ifndef Queue_H
#define Queue_H
#include<iostream>
#include<string>
#include "RecordService.h"
using namespace std;

typedef RecordService ItemType;  // << problem here

/** ADT queue - Pointer-based implementation. */
class Queue
{
private:
    /** A node on the queue. */ 
    struct Node
    {
        /** A data item on the queue. */
        ItemType item;
        /** Pointer to next node.     */
        Node    *next;
    }; // end Node

    /** Pointer to front node in the queue. */
    Node *frontNode;
    /** Pointer to back node in the queue. */
    Node *backNode;

public:

   /** Default constructor. */
   Queue();

   /** Destructor. */
   ~Queue();

// Queue operations:
   bool isEmpty() const;
   bool enqueue(ItemType& newItem);
   bool dequeue();
   bool dequeue(ItemType& item);
   void getFront(ItemType& item) const;

}; // end Queue
// End of header file.

#endif

私のQueue.cppはここにあります

#include "Queue.h"  // header file


Queue::Queue(void)
{   
}  // end default constructor


Queue::~Queue()
{
   while (!isEmpty())
      dequeue();
}  // end destructor

bool Queue::isEmpty() const
{
   return backNode == NULL;
}  // end isEmpty

bool Queue::enqueue(ItemType& newItem)
{
     // create a new node
      Node *newNode = new Node;
      newNode->item = newItem;
      newNode->next = NULL;

      // insert the new node
      if (isEmpty())
     // insertion into empty queue
         frontNode = newNode;
      else
     // insertion into nonempty queue
         backNode->next = newNode;

      backNode = newNode;  // new node is at back
      return true;

}  // end enqueue

bool Queue::dequeue() 
{
   if(isEmpty())
        {
            cout<<"The queue is empty."<<endl;
        }
        else
        {
            Node *temp= frontNode;
            if(frontNode==backNode)
            {
                frontNode=NULL;
                backNode=NULL;
            }
            else
                frontNode=frontNode->next;

            temp->next=NULL;
            delete (temp);
        }
        return true;  // end if

}  // end dequeue

bool Queue::dequeue(ItemType& item)
{
   if(isEmpty())
    {
        cout<<"The queue is empty."<<endl;
    }
    else
    {
        item = frontNode->item;
        dequeue();
    }
    return true;

}  // end dequeue

void Queue::getFront(ItemType& item) const
{
   if (!isEmpty())
      // queue is not empty; retrieve front
      item = frontNode->item;
    else 
        cout << "The queue is empty." << endl;
}  // end getFront

RecordServiceをItemtypeとして「Queue.h」ヘッダーに配置したい場合があります。これがRecordService.hです

#pragma once
#ifndef RecordService_H
#define RecordService_H
#include <iostream>
#include <string>
#include <ctime>
using namespace std;

class RecordService
{
public:
    RecordService();
    RecordService(string, string, string, int, double, bool, string);
    ~RecordService();

    //set methods
    void setTransID(char);
    void setCusName(string);
    void setVehicleNo(string);
    void setCarType(string);
    void setWashDuration(int);
    void setShampooDuration(int);
    void setPolishDuration(int);
    void setVacuumDuration(int);
    void setTotalDuration(int,int,int,int);
    void setWashingCharge(double);
    void setShampooingCharge(double);
    void setPolishingCharge(double);
    void setVacuumingCharge(double);
    void setTotalCharge(double,double,double,double);
    void setRewardStatus(bool);
    void setDateOfTrans(string);

    //get methods
    char getTransID();
    string getCusName();
    string getVehicleNo();
    string getCarType();
    int getWashDuration();
    int getShampooDuration();
    int getPolishDuration();
    int getVacuumDuration();
    int getTotalDuration();
    double getWashingCharge();
    double getShampooingCharge();
    double getPolishingCharge();
    double getVacuumingCharge();
    double getTotalCharge();
    bool getRewardStatus();
    string getDateOfTrans();

private:
    char transID;
    string CusName;
    string vehicleNo;
    string carType;
    int WashDuration;
    int ShampooDuration;
    int PolishDuration;
    int VacuumDuration;
    int TotalDuration;
    double WashingCharge;
    double ShampooingCharge;
    double PolishingCharge;
    double VacuumingCharge;
    double TotalCharge;
    bool RewardStatus;
    string DateOfTrans;

};
#endif

私を助けてくれてありがとう。このエラーのため、他の部分に進むことができません。

4

1 に答える 1

0

ItemTypeQueueクラス内で移動できます。ItemTypeこれで、定義した他のヘッダーと衝突する可能性があります。

だから代わりに

typedef RecordService ItemType;  // << problem here

/** ADT queue - Pointer-based implementation. */
class Queue
{
    ...
}

使用する

/** ADT queue - Pointer-based implementation. */
class Queue
{
    typedef RecordService ItemType;

    ...
}

ItemTypeクラスの内外で引き続きアクセスできます(作成されItemTypeQueueいる場合)Queue::ItemTypeQueuepublic

于 2013-01-16T02:11:47.060 に答える