logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Visual C++: Błędy kompilacji przy użyciu klas i konstruktorów - jak je naprawić?

Defice 06 Mar 2012 09:17 1087 4
REKLAMA
  • #1 10640174
    Defice
    Poziom 25  
    Posty: 698
    Pomógł: 101
    Ocena: 15
    Witam, mój problem polega na tym, że podczas kompilacji mojej aplikacji występują errory których treści nie rozumiem :/ Visual C++ to moja słaba strona, zbytnio przyzwyczaiłem się do C# i nie umiem się z powrotem przestawić. Próbuje wykonać prosty przykład z pewnego kursu internetowego, jednak są problemy. Nie wiem w czym tkwi problem, pewnie coś prostego, ale nie umiem do tego dojść sam :/

    Program główny:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    cowiek.h

    Kod: text
    Zaloguj się, aby zobaczyć kod




    cowiek.cpp

    Kod: text
    Zaloguj się, aby zobaczyć kod



    Treści errorów:


    Cytat:
    Error 1 error LNK2005: "public: __thiscall cowiek::cowiek(void)" (??0cowiek@@QAE@XZ) already defined in cowiek.obj D:\Projekty\Visual C++\klasy\klasy\klasy.obj klasy

    Error 2 error LNK2005: "public: __thiscall cowiek::cowiek(char *,char *,int)" (??0cowiek@@QAE@PAD0H@Z) already defined in cowiek.obj D:\Projekty\Visual C++\klasy\klasy\klasy.obj klasy

    Error 4 error LNK2005: "public: void __thiscall cowiek::wypisz(void)" (?wypisz@cowiek@@QAEXXZ) already defined in cowiek.obj D:\Projekty\Visual C++\klasy\klasy\klasy.obj klasy

    Error 3 error LNK2005: "public: __thiscall cowiek::~cowiek(void)" (??1cowiek@@QAE@XZ) already defined in cowiek.obj D:\Projekty\Visual C++\klasy\klasy\klasy.obj klasy

    Error 5 error LNK1169: one or more multiply defined symbols found D:\Projekty\Visual C++\klasy\Debug\klasy.exe 1 1 klasy


    Dodano po 14 [minuty]:

    Zakomentowanie linii: #include "cowiek.cpp"

    Podziałało, ale nie wiem dlaczego :/ Na laboratoriach z C++ wykładowca wyraźnie zaznaczał by w programie głównym załączyć plik cpp od naszej klasy (i w trakcie laborków działało to). Może zatem ktoś wyjaśnić mi kiedy ten plik trzeba podpinać a kiedy nie ? I czy ma to coś wspólnego z wersją Visual Studio ? Na uczelni pracujemy na 2008, w domu mam 2010
  • REKLAMA
  • #2 10640245
    kotlar
    Poziom 13  
    Posty: 124
    Pomógł: 4
    Ocena: 5
    Po co załączasz plik: "cowiek.cpp" skoro masz już załączony "cowiek.h"?
    Załącza się pliki *.h Coś źle musiałeś zrozumieć wykładowce.
  • REKLAMA
  • #3 10640310
    Defice
    Poziom 25  
    Posty: 698
    Pomógł: 101
    Ocena: 15
    No właśnie nie. Mam nawet jeden przykład z zajęć:

    Program główny:

    Kod: text
    Zaloguj się, aby zobaczyć kod



    Pair.h

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Pair.cpp

    Kod: text
    Zaloguj się, aby zobaczyć kod



    Po coś to musi być, po zakomentowaniu tej linii program się wykłada (nie działa)
  • REKLAMA
  • #4 10640378
    directx11
    Poziom 17  
    Posty: 250
    Pomógł: 25
    Ocena: 14
    Przykład z zajęć który podałeś używa tzw. klasy szablonowej, ale na tym etapie znajomości C++ to może lepiej się za to nie brać, w każdym razie aby on działał przy takim sposobie pisania trzeba takie klasy traktować w specjalny sposób. Jeśli zaś chodzi o post nr 1 to załączając w jednym pliku cpp inny plik cpp tak naprawdę wrzucasz cały kod jednego w drugi, nie dziwne więc że linker wyrzuca błędy podwójnej definicji, bo defacto kompiluje ten sam kod dwa razy, raz z oryginalnego pliku, drugi raz z załączonego w innym. Konkretna metoda klasy może w programie być zdefiniowana tylko raz. W C# definicje metod wpisuje się w samej klasie o ile się orientuję, w C++ wcale nie musi tak być (choć można to robić), mogą one być w innym pliku, ale to implikuje fakt, że nie można plików z definicjami "includować", wystarczą same deklaracje a linker załatwia resztę.
  • #5 10644854
    Defice
    Poziom 25  
    Posty: 698
    Pomógł: 101
    Ocena: 15
    Chyba wszystko już jasne, zamykam
REKLAMA