PDA

View Full Version : [C++] Errore Definizione Multipla con cppUnitTest in Eclipse


Emaborsa
30-03-2011, 12:22
Ho creato unporgetto C++, scritto file c e h. Compilo e tutto funziona. Se vado a creare dei testCase usando ECUT mi da 'multiple definition of' e non riesco a capire il perchè. Vi posto i codici:
Item.h
/*
* Item.h
*
* Created on: Mar 30, 2011
* Author: manuel
*/
#include <stdio.h>
#include <fstream>
#include <string>

#ifndef ITEM_H_
#define ITEM_H_

class Item {

private:
std::string name;
int price;
FILE picture;

public:
Item(const std::string&, int&, FILE&);
int & getPrice();
std::string & getName();
FILE & getPicture();
~Item();
};

#endif /* ITEM_H_ */

Item.cpp
/*
* Item.cpp
*
* Created on: Mar 30, 2011
* Author: manuel
*/

#include "Item.h"
using namespace std;

Item::Item(const string& aName, int& aPrice, FILE& aFile) {
name = aName;
price = aPrice;
picture = aFile;
}
;

int& Item::getPrice() {
return price;
}
;

string& Item::getName() {
return name;
}
;

FILE& Item::getPicture() {
return picture;
}
;

e come detto fino a qui funziona tutto.

Creando ItemTest.h
#ifndef TEST_ItemTest
#define TEST_ItemTest

#ifdef ECUT_MAIN

#include "cppunit/extensions/HelperMacros.h"

class ItemTest : public CPPUNIT_NS::TestFixture {
public:
void setUp();
void tearDown();
void testItem__Item();
void testItem__getPrice();
void testItem__getName();
void testItem__getPicture();
CPPUNIT_TEST_SUITE(ItemTest);
CPPUNIT_TEST(testItem__Item);
CPPUNIT_TEST(testItem__getPrice);
CPPUNIT_TEST(testItem__getName);
CPPUNIT_TEST(testItem__getPicture);
CPPUNIT_TEST_SUITE_END();
};

#endif /* ECUT_MAIN */

#endif /*ITEMTEST*/


e ItemTest.cpp

#ifdef ECUT_MAIN
#include "ItemTest.h"

#include "../src/Item.cpp"

CPPUNIT_TEST_SUITE_REGISTRATION(ItemTest);


void ItemTest::setUp()
{
}
void ItemTest::tearDown()
{
}
void ItemTest::testItem__Item() {
CPPUNIT_ASSERT(false);
}


Mi da errore:
./src/Item.o: In function `Item':
/home/manuel/Eclipse/Test/ECUTTest/../src/Item.cpp:11: multiple definition of `Item::Item(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&, _IO_FILE&)'
./test/ItemTest.o:/home/manuel/Eclipse/Test/ECUTTest/../test/../src/Item.cpp:11: first defined here
./src/Item.o: In function `Item':
/home/manuel/Eclipse/Test/ECUTTest/../src/Item.cpp:11: multiple definition of `Item::Item(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&, _IO_FILE&)'
./test/ItemTest.o:/home/manuel/Eclipse/Test/ECUTTest/../test/../src/Item.cpp:11: first defined here
./src/Item.o: In function `Item::getPrice()':
/home/manuel/Eclipse/Test/ECUTTest/../src/Item.cpp:18: multiple definition of `Item::getPrice()'
./test/ItemTest.o:/home/manuel/Eclipse/Test/ECUTTest/../test/../src/Item.cpp:18: first defined here
./src/Item.o: In function `Item::getName()':
/home/manuel/Eclipse/Test/ECUTTest/../src/Item.cpp:23: multiple definition of `Item::getName()'
./test/ItemTest.o:/home/manuel/Eclipse/Test/ECUTTest/../test/../src/Item.cpp:23: first defined here
./src/Item.o: In function `Item::getPicture()':
/home/manuel/Eclipse/Test/ECUTTest/../src/Item.cpp:28: multiple definition of `Item::getPicture()'
./test/ItemTest.o:/home/manuel/Eclipse/Test/ECUTTest/../test/../src/Item.cpp:28: first defined here

tomminno
30-03-2011, 12:55
Suppongo che il colpevole sia lui:


#include "../src/Item.cpp"


Perchè mai fare l'include di un file cpp?

Emaborsa
30-03-2011, 17:30
Suppongo che il colpevole sia lui:


#include "../src/Item.cpp"


Perchè mai fare l'include di un file cpp?

I file test vengono creati in automatico dal plugin ECUT per fare i test... Se faccio lo stesso lavoro con 2 file sample dati con ECUT, funziona.

tomminno
30-03-2011, 17:51
I file test vengono creati in automatico dal plugin ECUT per fare i test... Se faccio lo stesso lavoro con 2 file sample dati con ECUT, funziona.

Non conosco ECUT ma sicuramente stai compilando 2 volte il file Item.cpp.
Quindi dovresti rivedere il progetto, magari è già incluso quel file e con l'include ottieni la doppia compilazione.

Emaborsa
30-03-2011, 20:36
Non conosco ECUT ma sicuramente stai compilando 2 volte il file Item.cpp.
Quindi dovresti rivedere il progetto, magari è già incluso quel file e con l'include ottieni la doppia compilazione.

Ammetto che non dono esperto di C++, ma la tua frase mi fa capire che da il problema sta nel fatto che faccio include 2 volte dello stesso file, e per questo da errore. Giusto?

EDIT

Se elimino gli include dal Test.cpp compila tutto. Però ora, non avendo l'include del file Item.cpp, come faccio a instanziare un oggetto di tipo Item nella classe ItemTest.cpp?

tomminno
30-03-2011, 21:47
Ammetto che non dono esperto di C++, ma la tua frase mi fa capire che da il problema sta nel fatto che faccio include 2 volte dello stesso file, e per questo da errore. Giusto?


Esattamente.
Quasi sicuramente il file è già incluso nel progetto che stai compilando.


EDIT

Se elimino gli include dal Test.cpp compila tutto. Però ora, non avendo l'include del file Item.cpp, come faccio a instanziare un oggetto di tipo Item nella classe ItemTest.cpp?

Semplicemente includendo Item.h al posto di Item.cpp in ItemTest.cpp.
Includere i file cpp è una pratica decisamente sconsigliata, oltre che perfettamente inutile.
Mi stupisce come un tool automatico possa adottare tale strategia.

Emaborsa
30-03-2011, 21:55
Esattamente.
Quasi sicuramente il file è già incluso nel progetto che stai compilando.



Semplicemente includendo Item.h al posto di Item.cpp in ItemTest.cpp.
Includere i file cpp è una pratica decisamente sconsigliata, oltre che perfettamente inutile.
Mi stupisce come un tool automatico possa adottare tale strategia.

Porca miseria hai ragione :eek: :D Sembra funzionare. Ora faccio delle prove :D