2016-11-15 4 views
-2

Итак, я делаю проект для своего университета, и я получаю ошибку, указанную в названии. вот мой код.C2371 Ошибка: переопределение; разные базовые типы

//components.h 
#ifndef COMPONENTS_H 
#define COMPONENTS_H 
#include <stdlib.h> 
#include <string> 
#include <iostream> 
#include <Windows.h> 

#define GRAY 8 
#define BLUE 9 
#define GREEN 10 
#define CYAN 11 
#define RED 12 
#define PURPLE 13 
#define YELLOW 14 
#define WHITE 15 

using namespace std; 

template <class TYPE> class NODE 
{ 
public: 
    NODE() 
    { 
     next = NULL; 
     prev = NULL; 
    } 
    TYPE data; 
    NODE<TYPE> *next, *prev; //next and previous nodes 
}; 

template <class TYPE> class LIST { 
private: 
    NODE<TYPE> *head, *tail; 
public: 
    int count; 
    LIST() 
    { 
     head = NULL; 
     tail = NULL; 
    } 
    ~LIST() 
    { 
     EmptyList(); 
    } 

    NODE<TYPE>* GetElement(int n)//find nth element 
    { 
     if (n > count) 
      return NULL; 
     else 
     { 
      NODE<TYPE> *temp = NULL; 
      if (n < (count/2)) 
      { 
       temp = head; 
       for (int i = 0; i < (n - 1); i++) { 
        temp = temp->next; 
       } 
      } 
      else 
      { 
       temp = tail; 
       for (int i = 0; i < (count - n - 1); i++) { 
        temp = temp->prev 
       } 
      } 
      return temp; 
     } 
    } 

    void PushBack(TYPE data) 
    { 
     if (head == NULL) 
     { 
      head = new NODE<TYPE>(); 
      head->data = data; 
      tail = head; 
     } 
     else 
     { 
      NODE<TYPE>* temp = new NODE<TYPE>(); 
      temp->data = data; 
      temp->prev = tail; 
      tail->next = temp; 
      tail = tail->next; 
     } 
     count++; 
    } 

    void PopBack() 
    { 
     if (tail->prev != NULL) 
     { 
      tail = tail->prev; 
      delete tail->next; 
      tail->next = NULL; 
     } 
     else 
     { 
      delete tail; 
      head = NULL; 
      tail = NULL; 
     } 
     count--; 
    } 

    void EmptyList() 
    { 
     while (head != NULL) 
      PopBack(); 
    } 
}; 

class PARTICLE { 
protected: 
    double mass; 
    float spin; 
    double electric_charge; 
    string statistics; 
    string name; 
public: 
    double getElectricCharge() 
    { 
     return electric_charge; 
    } 
    void printMass() { cout <<name<<" mass: "<< mass <<"u"<<endl; } 
    void printSpin() { cout <<name<<" spin: "<< spin << endl; } 
    void printElectricCharge() { cout <<name<<" electric charge: "<< electric_charge <<"e"<<endl; } 
    void printStatistics() { cout <<name<<" statistics: " << statistics << endl;} 
}; 

class ELECTRON : public PARTICLE { 
public: 
    ELECTRON() 
    { 
     name = "Electron"; 
     mass = 0.000548579909070; 
     spin = 0.5f; 
     electric_charge = -1; 
     statistics = "Fermi-Dirac"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN); 
     cout << "A(n) " << name << " has been constructed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
    ~ELECTRON() 
    { 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN); 
     cout << "A(n) " << name << " will be destroyed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
}; 

class GLUON : public PARTICLE { 
public: 
    GLUON() 
    { 
     name = "Gluon"; 
     electric_charge = 0; 
     spin = 1; 
     statistics = "Bose-Einstein"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), GRAY); 
     cout << "A(n) " << name << " has been constructed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
    ~GLUON() 
    { 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), GRAY); 
     cout << "A(n) " << name << " will be destroyed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
}; 

class UP_QUARK : public PARTICLE{ 
public: 
    UP_QUARK() 
    { 
     name = "Up Quark"; 
     electric_charge = 2.0/3.0; 
     mass = 2.01; 
     spin = 0.5f; 
     statistics = "Fermi-Dirac"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), GREEN); 
     cout << "A(n) " << name << " has been constructed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
    ~UP_QUARK() 
    { 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), GREEN); 
     cout << "A(n) " << name << " will be destroyed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 

    void printQuarkMass() 
    { 
     cout << name << " mass: " << mass <<" MeV/(c^2)"<<endl; 
    } 
}; 

class DOWN_QUARK : public PARTICLE { 
public: 
    DOWN_QUARK() 
    { 
     name = "Down Quark"; 
     electric_charge = -(1.0/3.0); 
     mass = 4.7; 
     spin = 0.5f; 
     statistics = "Fermi-Dirac"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), PURPLE); 
     cout << "A(n) " << name << " has been constructed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
    ~DOWN_QUARK() 
    { 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), PURPLE); 
     cout << "A(n) " << name << " will be destroyed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 

    void printQuarkMass() 
    { 
     cout << name << " mass: " << mass << " MeV/(c^2)" << endl; 
    } 
}; 

