Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [c++] Linker error

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    4

    [c++] Linker error

    Buonasera a tutti. Sono nuovo del forum e avrei bisogno di un aiuto, sto implementando questo semplice programma per esercitarmi con l'uso delle classi in c++. Come noterete dal codice ho creato 3 file: un main, un header e una "classe" cliente; Ho incluso "Cliente.h" nel main e scritto concretamente il costruttore e i suoi metodi in Cliente.cpp .

    Il mio problema è che quando vado a compilare l'intero progetto dev-c++ mi tira fuori in fase di compilazione i seguenti errori:
    [Linker error] undefined reference to `Cliente::Cliente(char*, char*, char*, int)'
    [Linker error] undefined reference to `Cliente::stampa()'
    ld returned 1 exit status

    Dove sbaglio ? Perchè se invece di scrivere concretamente il costruttore e il metodo in cliente.cpp li scrivo prima del main, il programma va ? Vi ringrazio in anticipo.

    File: main.cpp
    #include <cstdlib>
    #include <stdio.h>
    #include <iostream>
    #include "Cliente.h"

    int main()
    {

    char a[20];
    char b[20];
    char c[20];
    int d;
    printf("Inserisci il nome");
    scanf("%s",a);
    printf("Inserisci il cognome");
    scanf("%s",b);
    printf("Inserisci il indirizzo");
    scanf("%s",c);
    printf("Inserisci eta");
    scanf("%d",&d);
    Cliente x(a,b,c,d);
    x.stampa();

    system("PAUSE");
    return EXIT_SUCCESS;
    }

    File: Cliente.cpp
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "Cliente.h"

    Cliente::Cliente(char a[],char b[],char c[],int d){
    strcpy(name,a);
    strcpy(cognome,b);
    strcpy(indirizzo,c);
    eta = d;
    }

    void Cliente::stampa()
    {
    printf("%s %s %s %d",name ,cognome ,indirizzo, eta);
    }

    File: Cliente.h
    class Cliente
    {
    public:

    Cliente(char a[],char b[],char c[],int d);
    void stampa();

    private:

    char name[20];
    char cognome[20];
    char indirizzo[20];
    int eta;

    };

  2. #2
    Hai aggiunto il file Cliente.cpp al progetto?

    Tra parentesi, se hai dei buffer di dimensione limitata (come accade nella tua classe) dovresti fare sì che la copia si arresti qualora i parametri passati siano più lunghi del buffer disponibile. Per fare ciò puoi ad esempio azzerare la stringa di destinazione (*stringa=0) e usare la funzione strncat (che consente di specificare una lunghezza massima della stringa di destinazione) passandole le dimensioni della stringa (che puoi ottenere tramite l'operatore sizeof).
    Inoltre, i parametri di tipo stringa dovrebbero essere dei const char *, dal momento che il tuo costruttore non ha bisogno di modificarli.
    Infine, in generale in C++ è molto meglio usare le stringhe STL (std::string) e dimenticarsi delle odiose stringhe C.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    4
    Si il file è nel progetto, ma nulla...

    Si il problema delle string in questo "programma veloce" non l'ho trattato. Ma hai perfettamente ragione.

  4. #4
    Non ho presente come sia il Dev (che per inciso ti suggerisco di sostituire con un IDE+compilatore un pelo più moderno, ad esempio Code::Blocks), ma forse c'è qualche opzione da impostare nelle proprietà del file per dirgli di compilarlo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    4
    Risolto. Sono andato a rivedere tutte le direttive di compilazione ed era settato un controllo sugli accesi di file e bloccava la "visione".

    Grazie MItaly.

  6. #6
    Di niente, ciao!
    Amaro C++, il gusto pieno dell'undefined behavior.

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.