Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 30
  1. #1

    [C++] implementazione metodi di classe

    Sto cominciando a imparare il c++, però ho subito incontrato dei problemi e mi è venuto il dubbio che questi problemi dipendano almeno in partte dal compilatore. io uso il compilatore gratuito djgpp.

    il mio problema è il seguente:

    // m1.cpp
    class A{
    public: makeAThing();
    }

    A::makeAthing() { }

    //prog.cpp
    #include "m1.cpp"

    int main() {
    A a;
    a.makeAThing();
    }

    Quando compilo m1.cpp mi dà no errors. Quando compilo prog.cpp mi dà no errors. Ma quando linko mi dà "multiple definition of A::makeAThing(void)". Dove è l'errore? Anche perché sui manuali c'è la possibilità di separare la dichiarazione dall'implementazione ed è quello che io vorrei fare.
    C'è qualche compilatore che permette di compilare il codice precedente?
    Voi che compilatore usate?

    -------------------------

    p.s.
    Segnalo che invece non mi dà errore il seguente esempio di programma, dove metto tutto il codice in un unico file:

    class A {
    public:
    makeAThing();
    };

    A::makeAThing() { }; //funziona anche con istruzioni tra { e }

    int main(){
    A a;
    a.makeAThing();
    }

    Anche il seguente codice viene dà un file exe funzionante:

    // m1.cpp
    class A {
    public:
    makeAThing() { }; //funziona anche con istruzioni tra { e }
    };

    // prog.cpp
    #include "m1.cpp"

    int main() {
    A a;
    a.makeAThing();
    }

  2. #2
    Probabilmente sui libri avrai letto anche che e` uso comune separare:

    - prototipi e dichiarazioni (da inserire negli headers, .h/.hpp);
    - implementazioni (da inserire nei sorgenti veri e propri, .c/.cc/.cpp).

    Il problema della ridefinizione si verifica dal momento che il metodo A::makeAThing() lo definisci in entrambi i files (perche` con l`#include includi interamente m1.cpp in prog.cpp).

    Quindi:

    1) Compili prog.cpp -> definizione A::makeAThing() (incluso in m1.cpp)
    2) Compili m1.cpp -> definizione A::makeAThing()

    Il linker unisce gli output e si chiede quale sia la definizione giusta fra le due, ma non lo sa e quindi compare l`errore.

    La soluzione e` questa:

    codice:
    // m1.hpp (dichiarazione della classe)
    class A
    {
        public:
            makeAThing();
    };
    
    // m1.cpp (implementazione della classe)
    A::makeAthing()
    {
    }
    
    // prog.cpp
    #include "m1.hpp"
    
    int main()
    {
        A a;
        a.makeAThing();
    }
    Un`altra soluzione sarebbe definire il metodo 'inline' nella dichiarazione di classe, ma per adesso non penso possa interessarti.

    Se non hai capito rispondi qui.

    Ciao.

  3. #3
    Ho provato a scrivere il codice che mi hai dato:

    // m1.hpp (dichiarazione della classe)
    class A
    {
    public:
    makeAThing();
    };

    // m1.cpp (implementazione della classe)
    A::makeAthing()
    {
    }

    // prog.cpp
    #include "m1.hpp"

    int main()
    {
    A a;
    a.makeAThing();
    }

    quando compilo prog.cpp (il main), ok; ma quando compilo il file m1.cpp, mi dà :
    parse error before '::'

  4. #4
    Argh! Chiedo venia!

    Beh il file m1.hpp devi includerlo anche in m1.cpp, perche` ovviamente anche a m1.cpp serve la dichiarazione della classe!

    Ciao.

  5. #5
    Ho inserito l'inclusione del file m1.hpp

    codice:
    // m1.hpp (dichiarazione della classe) 
    class A 
    { 
    public: 
    makeAThing(); 
    }; 
    
    // m1.cpp (implementazione della classe)
    #include "m1.hpp"
     
    A::makeAthing() 
    { 
    } 
    
    // prog.cpp 
    #include "m1.hpp"
    , ma mi dà: multiple definition of A::makeAThing(void)

    Ma usi anche tu il djgpp oppure usi un altro compilatore? Magari dipende da quello

  6. #6
    Se hai copiato e incollato di pari passo il problema può essere nella differenza, in C e C++, tra

    makeAthing

    e

    makeAThing


    Originariamente inviato da wiligelm

    ...
    codice:
    // m1.hpp (dichiarazione della classe) 
    class A 
    { 
    public: 
    makeAThing(); 
    }; 
    
    // m1.cpp (implementazione della classe)
    #include "m1.hpp"
     
    A::makeAthing() 
    { 
    } 
    
    ...
    Che il pelo cresca sempre fluente sui vostri piedi
    Bilbo
    Visita il sito della Società Tolkieniana Italiana

  7. #7

    mi dà solo messaggio there were some errors

    Il codice del programma originale è giusto cioè makeAThing e non makeAthing(), come osservava Piero Salandin, comunque ho provto a ricompilare perché avevo un dubbio e l'errore segnalato dal compilatore non è specificato, c'è solo il messaggio "There were some errors".

  8. #8

    scusate le imprecisioni

    spero continuiate a rispondermi

  9. #9

    ricorrezione

    non so perché il compilatore mi dava there were some errors, forse si era impalato, comunque ricorreggo il tutto: quando compilo il file m1.cpp e il file prog.cpp (il main) mi dà no errors, mentre quando faccio il link, mi dà multiple definition of A::makeAThing(void)
    sorry :master:

  10. #10

    Re: ricorrezione

    Mah, a me non lo dà. Compila correttamente. Ma sto usando il buon vecchio Borland C++ 3.1 a me tanto caro. Potrebbe a questo punto essere un problema di configurazione del tuo compilatore.

    Prova magari a mettere qualcosa nella definizione della funzione in modo da far capire al compilatore (che magari è un po' tocco) che non è sufficiente una funzione pura (nulla), ma che qualcosa c'è. Potrebbe essere che il compilatore, non trovando nulla nel file CPP, prenda la funzione contenuta nel file HPP come definizione e non solo come dichiarazione, e che quindi, ritrovandola dopo, la consideri una doppia definizione.
    (vado a spanne, ma in effetti le funzioni che facevo io avevano sempre qualcosa dentro...)

    Originariamente inviato da wiligelm
    non so perché il compilatore mi dava there were some errors, forse si era impalato, comunque ricorreggo il tutto: quando compilo il file m1.cpp e il file prog.cpp (il main) mi dà no errors, mentre quando faccio il link, mi dà multiple definition of A::makeAThing(void)
    sorry :master:
    Che il pelo cresca sempre fluente sui vostri piedi
    Bilbo
    Visita il sito della Società Tolkieniana Italiana

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.