gpt4 book ai didi

C++ 错误 : call to non-static member function without an object argument

转载 作者:太空狗 更新时间:2023-10-29 21:45:24 31 4
gpt4 key购买 nike

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

自定义类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 的私有(private)继承(我这样做是因为——如果我错了请纠正我——对象适配器模式使用组合而不是实现的继承) ,语句 std::string::operator=(s); 导致错误“调用不带对象参数的非静态成员函数”。

所以我不太确定如何完成此操作。这是我第一次处理适配器模式(C++ 不是我最擅长的语言);也许我忽略了一些简单的事情。

最佳答案

所以假设你已经使 std::string 成为你的类的成员

class string : public StringInterface
{
...
std::string m_str;
...
};

然后你应该将你所有的操作修改为你现在的成员 std::string(但它是私有(private)的......好吧)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;
}

关于C++ 错误 : call to non-static member function without an object argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666911/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com