我继承了一些使用类适配器模式的代码,我想将其转换为使用对象适配器模式。
自定义类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
的私有继承(我这样做,因为 - 如果我错了,请纠正我 - 对象适配器模式使用组合而不是实现的继承),语句{{1导致错误“调用非静态成员函数而没有对象参数”。
所以我不确定如何做到这一点。这是我第一次处理适配器模式(而C ++不是我最强的语言);也许我忽略了一些简单的事情。
答案 0 :(得分:2)
假设您已将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;
}