2010-12-12 60 views
1

en C++, j'ai un fichier nommé "Student.h"comment utiliser StrCopy en C++

class LinkedList { 
private: 

class Student { 
public: 

    int stId; 
    char stName [20]; 
    char stMajor[20]; 
    double stAverage; 
    Student * next; 

    Student() { 
     next = 0; 
    } 

    Student(int stId, char stName [20], char stMajor[20], double stAverage) { 
     this.stId = stId; 
     strcopy(this.stName, stName); // there is error here ! 
     strcopy(this.stMajor, stMajor); 
     this.stAverage = stAverage; 
    } 

Que dois-je faire?!

+3

'StrCopy()'? 'strcpy()'? –

Répondre

7

this est un pointeur en C++, et non pas comme une référence en Java. De plus ce que vous avez besoin est strcpy() pas strcopy()

Essayez cette

strcpy(this->stName, stName); 
    strcpy(this->stMajor, stMajor); 

PS: En C++, il est toujours recommandé de préférer std::string sur les tableaux de style C

Une version beaucoup plus propre de votre code serait quelque chose comme ça

struct Student { 

    int stId; 
    std::string stName; 
    std::string stMajor; 
    double stAverage; 
    Student * next; 

    Student():stId(),stAverage(),next()//prefer initialization-list to assignment 
    { 
    } 

    Student(int stId, const std::string &stName, const std::string &stMajor, double stAverage){ 
     this->stId = stId, 
     this->stName = stName , 
     this->stMajor = stMajor, 
     this->stAverage = stAverage;   
    } 
}; 
+0

@Prasoon: s'il vous plaît, n'apprendre pas aux gens à passer 'std :: string' par valeur, comme dans votre' std :: string stMajor' (actuel). S'il vous plaît faites ce 'std :: string const & stMajor'. Il est difficile de se débarrasser des mauvaises habitudes, mieux vaut commencer par de bonnes habitudes :-) –

+0

c'est un devoir en C++, je n'ai pas le temps d'apprendre –

+1

@soad: tu as du mal à apprendre le C++, et tu n'as pas de temps d'apprendre? Eh bien, alors vous êtes foutu. –

0

this est un pointeur, pas une référence, donc vous devez utiliser un pointeur opérateurs déréférencement:

strcpy(this->stName, stName); 

ou

strcpy((*this).stName, stName); 

De plus, je ne recommande pas d'utiliser char[20] comme type de données de noms d'étudiants - c'est très enclin à tamponner les erreurs de débordement. Vous pouvez surmonter ce problème en utilisant strncpy

strcpy(this->stName, stName, 19); 
    this->stName[20]=0; 

Mais la façon la plus pratique utilise std::string, qui peut être facilement copiée par la cession. Enfin, si vous avez choisi une convention pour les noms de variables membres, vous pouvez vous y référer sans this. Exemples:

class Student { 
public: 

    std::string m_stName; 

... 
    Student(int stId, std::string stName, ...) { 
     m_stName=stName; 

ou même (en utilisant initializers):

Student(int stId, std::string stName, ...) : m_stName(stName) { 
    m_stName=stName; 
1

Je pense que vous voulez dire la fonction strcpy (sans o).

0

Ne pouvez-vous pas utiliser std::string?

string s1, s2 = "example"; 
s1 = s2; 

Quoi qu'il en soit, le problème est que dans C++ this renvoie un pointeur donc this.stId est faux, la forme correcte serait this->stId, ou bien (*this).stId.

2

que devrais-je faire?!

Vous devez:

  • utilisation std::string au lieu de tableaux bruts.

  • utilisez std::list au lieu d'inventer le vôtre (sauf pour en savoir plus sur les listes chaînées). N'indique pas les tailles de tableau dans les arguments formels, comme votre ; le type d'argument formel ne conserve pas les informations de taille, il se contente d'un type de pointeur.

  • évitent généralement d'utiliser this directement.

  • utilisent généralement des listes d'initialisation au lieu d'affectations dans le corps du constructeur.

Vive & HTH.,