2012-02-10 3 views
1

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

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

+1

Wise ослы называют эти классы «неизменными» – guitarflow

+1

Этого вид неизменного класса называется «неизменные» –

ответ

4

Вы делаете ваш член 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) 
{ 
} 

EDIT: Как указал @ildjarn, проявляйте особую осторожность при использовании неизменяемых объектов. Вы должны быть уверены, что это то, что вам действительно нужно. Вы не сможете использовать их в стандартных контейнерах или иметь логическое копирование.

+1

Создание элементы данных сопзИте просто глупо - это делает ваш класс не- который, среди прочего, означает, что вы не можете использовать экземпляры вашего класса в стандартных контейнерах C++ 03. Более простое решение состоит в том, чтобы предоставлять только функции-члены-члены для доступа к указанным членам данных и оставлять сами члены данных неконстантными. – ildjarn

+0

Хорошо спасибо, но как я могу создать конструктор копирования для этого класса? И деструктор? :) – Vidak

+0

@Vidak Вы хотите, чтобы член остался прежним или нет? –

1

Задайте массив innerstring как частный const и выставляйте только метод get.

0

Надеется, что это помогает:

#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"; 
} 
Смежные вопросы