2010-11-22 30 views
0

Je comprends les différences d'héritage de public, privé, protégé par rapport à la méthode de classe/constucts de propriété. Cependant, ma question est spécifiquement associée à des pointeurs sur null chaînes terminées ..C++ protégeant un caractère privé * d'une classe

class MyClass 
{ 
    private: 
     char * SomeValue; 

    ... 
    ... 
} 

Maintenant, quelque part dans le traitement, les maclasse-> SomeValue obtient alloué et peuplé d'une valeur de chaîne. Aucun problème. Maintenant, je veux une source d'appel qui a une instance de mon objet "MyClass" créé et a besoin de la valeur de la chaîne de cela. Puisque C++ peut faire beaucoup de dégâts avec des pointeurs, et des pointeurs vers des pointeurs, etc., je veux retourner l'emplacement du pointeur à la chaîne de caractères allouée, mais je ne veux pas que quiconque change les valeurs. Est-ce contrôlé par défaut dans le compilateur et la gestion de la mémoire? C'est un faible risque que quiconque utilise cette classe comme étant principalement à des fins internes, mais juste plus de ma compréhension.

Merci

Répondre

3

En général, vous retourneraient un pointeur const aux caractères. Il n'y a rien qui puisse empêcher quelqu'un d'envoyer la valeur de retour à un non const. Mais C++ n'est pas conçu pour se défendre contre le codage malveillant.

class MyClass { 
    char* someValue; 
public: 
    const char* get_SafeSomeValue() const { 
    return someValue; 
    } 
}; 
+4

Pour la petite histoire: Vous devriez faire 'get_SafeSomeValue' une fonction membre const ainsi. –

+0

Donc le modificateur "const" force le niveau de protection? Merci ... cela semble être le consensus des réponses dans mes circonstances. – DRapp

+2

non, vous pouvez toujours appeler 'supprimer myClassInstance-> get_SafeSomeValue()' et le compilateur ne vous dira rien. – Simone

0

Vous pouvez le faire:

class MyClass 
{ 
    public: 
     const char * getValue(); // return a pointer to a const char that can't be modified 
    private: 
     char * SomeValue; 

    ... 
    ... 
} 
1

Pourquoi voudriez-vous utiliser un pointeur nu pour tenir une chaîne en C++ lorsque std::string fournit une méthode plus propre, plus sûr de contenir et transporter une chaîne autour? Qu'est-ce que vous voulez faire, il semble que, est d'obtenir à la valeur de la chaîne sans permettre une autre classe/fonction/méthode pour changer la valeur? Il suffit de retourner avec const comme modificateur:

const char* foo(); 
1

Vous pouvez utiliser:

private: 
    const string someValue; 
public: 
    const string& getReadOnlyValue() { return someValue;}; 
0

Si vous n'êtes pas aux utilisateurs de modifier les données qu'ils pointent vers vous pouvez avoir des fonctions qui retournent const char * .

class MyClass 
{ 
    private: 
    char * SomeValue; 


    public: 
    const char * getSomeValue() const 
    { 
     return SomeValue; 
    } 
}; 

Vous devez faire attention à ce que les objets de votre classe soient copiés et assignés. Pour des raisons pratiques, vous pouvez remplacer votre char * par un caractère std :: string ou std :: vector < char>. A défaut, vous pouvez:

  • Rendre votre constructeur de copie et votre opérateur d'affectation privés et ne pas les implémenter.
  • Les surcharger pour fonctionner correctement.
  • Dérivé de boost :: non-oculaire.
2

Non, vous ne pouvez pas vraiment faire cela.

Même si vous faites quelque chose comme les autres suggérez, par exemple:

class MyClass { 
    char* someValue; 
public: 
    const char* get_SafeSomeValue() const { 
     return someValue; 
    } 
}; 

Vous pouvez toujours invoquer delete myClassInstance->get_SafeSomeValue().

+0

J'ai malicieusement ajouté un 'const' pour qualifier la méthode, vous pouvez l'enlever si vous offensez :) –

+0

Pas de problème, le résultat est le même :) – Simone

0

Ce que vous voulez faire n'est pas possible. C++ ne fournit aucun mécanisme pour empêcher les gens de se tirer à pied. Par exemple, comment empêcherais-tu quelqu'un d'appeler delete sur ce pointeur?

0

Il est possible - son juste dépendant de l'OS à mettre en œuvre.

Ces choses sont gérées par des pages de mémoire protégées - vous pouvez allouer plusieurs pages de mémoire et les mettre à par exemple. "lecture seule" - tout accès en écriture échouera alors avec une exception. Il a juste besoin d'un peu de frais généraux programmatiques.

En WindowsAPI VirtualAllocEx est un bon début ...