C ++ защищает приватный символ * класса - PullRequest
0 голосов
/ 22 ноября 2010

Я понимаю различия в наследовании публичного, частного, защищенного по отношению к классу метода / свойства объекта.Однако мой вопрос связан именно с указателями на строки с нулевым символом в конце.

class MyClass
{
   private: 
      char * SomeValue;

   ...
   ...
}

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

Спасибо

Ответы [ 8 ]

3 голосов
/ 22 ноября 2010

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

class MyClass {
  char* someValue;
public:
  const char* get_SafeSomeValue() const {
    return someValue;
  }
};
2 голосов
/ 22 ноября 2010

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

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

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

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

1 голос
/ 22 ноября 2010

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

private:
    const string someValue;
public:
    const string& getReadOnlyValue() { return someValue;};
1 голос
/ 22 ноября 2010

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

const char* foo();
0 голосов
/ 22 ноября 2010

Это возможно - это просто зависит от реализации.

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

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

0 голосов
/ 22 ноября 2010

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

0 голосов
/ 22 ноября 2010

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

class MyClass
{
  private:
    char * SomeValue;


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

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

  • Сделайте ваш конструктор копирования и оператор присваивания приватным, а не реализуйте их.
  • Перегрузите их для правильной работы.
  • Получено из boost :: noncopyable.
0 голосов
/ 22 ноября 2010

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

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

   ...
   ...
}
...