Я унаследовал некоторый код, который использует шаблон адаптера класса, и я хочу преобразовать его, чтобы использовать шаблон адаптера объекта.
Пользовательский класс string
адаптируется std::string
и это в MyString
Пространство имен.
Вот фрагмент того, как выглядит код, прежде чем я его изменю.
// mystring.h
namespace MyString
{
// StringInterface is the new (abstract) interface that the client will use.
// Inheriting the implementation of std::string to build on top of it.
class string : public StringInterface, private std::string
{
...
};
}
// mystring.cpp
namespace MyString
{
...
string& MyString::string::operator=(const string& s) // copy assignment operator
{
if (this != &s) std::string::operator=(s);
return *this;
}
...
}
Однажды я уберу частное наследство std::string
(что я делаю, потому что — поправьте меня, если я ошибаюсь — шаблон адаптера объекта использует композицию, а не наследование реализации), утверждение std::string::operator=(s);
вызывает ошибкувызов нестатической функции-члена без аргумента объекта».
Так что я не совсем уверен, как это сделать. Я впервые имею дело с шаблоном адаптера (а C ++ — не самый сильный мой язык); возможно я пропускаю что-то простое.
Итак, если вы сделали std::string
член вашего класса
class string : public StringInterface
{
...
std::string m_str;
...
};
Затем вы должны изменить все свои операции на когда-то «унаследованных» (но это в частном порядке … хорошо) std::string
вашему члену сейчас std::string
, который в моем примере, является m_str
, Например, вместо того, чтобы делать std::string::size()
, ты должен сделать m_str.size()
,
Для тебя operator=()
Вы должны сделать это следующим образом:
string& MyString::string::operator=(const string& s) // copy assignment operator
{
if (this == &s) return *this; // So you'll only have to do this test once
m_str = s.m_str; // instead of std::string::operator=(s);
// ...
return *this;
}
Других решений пока нет …