class PROTON : public PARTICLE{ 
private: 
    LIST<DOWN_QUARK*> dqList;//1 
    LIST<UP_QUARK*> uqList;//2 
    LIST<GLUON*> gList;//3 
public: 
    PROTON() 
    { 
     dqList.PushBack(new DOWN_QUARK); 
     uqList.PushBack(new UP_QUARK); 
     uqList.PushBack(new UP_QUARK); 
     gList.PushBack(new GLUON); 
     gList.PushBack(new GLUON); 
     gList.PushBack(new GLUON); 

     name = "Proton"; 
     mass = 1.007; 
     electric_charge = 1; 
     spin = 0.5f; 
     statistics = "Fermi-Dirac"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW); 
     cout << "A(n) " << name << " has been constructed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 

    ~PROTON() 
    { 
     dqList.EmptyList(); 
     uqList.EmptyList(); 
     gList.EmptyList(); 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW); 
     cout << "A(n) " << name << " will be destroyed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
}; 

class NEUTRON : public PARTICLE{ 
public: 
    LIST<DOWN_QUARK*> dqList;//2 
    LIST<UP_QUARK*> uqList;//1 
    LIST<GLUON*> gList;//3 

    NEUTRON() 
    { 
     dqList.PushBack(new DOWN_QUARK); 
     dqList.PushBack(new DOWN_QUARK); 
     uqList.PushBack(new UP_QUARK); 
     gList.PushBack(new GLUON); 
     gList.PushBack(new GLUON); 
     gList.PushBack(new GLUON); 

     name = "Neutron"; 
     mass = 1.0085; 
     spin = 0.5f; 
     electric_charge = 0; 
     statistics = "Fermi-Dirac"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BLUE); 
     cout << "A(n) " << name << " has been constructed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
    ~NEUTRON() 
    { 
     dqList.EmptyList(); 
     uqList.EmptyList(); 
     gList.EmptyList(); 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BLUE); 
     cout << "A(n) " << name << " will be destroyed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
}; 

class NUCLEUS { 
public: 
    NUCLEUS(); 
    ~NUCLEUS(); 
    LIST<PROTON*> pList; 
    LIST<NEUTRON*> nList; 
}; 

class ATOM { //<================ ERROR APPEARS HERE 
public: 
    ATOM(); 
    ~ATOM() 
    { 
     nList.EmptyList(); 
     eList.EmptyList(); 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), RED); 
     cout << "An Atom has been destroyed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
    int getMassNumber(); 
    void printMassNumber(); 
    int getAtomicNumber(); 
    void printAtomicNumber(); 
    double getElectricCharge(); 
    void printElectricCharge(); 
    LIST<NUCLEUS*> nList; 
    LIST<ELECTRON*> eList; 
private: 
    int mass_number; 
    int atomic_number; 
    double electric_charge; 
}; 

#endif 

Не могли бы вы помочь мне выяснить, что пошло не так? Похоже, что ошибка указана в строке 304. Я добавил комментарий к коду, чтобы сделать поиск более безболезненным.

+2

'ATOM', по-видимому, является типом в win32 api [source] (http://stackoverflow.com/questions/10525511/what-is-the-atom-data-type), я думаю, просто переименуйте его в нечто как «Атом»? – George

+2

Пожалуйста, отредактируйте свой вопрос, чтобы предоставить [mcve]. –

+0

Линия с ошибкой будет приятной. –

ответ

0

В Windows API уже существует тип ATOM, поэтому возникает конфликт между Windows ATOM тип и собственный класс ATOM.

Существует два возможных решения. Во-первых, вы можете переименовать свой класс. Это позволило бы избежать конфликта с Windows API и позволить компиляции вашего кода, однако это, вероятно, не является идеальным.

Другим решением является объединение ваших классов в namespace. Это позволит вам сохранить ваше текущее имя, а также избежать конфликта с Windows. Пример:

namespace MyNamespace 
{ 

class ATOM { //<================ SHOULD COMPILE 
public: 
    ATOM(); 
    ~ATOM() 
    { 
     nList.EmptyList(); 
     eList.EmptyList(); 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), RED); 
     cout << "An Atom has been destroyed\n"; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE); 
    } 
    int getMassNumber(); 
    void printMassNumber(); 
    int getAtomicNumber(); 
    void printAtomicNumber(); 
    double getElectricCharge(); 
    void printElectricCharge(); 
    LIST<NUCLEUS*> nList; 
    LIST<ELECTRON*> eList; 
private: 
    int mass_number; 
    int atomic_number; 
    double electric_charge; 
}; 

} 

В вашем коде, вы можете создать ATOM переменные, как это:

MyNamespace::ATOM myAtom; 

Как личный правило, я стараюсь поставить все свой собственный код внутри пространств имен, потому что это уменьшает потенциал конфликты, подобные этому, и я бы рекомендовал поместить ВСЕ свои собственные классы в их собственное пространство имен в целом.

Смежные вопросы