2012-09-30 5 views
0

J'ai appris des cours en C++ et j'ai obtenu un certain code d'un vieux livre russe sur un cours de livre, j'ai essayé de le modifier et de le faire fonctionner peut-être m'aider à comprendre pourquoi authour utilisé ce code (ce qui ne strdup pas?)comment travailler avec les classes

Author = strdup(autho);

dans le constructeur et était mal avec cette ligne de code

Book s("edgar", "science", "chemistry for dummies", "502","12.11.13","1.12.96"); 

Toute personne avec une explication simple droit?

Code principal ci-dessous

using namespace std; 

class Book{ 

    char * Author; 
    char * Type; 
    char * Title; 
    int * Pages; 
    unsigned int * Yearpublished; 
    unsigned int * Publishing; 

    Book(char * autho, char * type, char * title, int * pages, unsigned int * yearpublished, unsigned int * publishing){ 

     Author = strdup(autho); 
     Type = strdup(type); 
     Title = strdup(title); 
     Pages = pages; 
     Yearpublished = yearpublished; 
     Publishing = publishing; 

    } 

    ~Book(){ 

     if(Author != NULL){ 

      free(Author); 

     } 
     if(Type != NULL){ 

      free(Type); 
     } 

     if(Title != NULL){ 

      free(Title); 
     } 
    } 

}; 

int main(){ 

    cout << "main start" << endl; 

    Book s("edgar", "science", "chemistry for dummies", "502","12.11.13","1.12.96"); 

    cout << "main finish" << endl; 
return 0; 
} 
+0

Ce que vous écrivez n'est pas C++. Veuillez jeter toutes les lignes 'char *' et remplacez-les par 'std :: string'. – meagar

+0

comment comme l'auteur de la chaîne? –

+1

En supposant que vous avez correctement copié le code du livre, le meilleur conseil que je peux vous donner est d'arrêter d'utiliser ce livre. Ce code est * impardonnable * cassé. Il n'y a aucun point dans l'histoire de C++ où ce code aurait compilé et travaillé comme prévu. Je ne peux pas penser à un exemple de code C++ pire. – meagar

Répondre

5

Il y a beaucoup, beaucoup de choses mal avec le code affiché. Tant de choses que pratiquement chaque ligne est dans l'erreur.

L'un des plus évident est que vous essayez de stocker un an comme int *, et en passant ensuite dans une chaîne contenant "12.11.13". Ça ne marche pas. Vous faites la même chose pour pages; acceptant un int* et passant une chaîne contenant un int. Vous ne pouvez pas faire cela, ce n'est pas comment les pointeurs fonctionnent. La plupart de votre utilisation des pointeurs indique que vous ne savez pas vraiment ce que le * fait, et vous devriez vous arrêter et lire sur les pointeurs avant d'introduire quelques très difficile de traquer les bugs dans votre code. Vous devriez soit stocker votre année sous la forme d'une chaîne (très mauvaise idée) ou la stocker sous forme d'entier dans unix time, ce qui est plutôt standard. Vous devez supprimer using namespace std et le remplacer par #include <string>. Vous devriez jeter toutes les lignes qui commencent par char*, et les remplacer par std::string et jeter vos lignes int* et les rendre int.

Vous déclarez également un constructeur et un destructeur privés. Vous devez ajouter public: après les déclarations de variable membre, mais avant Book(). Ensuite, vous devriez jeter le corps de votre constructeur et utiliser les listes d'initialisation.

Vous n'incluez pas non plus <iostream>, donc vos appels cout sont probablement à l'origine d'erreurs. Une fois que vous avez fait ce qui précède, vous devez supprimer complètement le destructeur ~Book().

Par exemple:

class Book{ 

    std::string Author; 
    // ... 
    int Pages; 
    // ... 

    public: 

    Book(std::string author, /* ... */ int pages /* ... */) 
    : Author(author), Pages(pages) { 

    } 
}; 
3

Il y a beaucoup d'erreurs là-bas.

1) Vous utilisez beaucoup trop de pointeurs. Vous n'avez même pas besoin d'un seul pointeur dans cet extrait de code. Comme indiqué par meagar, vous pouvez remplacer char* par std::string. Vous n'avez pas besoin de pointeur vers des entiers ou des entiers non signés, vous pouvez utiliser le type tel quel.

2) Vous passez des chaînes de caractères (indiquées par l'utilisation de guillemets "") au lieu de chiffres lors de l'appel du constructeur. Si vous voulez passer des numéros, n'utilisez pas de guillemets.

3) Vous utilisez "using namespace std" qui est incorrect pour de nombreuses raisons et qui a été expliqué tant de fois sur autant de sites que je vais vous laisser chercher pourquoi.

4) Vous utilisez free() sur la mémoire que vous avez non attribué malloc() (et qui ne seraient pas même suggéré en C++ puisque nous avons new et delete). Editer: Si c'est vraiment du code que vous avez pris dans un livre sur C++, alors utilisez ce livre comme allume-feu parce que ça ne vaut pas plus que ça.

Voici une beaucoup version simplifiée de votre code qui est écrit en C++.

#include <iostream> 
#include <string> 

class Book 
{ 
private: 
    std::string Author, Type, Title, Publishing; 
    unsigned int Pages, Yearpublished; 

public: 
    Book(const char* autho, const char* type, const char* title, unsigned int pages, 
     unsigned int yearpublished, std::string publishing) 
    { 
     Author = strdup(autho); 
     Type = strdup(type); 
     Title = strdup(title); 
     Pages = pages; 
     Yearpublished = yearpublished; 
     Publishing = publishing; 
    } 

    ~Book() 
    { 

    } 

}; 

int main() 
{ 
    std::cout << "main start" << std::endl; 
    Book s("edgar", "science", "chemistry for dummies", 502, 2012,"1.12.96"); 
    std::cout << "main finish" << std::endl; 

    return 0; 
} 

Il reste encore beaucoup à améliorer mais cela compilera au moins et fonctionnera très bien.

+0

+1 pour recommander que le livre soit utilisé comme petit bois. comme "grincheux") supprimé ma réponse, qui a dit de rejeter le livre et recommencer. –

1

Je suis un peu confus de votre question, mais je pense que vous demandez surtout pour ce qui est strdup:

Il copie chaîne passée et renvoie un pointeur vers jsut nouvellement créé. Et dans destructor, vous détruisez ces chaînes allouées, le cas échéant.