3

我继承了一些使用类适配器模式的代码,我想将其转换为使用对象适配器模式。

自定义类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++ 不是我最擅长的语言);也许我忽略了一些简单的事情。

4

1 回答 1

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;
}
于 2013-07-16T02:30:37.493 回答