Tässä on varmasti joku puusilmäongelma vaan taustalla, tai sitten olen ymmärtänyt jotain ihan väärin. Enihau kuvitellaan että on tällaiset kooditiedostot.
main.cpp
#include <iostream> #include <stdlib.h> #include "cfoo.cpp" using namespace std; int main(int argc, char *argv[]) { cFoo* oFoo; return 0; }
cfoo.cpp
#include "cfoo.h" // class's header file // class constructor cFoo::cFoo() { // insert your code here } // class destructor cFoo::~cFoo() { // insert your code here }
cfoo.h
#ifndef CFOO_H #define CFOO_H /** * No description */ class cFoo { public: // class constructor cFoo(); // class destructor ~cFoo(); }; #endif // CFOO_H
Minun järkeilyni mukaan tuon pitäisi ainakin kääntyä, vaikkei se mitään teekään. Kuitenkin Dev-C++ 4.9.8.0:n mukana tullut kääntäjä sanoo että
lainaus:
Compiler: Default compiler
Building Makefile: "C:\Documents and Settings\Toho\Omat tiedostot\dev\luokat\Makefile.win"
Executing make...
make.exe -f "C:\Documents and Settings\Toho\Omat tiedostot\dev\luokat\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/include/c++" -I"C:/Dev-Cpp/include/c++/mingw32" -I"C:/Dev-Cpp/include/c++/backward" -I"C:/Dev-Cpp/include"g++.exe main.o cfoo.o -o "luokat.exe" -L"C:/Dev-Cpp/lib"
cfoo.o(.text+0x0):cfoo.cpp: multiple definition of `cFoo::cFoo()'
main.o(.text+0x0):main.cpp: first defined here
cfoo.o(.text+0x6):cfoo.cpp: multiple definition of `cFoo::cFoo()'
main.o(.text+0x6):main.cpp: first defined here
cfoo.o(.text+0xc):cfoo.cpp: multiple definition of `cFoo::~cFoo()'
main.o(.text+0xc):main.cpp: first defined here
cfoo.o(.text+0x12):cfoo.cpp: multiple definition of `cFoo::~cFoo()'
main.o(.text+0x12):main.cpp: first defined heremake.exe: *** [luokat.exe] Error 1
Execution terminated
Mikä meni pieleen?
#include "cfoo.cpp" // Ylläoleva luullakseni on ongelma. Muuttappa seuraavaksi: #include "cfoo.h"
Kiitos paljon!
Kääntäjä siis osaa itse sisällyttää cpp-tiedoston, kun siitä ei sille tarvitse edes mainita? Hyvä näin.
Yleensä *.h-tiedostosta löytyy #include <*.cpp>
eikä päinvastoin, koska nyttenhän voi tapahtua virhe jos .cpp liitetään moneen kertaan. Myöskin jokaisen tiedoston alkuun on hyvä laittaa tuo #ifndef
-tarkistus.
Metabolix kirjoitti:
Yleensä *.h-tiedostosta löytyy
#include <*.cpp>
eikä päinvastoin ...
Hmm.. ei? Itse implementaation sisältävää tiedostoa (.cpp) ei tule sisällyttää minnekään.
Aihe on jo aika vanha, joten et voi enää vastata siihen.