2010-11-22 4 views
0

Я понимаю различия наследования публичных, частных, защищенных по отношению к классам/свойствам. Тем не менее, мой вопрос конкретно связан с указателями нулем строки ..C++ защита частного char * класса

class MyClass 
{ 
    private: 
     char * SomeValue; 

    ... 
    ... 
} 

Теперь, где-то в процессе обработки, то MyClass-> SomeValue получает выделяется и заполняется значением строки. Нет проблем. Теперь я хочу, чтобы какой-то источник вызова имел экземпляр моего объекта MyClass и ему нужно значение строки. Поскольку C++ может нанести большой урон указателями и указателями на указатели и т. Д., Я хочу вернуть местоположение указателя в строку выделенных символов, но не хочу, чтобы кто-либо менял значения. Является ли это стандартным для управления компилятором и памятью? Его низкий риск того, что кто-то будет использовать этот класс в первую очередь для внутренних целей, но только из моего понимания.

Благодаря

ответ

3

Обычно вы бы возвращать константный указатель на голец. Нет ничего, что могло бы остановить кого-то, переводящего возвращаемое значение в не const. Но C++ не предназначен для защиты от вредоносного кодирования.

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

Только для записи: Вы должны сделать `get_SafeSomeValue` константной функции-члена, а также. – 2010-11-22 15:45:04

+0

Значит, модификатор «const» заставляет уровень защиты? Спасибо ... это кажется консенсусом ответов в моих обстоятельствах. – DRapp 2010-11-22 15:46:47

0

Вы можете сделать это:

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

    ... 
    ... 
} 
1

Почему бы использовать голый указатель держать строку в C++, когда std::string обеспечивает более чистый, безопасный метод, содержащие и транспортировки строки вокруг? То, что вы хотите сделать, это звучит так: получить значение строки, не позволяя другому классу/функции/методу изменять значение? Просто вернуть его с const в качестве модификатора:

const char* foo(); 
1

Вы можете использовать:

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

Если вы не пользователям изменять данные, которые они указывают вам может иметь функции, которые возвращают константный символ * ,

class MyClass 
{ 
    private: 
    char * SomeValue; 


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

Вы должны быть осторожны с копированием и назначением объектов вашего класса. Для практических целей вам может понадобиться заменить char * на std :: string или std :: vector < char>. В противном случае вы можете:

  • Сделать свой экземпляр-конструктор и оператор присваивания конфиденциальным и не выполнять их.
  • Перегрузите их для правильной работы.
  • Вывод из boost :: noncopyable.
2

Нет, вы не можете этого сделать.

Даже если вы делаете что-то, как другие люди предполагают, например:

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

Вы можете вызвать delete myClassInstance->get_SafeSomeValue().

0

Что вы хотите сделать, невозможно. C++ не предоставляет механизма, позволяющего людям стрелять в ногу. Например, как вы могли бы запретить кому-либо звонить удалять по этому указателю?

0

Возможно - его просто зависит от исполнения.

Эти вещи обрабатываются через страницы защищенной памяти - вы можете выделить несколько страниц памяти и установить их, например. «только для чтения» - каждый доступ на запись завершится с исключением. Это просто требует немного программных накладных расходов.

В WindowsAPI VirtualAllocEx хороший стартер ...