Как инициализировать класс, а затем заморозить его значение аргумента - PullRequest
1 голос
/ 10 февраля 2012

У меня есть class String, который представляет динамический массив characters, который нельзя изменить после инициализации.Поэтому мне нужно инициализировать его, а затем предотвратить дальнейшие изменения аргумента.

Как я могу это сделать?:)

Ответы [ 3 ]

4 голосов
/ 10 февраля 2012

Вы делаете свой член const.И вы делаете инициализацию в конструкторе.

class String
{
   const char* const _buff;  //both the contents and the pointer are const
public:
   String (const char* buff);
};

String::String(const char* buff) : _buff(buff)
{
}

РЕДАКТИРОВАТЬ: Как указал @ildjarn, будьте особенно внимательны при использовании неизменяемых объектов.Вы должны быть уверены, что это то, что вам действительно нужно.Вы не сможете использовать их в стандартных контейнерах или выполнять логическое копирование.

1 голос
/ 10 февраля 2012

Установите массив innerstring в качестве частного const и предоставьте только метод get.

0 голосов
/ 10 февраля 2012

Надеюсь, это поможет:

#include <iostream>
#include <cstring>
#include <vector>

class String {
public:

  // Default constructor and 
  // conversion constructor
  String(const char *p = "") {
    data_ = new char[strlen(p)+1];
    strcpy(data_, p);
  }


  // copy constructor
  String(const String& rhs) {
    data_ = new char[strlen(rhs.data_)+1];
    strcpy(data_, rhs.data_);
  }

  ~String() {
    delete[] data_;
  }

  String& operator=(const String&rhs) {
    String temp(rhs);
    std::swap(temp.data_, data_);
    return *this;
  }

  // operator[] is the only data access, and it returns "const&"
  const char&operator[](std::size_t i) { return data_[i]; }

private:
  char *data_;
};



int main () {
  String a("Hello");
  String b("Goodbye");
  std::vector<String> v;

  v.push_back("a");
  v.push_back("b");
  v.push_back(&b[4]);

  b = a;

  std::cout << &b[0] << "\n";
  std::cout << &v[2][0] << "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...