使用按引用调用时,不能在没有对象的情况下调用成员函数 const
Cannot call member function const without object when using call by reference
嗨,我在"cstring.h"中定义了以下类:
namespace BaseTypes {
class CString {
private:
character *ptrCString = NULL; //Init pointer always with NULL!
character *createSafeCString(character cStringToCheck[]);
size_t inline length(const CString &cString) const;
size_t inline internalLength();
public:
CString(character cstring[]);
~CString();
integer length();
CString& operator+=(const CString& rhs);
friend CString operator+(CString lhs, const CString &rhs);
};
}
和"cstring.cpp":
namespace BaseTypes {
//Constructor with a char array
CString::CString(character cstring[]) {
ptrCString = createSafeCString(cstring);
}
...
size_t inline CString::length(const CString &cString) const {
return strlen(cString.ptrCString);
}
...
CString operator+(CString lhs, const CString &rhs) {
size_t thisSize = lhs.internalLength();
size_t rhsSize = CString::length(rhs);
character *newCString = new character[thisSize + rhsSize + 1];
strncpy(newCString, lhs.ptrCString, thisSize);
strncat(newCString, rhs.ptrCString, rhsSize);
newCString[thisSize + rhsSize] = ' ';
CString *cString = new CString(newCString);
return *cString;
}
}
这给了我一个编译错误:
In function 'BaseTypes::CString BaseTypes::operator+(BaseTypes::CString, BaseTypes::CString&)':
C:SourcesProjektebasetypescstring.cpp:78:45: error: cannot call member function 'size_t BaseTypes::CString::length(const BaseTypes::CString&) const' without object size_t rhsSize = CString::length(rhs);
我被困住了。我没有任何头绪。我错过了什么。这不是对常量CString的引用吗?
问题是您已将length()
声明为成员函数,并且成员函数期望对给定对象进行操作。 通过 CString::length(rhs)
调用带有参数的成员函数会将 rhs
的值作为参数传递给函数,但不会告诉length
方法实际调用该方法的对象,因此没有this
指针是有意义的。 但是,您似乎不需要在length
函数中使用this
的值,因此您可以将该方法声明为static
,然后通过CString::length(rhs)
调用它将按照您的预期工作。
一个更以 OO 为中心的解决方案是将 length
保留为不带参数的非静态成员函数,并使其在this
上运行而不是显式参数,它可以低于 rhs.length()
. 然而,这只是一个风格问题,并不比你似乎已经习惯的更命令式的方法更正确。
相关文章:
- 是什么让放置新调用对象的构造函数?
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 如何从构造函数副本 T(const T&)调用对象 T?
- C++17 如何保存泛型可调用对象以供以后使用
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在C++中将可调用对象放入地图中?
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 广义 std::function (std::any 表示可调用对象)
- c++ 替换调用对象方法的宏函数
- 将可调用对象传递给采用 std::function 的构造函数
- 双指针在使用 new 时不调用对象构造函数
- 可调用对象作为默认模板参数
- 只需调用对象即可获取对象数据
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- 如何将当前替代类型的 std::variant 传递给可调用对象?
- C++对象本身作为参数调用对象的方法
- 从移交的类调用对象