Error C2228. Причина неизвестна.

Тема в разделе "LANGS.C", создана пользователем Vandal, 19 май 2010.

  1. Vandal

    Vandal New Member

    Публикаций:
    0
    Регистрация:
    13 май 2010
    Сообщения:
    8
    Заранее извиняюсь, если вопрос попал не в ту тему.

    Файл-заголовок класса
    Код (Text):
    1. //FIFO.h
    2. #ifndef FIFO_H
    3. #define FIFO_H
    4.  
    5. #include <windows.h>
    6. #include <cstdio>
    7. #include <conio.h>
    8.  
    9. class FIFO
    10. {
    11. protected:
    12.     long *RG;
    13.     char HeadCounter,TailCounter;
    14.     bool Full,Empty;
    15. public:
    16.     FIFO(void);
    17.     ~FIFO();
    18.     long* GetRG();
    19.     char GetHeadCounter();
    20.     char GetTailCounter();
    21.     void IncHeadCounter();
    22.     void IncTailCounter();
    23.     bool CmpHeadTail();
    24.     bool WriteElem(long Elem);
    25.     long ReadElem();
    26.     void Overflow();
    27. };
    28. #endif
    Файл с текстами методов
    Код (Text):
    1. //FIFO.cpp
    2. #include "fifo.h"
    3. #define MEMSIZE 256
    4.  
    5. FIFO::FIFO(void)
    6. {
    7.     RG = new long[MEMSIZE];
    8.     SecureZeroMemory(RG,MEMSIZE);
    9.     HeadCounter = 0;
    10.     TailCounter = 0;
    11.     Empty = true;
    12.     Full = false;
    13. }
    14.  
    15. FIFO::~FIFO()
    16. {   delete RG;  }
    17.  
    18. long* FIFO::GetRG()
    19. {
    20.     return RG;
    21. }
    22.  
    23. char FIFO::GetHeadCounter()
    24. {   return HeadCounter; }
    25.  
    26. char FIFO::GetTailCounter()
    27. {   return TailCounter; }
    28.  
    29. void FIFO::IncHeadCounter()
    30. {   HeadCounter = GetHeadCounter()%256; }
    31.  
    32. void FIFO::IncTailCounter()
    33. {   TailCounter = GetTailCounter()%256; }
    34.  
    35. bool FIFO::CmpHeadTail()
    36. {
    37.     char Head,Tail;
    38.  
    39.     Head = GetHeadCounter();
    40.     Tail = GetTailCounter();
    41.     if (Head == Tail)
    42.     {
    43.         Empty = true;
    44.         Full = false;
    45.         return true;
    46.     }
    47.     if ((Head-Tail == 1)||(Head-Tail+255 == 1))
    48.     {
    49.         Empty = false;
    50.         Full = true;
    51.         return true;
    52.     }
    53.     return false;
    54. }
    55.  
    56. bool FIFO::WriteElem(long Elem)
    57. {
    58.     char tail;
    59.  
    60.     tail = GetTailCounter();
    61.     CmpHeadTail();
    62.     if ((Full == true)||(Elem == 0x80000000))
    63.     {   return false;   }
    64.     RG[tail] = Elem;
    65.     IncTailCounter();
    66.     return true;
    67. }
    68.  
    69. long FIFO::ReadElem()
    70. {
    71.     char head;
    72.    
    73.     head = GetHeadCounter();
    74.     CmpHeadTail();
    75.     if (Empty)
    76.     {   return 0x80000000;  }
    77.     IncHeadCounter();
    78.     return RG[head];
    79. }
    80.  
    81. void FIFO::Overflow()
    82. {
    83.     if (GetHeadCounter()==0)
    84.         TailCounter = 255;
    85.     else
    86.         TailCounter = GetHeadCounter()-1;
    87.     Full = true;
    88.     Empty = false;
    89. }
    Файл с основной программой
    Код (Text):
    1. //Lab2.cpp
    2. #include "fifo.cpp"
    3.  
    4. int main(void)
    5. {
    6.     FIFO block();
    7.     int i,j;
    8.     char ch;
    9.     long elem;
    10.    
    11.     while(1)
    12.     {
    13.     system("cls");
    14.     printf("\n     Моделирование памяти по принципу FIFO\n  Числа приведены в 16с\с\n");
    15.     for (i=0; i<64; i++)
    16.     {
    17.         for (j=1; j<=4; j++)
    18. [b]         printf("%2x  %8x      ",i+j*64,block.GetRG()[i+j*64]);[/b]
    19.         printf("\n");
    20.     }
    21.     printf("Нажмите \"W\" для записи, \"R\" для чтения, ESC для выхода из программы\n");
    22.     printf("Для проверки ситуации переполнения нажмите \"O\"\n");
    23.     switch (ch = getch())
    24.     {
    25.     case 27:
    26.         printf("Good Bye...");
    27.         return 0;
    28.     case 'w':
    29.         printf("Введите значение элемента: ");
    30.         scanf("%l",&elem);
    31. [b]     block.WriteElem(elem);[/b]
    32.         printf("Нажмте любую клавишу для продолжения...");
    33.         getch();
    34.         break;
    35.     case 'r':
    36. [b]     printf("%d\n",block.ReadElem());[/b]
    37.         getch();
    38.         break;
    39.     case 'o':
    40.         printf("Указатели головы и хвоста смещены в позицию FULL\n");
    41.         getch();
    42.         break;
    43.     }
    44.     }
    45. }
    При компиляции компилятор ругается следующими нецензурными словами:
    Код (Text):
    1. 1>c:\users\brj\documents\visual studio 2008\projects\memory_l2\memory_l2\lab2.cpp(17) : error C2228: left of '.GetRG' must have class/struct/union
    2. 1>c:\users\brj\documents\visual studio 2008\projects\memory_l2\memory_l2\lab2.cpp(30) : error C2228: left of '.WriteElem' must have class/struct/union
    3. 1>c:\users\brj\documents\visual studio 2008\projects\memory_l2\memory_l2\lab2.cpp(35) : error C2228: left of '.ReadElem' must have class/struct/union
    Компилятор - Visual C++ 2008
    Места, на которые указывают ошибки отмечены в коде жирным шрифтом.

    Заранее благодарен.
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    //Lab2.cpp
    #include "fifo.cpp"

    int main(void)
    {
    FIFO block();

    Убери скобки, нужно просто FIFO block; иначе с точки зрения языка это не создание локального объекта, а объявление функции без параметров, возвращающей FIFO.
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    вот за эту совместимость с Си я и нелюблю С++

    хотя сам иногда юзаю код
    void foo(int);
    foo(42);
     
  4. Vandal

    Vandal New Member

    Публикаций:
    0
    Регистрация:
    13 май 2010
    Сообщения:
    8
    Исправил. Однако после этого полезли ошибки линкера:

    Код (Text):
    1. 1>Lab2.obj : error LNK2005: "public: __thiscall FIFO::FIFO(void)" (??0FIFO@@QAE@XZ) already defined in FIFO.obj
    2. 1>Lab2.obj : error LNK2005: "public: __thiscall FIFO::~FIFO(void)" (??1FIFO@@QAE@XZ) already defined in FIFO.obj
    3. 1>Lab2.obj : error LNK2005: "public: long * __thiscall FIFO::GetRG(void)" (?GetRG@FIFO@@QAEPAJXZ) already defined in FIFO.obj
    4. 1>Lab2.obj : error LNK2005: "public: char __thiscall FIFO::GetHeadCounter(void)" (?GetHeadCounter@FIFO@@QAEDXZ) already defined in FIFO.obj
    5. 1>Lab2.obj : error LNK2005: "public: char __thiscall FIFO::GetTailCounter(void)" (?GetTailCounter@FIFO@@QAEDXZ) already defined in FIFO.obj
    6. 1>Lab2.obj : error LNK2005: "public: void __thiscall FIFO::IncHeadCounter(void)" (?IncHeadCounter@FIFO@@QAEXXZ) already defined in FIFO.obj
    7. 1>Lab2.obj : error LNK2005: "public: void __thiscall FIFO::IncTailCounter(void)" (?IncTailCounter@FIFO@@QAEXXZ) already defined in FIFO.obj
    8. 1>Lab2.obj : error LNK2005: "public: bool __thiscall FIFO::CmpHeadTail(void)" (?CmpHeadTail@FIFO@@QAE_NXZ) already defined in FIFO.obj
    9. 1>Lab2.obj : error LNK2005: "public: bool __thiscall FIFO::WriteElem(long)" (?WriteElem@FIFO@@QAE_NJ@Z) already defined in FIFO.obj
    10. 1>Lab2.obj : error LNK2005: "public: long __thiscall FIFO::ReadElem(void)" (?ReadElem@FIFO@@QAEJXZ) already defined in FIFO.obj
    11. 1>Lab2.obj : error LNK2005: "public: void __thiscall FIFO::Overflow(void)" (?Overflow@FIFO@@QAEXXZ) already defined in FIFO.obj
    12. 1>C:\Users\BRJ\Documents\Visual Studio 2008\Projects\Memory_l2\Debug\Memory_l2.exe : fatal error LNK1169: one or more multiply defined symbols found
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    //Lab2.cpp
    #include "fifo.cpp"

    В мейне надо инклюдить не .cpp, а .h
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    GoldFinch

    Да брось ты, это мелочи жизни. Пиши Type obj = Type(); и все будут щясливы.
     
  7. Vandal

    Vandal New Member

    Публикаций:
    0
    Регистрация:
    13 май 2010
    Сообщения:
    8
    Откомпилилось. Всем спасибо за содействие.