2013-05-07 52 views
1
  1. Что называют «Прозрачный класс Wrapper» в C++
  2. Почему это называют «Прозрачный ...»
  3. Что такое использование этого (Что не может сделать без «Прозрачного класса Wrapper»).

Цените некоторые концептуальные объяснения.Что такое использование C++ Прозрачный класс Wrapper

ответ

0

Скорее всего, вы имеете в виду класс обертки легкого встроенного (заголовочного файла), хотя я не знаком с термином. Добавление уровня абстракции, подобного этому, полезна при разрешении общего клиентского кода.

+0

Этот термин я получил от '++ стиль Руководство Google C'. он говорит: «Мы требуем, чтобы все конструкторы одиночных аргументов были явными. Исключение составляют классы, которые предназначены для прозрачных оболочек вокруг других классов». FYI http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Explicit_Constructors#Explicit_Constructors. Так что мне любопытно, что такое 'Transparent Class Wrapper' –

4

Прозрачная оболочка класса - это оболочка вокруг типа, где обертка ведет себя так же, как и базовый тип - отсюда «прозрачный».

Чтобы объяснить это, а также ее использование, вот пример, где мы оборачиваем перегрузку operator++()int но выводить сообщение всякий раз, когда он используется (вдохновленный this thread):

class IntWrapper { 
    int data; 
public: 
    IntWrapper& operator++() { 
     std::cout << "++IntWrapper\n"; 
     data++; 
     return *this; 
    } 

    IntWrapper(int i) : data(i) {} 

    IntWrapper& operator=(const IntWrapper& other) 
    { 
     data = other.data; 
     return *this; 
    } 

    bool operator<(const IntWrapper& rhs) const { return data < rhs.data; } 

    // ... other overloads ... 
}; 

Затем мы можем заменить использований из int с IntWrapper если мы выбираем:

for (int i = 0; i < 100; ++i) { /* ... */ } 
// becomes 
for (IntWrapper i = 0; i < 100; ++i) { /* ... */ } 

За исключением последнего напечатает сообщение всякий раз, когда прединкремента называется.

Обратите внимание, что я предоставил неявный конструктор IntWrapper(int i). Это гарантирует, что всякий раз, когда я использую int, где ожидается IntWrapper (например, IntWrapper i = 0), компилятор может молча использовать конструктор для создания IntWrapper из int. Руководство по стилю Google C++, по этой причине, не поддерживает явные конструкторы с одним аргументом, поскольку возможны конверсии, в которых вы не ожидали, что создает угрозу безопасности типов. С другой стороны, это именно то, что вы хотите для прозрачных оболочек классов, потому что вы хотите, чтобы эти два типа были легко конвертируемыми.

То есть:

// ... 
explicit IntWrapper(int i) ... 
// ... 
IntWrapper i = 0; // this will now cause a compile error 
Смежные вопросы