使用按引用调用时,不能在没有对象的情况下调用成员函数 const

Cannot call member function const without object when using call by reference

本文关键字:调用 对象 情况下 函数 成员 const 引用 不能      更新时间:2023-10-16

嗨,我在"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() . 然而,这只是一个风格问题,并不比你似乎已经习惯的更命令式的方法更正确。