2010-11-22 15 views
0

Ich verstehe die Unterschiede der Vererbung von öffentlichen, privaten, geschützt in Bezug auf Klasse Methode/Eigenschaft Constructs. Allerdings ist meine Frage speziell mit Zeigern terminierten Strings auf null ..C++ Schutz eines privaten char * einer Klasse

class MyClass 
{ 
    private: 
     char * SomeValue; 

    ... 
    ... 
} 

nun irgendwo über die Verarbeitung, die myclass-> EinWert wird mit einem String-Wert zugeordnet und bevölkert. Kein Problem. Nun möchte ich eine aufrufende Quelle, die eine Instanz meines "MyClass" -Objekts erstellt hat und den String-Wert von diesem benötigt. Da C++ mit Zeigern und Zeigern auf Zeiger usw. viel Schaden anrichten kann, möchte ich den Zeiger auf die Zeichenkette zurückgeben, die zugewiesen wurde, aber niemand möchte Werte ändern. Wird dieser Standard innerhalb des Compiler- und Speichermanagements kontrolliert? Es ist ein geringes Risiko, dass jemand diese Klasse als in erster Linie für interne Zwecke verwendet, aber nur mehr von meinem Verständnis.

Dank

Antwort

3

Normalerweise würden Sie ein const Zeiger auf die Zeichen zurück. Es gibt nichts, was jemanden daran hindern könnte, den Rückgabewert an ein non const zu übergeben. Aber C++ ist nicht dazu gedacht, gegen bösartige Kodierung zu schützen.

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

Nur für das Protokoll: Sie sollten auch eine konstante Elementfunktion machen 'get_SafeSomeValue'. –

+0

Also erzwingt der "const" Modifier das Schutzniveau? Danke ... das scheint unter meinen Umständen der Konsens der Antworten zu sein. – DRapp

+2

Nein, Sie können immer noch 'delete myClassInstance-> get_SafeSomeValue(); 'aufrufen und der Compiler sagt nichts. – Simone

0

Sie können dies tun:

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

    ... 
    ... 
} 
1

Warum würden Sie einen nackten Zeiger verwenden, um eine Zeichenfolge in C++ zu halten, wenn std::string eine sauberere bietet, sicherere Methode zu enthalten, und eine Schnur um den Transport? Was Sie tun möchten, klingt wie, ist auf den Wert der Zeichenfolge zu bekommen, ohne eine andere Klasse/Funktion/Methode zu erlauben, den Wert zu ändern? zurückbringen sie gerade mit const als Modifikator:

const char* foo(); 
1

können Sie verwenden:

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

Wenn Sie nicht Benutzer tun, um die Daten zu ändern, die sie Ihnen zeigen können Funktionen, die const char zurückgeben * .

class MyClass 
{ 
    private: 
    char * SomeValue; 


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

Sie müssen vorsichtig sein, wenn Objekte Ihrer Klasse kopiert und zugewiesen werden. Aus praktischen Gründen möchten Sie vielleicht Ihr char * durch ein std :: string oder std :: vector < char> ersetzen. Failing that Sie können entweder:

  • Machen Sie Ihre Kopie-Konstruktor und Zuweisung Operator privat und nicht implementieren sie.
  • Überladen Sie sie, um richtig zu arbeiten.
  • Ableiten von boost :: nicht kopierbar.
2

Nein, das können Sie nicht wirklich tun.

Auch wenn Sie etwas tun, wie andere Leute darauf hindeutet, zum Beispiel:

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

noch Sie delete myClassInstance->get_SafeSomeValue() aufrufen kann.

+0

Ich habe böswillig eine 'const' hinzugefügt, um die Methode zu qualifizieren, fühlen Sie sich frei, sie zu entfernen, wenn Sie beleidigt sind :) –

+0

Kein Problem, das Ergebnis ist das gleiche :) – Simone

0

Was Sie tun möchten, ist nicht möglich. C++ bietet keinen Mechanismus, um zu verhindern, dass Menschen sich selbst in den Fuß schießen. Wie würden Sie zum Beispiel verhindern, dass jemand auf diesem Zeiger löscht?

0

Es ist möglich - es nur os-abhängig zu implementieren.

Diese Dinge werden über geschützte Speicherseiten behandelt - Sie können mehrere Speicherseiten zuweisen und sie z. "Nur lesen" - jeder Schreibzugriff wird dann mit einer Ausnahme fehlschlagen. Es braucht nur ein wenig programmatischen Overhead.

In WindowsAPI VirtualAllocEx ist ein guter Starter ...

Verwandte Themen