2016-03-08 4 views
2

Существует три способа создания неизменяемого объекта.C++ Неизменность классов и плюсы/минусы

Способ 1: неотъемлемо неотъемлемые члены класса, внутренне и внешне не поддающиеся изменению.

#ifndef INTERNALLY_IMMUTABLE_HPP 
#define INTERNALLY_IMMUTABLE_HPP 

#include <string> 

class internally_immutable 
{ 
public: 
    internally_immutable(const std::string & str) 
    : str_(str) 
    { 
    } 

    std::string get_str() const 
    { 
     return str_; 
    } 

private: 
    const std::string str_; 
}; 

#endif 

Метод 2: неотъемлемо неотъемлемые члены класса, внешне неизменяемые.

#ifndef EXTERNALLY_IMMUTABLE_HPP 
#define EXTERNALLY_IMMUTABLE_HPP 

#include <string> 
#include <vector> 

class externally_immutable 
{ 
public: 
    externally_immutable(const std::string & str) 
    : str_(str) 
    { 
    } 

    std::string get_str() const 
    { 
     return str_; 
    } 

private: 
    std::string str_; 
}; 

#endif 

Способ 3: тип неизменны, частично извне неизменяемым, а кто-то может обойти вашу ЬурейеЕ.

#ifndef TYPED_IMMUTABLE_HPP 
#define TYPED_IMMUTABLE_HPP 

#include <string> 
#include <vector> 

typedef const typed_mutable typed_immutable; 

class typed_mutable 
{ 
public: 
    typed_mutable(const std::string & str) 
    : str_(str), 
    vec_() 
    { 
    } 

    void set_str(const std::string & str) 
    { 
     str_ = str; 
    } 

    std::string get_str() const 
    { 
     return str_; 
    } 

private: 
    std::string str_; 
}; 

#endif 

Каковы плюсы и минусы каждого неизменяемого типа? Оптимизация компилятора, помехи, использование каждого типа ... Существуют ли другие способы создания неизменяемых объектов на C++? Каков рекомендуемый или наиболее распространенный способ создания этих неизменяемых классов на C++?

+0

Не имеет смысла возвращать значения 'const' из функций-членов. В любом случае это не влияет на изменчивость объекта, на который вызывается функция-член. – juanchopanza

+0

@juanchopanza это может не иметь смысла с конечной точки пользователя, но как насчет конечной точки компиляции? –

+0

Я не знаю, что значит иметь смысл «с точки зрения компиляции». – juanchopanza

ответ

0

вы можете сделать неизменный класс, когда вы сделаете свой конструктор закрытым, в этом случае ваш производный класс не сможет получить доступ к базовому классу. подобный как. класс externally_immutable { частного: externally_immutable (Const станд :: строка & ул) : str_ (ул) {} // делать константные строки str_; };

Смежные вопросы