C++ 使用引用调用时,无法在没有对象的情况下调用成员函数const

C++ 使用引用调用时,无法在没有对象的情况下调用成员函数const,c++,pass-by-reference,C++,Pass 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.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] = '\0';
        CString *cString = new CString(newCString);
        return *cString;
    }
}
这给了我一个编译错误:

In function 'BaseTypes::CString BaseTypes::operator+(BaseTypes::CString, BaseTypes::CString&)':
C:\Sources\Projekte\base\types\cstring.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);

我被卡住了。我没有任何线索。我错过了什么。这不是对const CString的引用吗?…

问题是您已将
length()
声明为成员函数,并且成员函数期望对给定对象进行操作。通过
CString::length(rhs)
调用带有参数的成员函数时,会将
rhs
的值作为参数传递给函数,但不会告诉
length
方法实际调用该方法的对象,因此此
指针没有意义。。但是,在
length
函数中,您似乎不需要
this
的值,因此您可以将该方法声明为
static
,然后通过
CString::length(rhs)
调用它,这将如您所期望的那样工作


一个更以面向对象为中心的解决方案是将
length
保留为不带参数的非静态成员函数,并使其在
这个
上操作,而不是显式参数,它可以如下所示为
rhs.length()
。然而,这只是一个风格问题,实际上并不比您已经习惯的更为迫切的方法更为正确。

我这里没有C<如果
length
是静态成员,则code>CString::length(rhs)
可以工作,但它不是。错误消息有什么不清楚的地方?整个私有
size\t内联长度(const-CString&CString)常量精巧装置没有任何意义-为什么不干脆
public:size\u t inline length()const完成了…它不是公共的,因为我不想让它成为公共的。类CString应该只有几个公共访问的方法。