адаптер — ошибка c ++: вызов нестатической функции-члена без аргумента объекта

Я унаследовал некоторый код, который использует шаблон адаптера класса, и я хочу преобразовать его, чтобы использовать шаблон адаптера объекта.

Пользовательский класс 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 ++ — не самый сильный мой язык); возможно я пропускаю что-то простое.

3

Решение

Итак, если вы сделали 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;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector