c ++错误:在没有对象参数的情况下调用非静态成员函数

时间:2013-07-16 02:10:53

标签: c++ adapter clang

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

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

1 个答案:

答案 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;
}