2010-11-05 7 views
0

Pourquoi la méthode getName() est-elle incorrecte? Parce que vous exposer la structure sous-jacente des données privées dans l'objetPourquoi je ne peux pas le faire en C++?

#include <iostream.h> 
#include <string.h> 

class People 
{ 
public: 
    char* getName(); 
    void setName(char* n); 

private: 
    char* name; 
}; 

void People::setName(char* n) 
{ 
    name = new char(strlen(n)); 
    strcpy(name,n); 
} 

char* People::getName() 
{ 
    return name; 
} 
+3

Fais quoi? (remplissage de l'espace) –

+2

Cette question est incomplète. Publier des erreurs et des échantillons de code cohérents. – jwueller

+0

J'ai formaté la question pour vous. Vous pouvez maintenant voir que la méthode 'setName' n'a pas été déclarée. –

Répondre

2

Un ou deux choses. Tout d'abord, comme l'a souligné Ignacio (en supposant que ce soit votre question en premier lieu, c'est un peu vague), nous avons des membres privés pour que d'autres classes ne puissent pas les accepter arbitrairement. Nous exposons ce que nous voulons d'autres classes à utiliser via une interface publique. Deuxièmement, étant donné qu'il s'agit de C++, je recommande fortement d'utiliser std::string par opposition à char*.Voici votre classe à nouveau:

#include <string> 

class Person 
{ 
private: 
    std::string m_Name; 

public: 
    const std::string& getName() const {return(m_Name);};  
}; // eo class Person 

Qu'avons-nous fait ici?

1) Nous avons un C++ std::string qui gère toutes les affaires de chaînes pour nous. Nous n'avons pas à nous soucier de l'allocation de mémoire, des tailles de mémoire tampon insuffisantes, etc.

2) Il est privé, personne ne peut la vis avec elle, si les classes ne peut se prolonger:

Person p; 
p.m_Name = "hahaha, I just messed with you"; 

3) Pour permettre aux utilisateurs de notre classe ont accès au nom, nous revenons un const std::string&. Ils peuvent l'utiliser, le voir, mais ne pas le modifier (à moins, bien sûr, qu'ils le constent <>, mais nous avons au moins montré notre intention).

4) Le getter est marqué comme const. Cela indique au compilateur que nous ne modifierons aucun membre de la classe pendant cet appel. J'espère que cela a répondu quelle que soit votre question était de

Je n'ai aucune idée à ce stade.

2

Faites une copie et retournez-la.

+0

Je dois faire une copie du nom dans le getName méthode, puis retourner cela? – xRobot

+0

Oui. Ce sera à l'appelant de libérer la copie. –

+0

+1! Ce n'est pas exactement une erreur, mais il devrait le faire de toute façon. – jwueller

7

Parce que Class doit être class.

Maintenant avec votre modification, vous ne déclarez pas setName dans votre définition de classe.

Les compilateurs sont pointilleux (comme nous). Pourquoi ne nous montrez-vous pas exactement ce que le compilateur vous dit?

1

Ceci est parfaitement légal. Quelle erreur rencontrez-vous?

PS La classe doit être en minuscule c comme dans class.


À partir de votre modifiersetName() n'est pas défini dans la définition de la classe People.

En outre,

name = new char(strlen(n)); 

est-erronous. Vous devez soit déclarer comme ceci:

name = new char[strlen(n)]; 

OU

name = new char[255]; //Constant value. 

OU

name = malloc(sizeof(char)*strlen*(n)); 
+0

cela fonctionne mais j'ai lu que la méthode getName() est fausse mais je ne sais pas pourquoi. – xRobot

+0

Si cela fonctionne, alors ce n'est pas faux ... où avez-vous eu ces informations? Pouvez-vous poster le lien de votre source? –

+0

@The Gentleman Elite: 'new char [x]' ne nécessite pas de valeur constante. Il peut s'agir de n'importe quelle valeur calculée à l'exécution, comme 'malloc (x)'. –

1

Vous pouvez le faire si vous corriger la faute de frappe Class: il devrait être class.

Fournir un journal d'erreurs de compilation lorsque vous posez ce type de question, nous ne pouvons rien dire d'utile mais devinez si vous ne le faites pas.

1

Utilisez

#include <iostream> 
#include <string> 

chaîne Utiliser au lieu de char, après tout ce que vous incluez l'en-tête de chaîne.

using namespace std; 
class People 
{ 
public: 
    string getName();  
private: 
    string name;  
}; 

De retour d'une poignée, pointeur char, à des données privées, le nom, de getName est un bad idea

+1

est dépréciée. Incluez à la place. En outre, inclura probablement le mauvais en-tête. –

+0

@VJo - Je l'avais mentionné, juste posté au mauvais moment. Et pourquoi le vote à la baisse? – DumbCoder

+0

Downvoted parce que vous «utilisez» tout l'espace de noms std dans ce qui est probablement un en-tête. Vous mendiez pour un affrontement de nom. – bltxd

1

Votre tampon alloué est un octet plus petit que la chaîne d'entrée n. Je pense que vous oubliez l'espace pour la fin '\ 0'.

Questions connexes