当我尝试编译这个简短的程序时:
#include <iostream>
class Foo {
public:
friend int getX() const;
private:
int x;
};
int Foo::getX() const { return this->x; }
int main() {
Foo foo;
std::cout << foo.getX() << std::endl;
}
我收到这些错误:
C:\>gcc test.cpp
test.cpp:6:23: error: non-member function 'int getX()' cannot have cv-qualifier
friend int getX() const;
^
test.cpp:12:17: error: no 'int Foo::getX() const' member function declared in cl
ass 'Foo'
int Foo::getX() const { return this->x; }
^
test.cpp: In function 'int main()':
test.cpp:16:22: error: 'class Foo' has no member named 'getX'
std::cout << foo.getX() << std::endl;
^
为什么我不能在此getX()
标记const
?它没有修改Foo
的状态或任何内容,所以我应该能够这样做。
答案 0 :(得分:2)
您正在使用friend
和const
声明功能。将两者放在一起是没有意义的:friend
对成员函数没有意义,因为成员函数已经可以访问类的私有部分。 const
对非成员函数没有意义,因为他们没有固有的对象可以保证不会修改。
答案 1 :(得分:1)
问题在于您的friend
声明。它没有声明该类的成员,它声明一个外部非成员函数是该类的朋友。非成员函数不能声明为const
。这就是第一个编译器错误抱怨的内容。第二个编译器错误是由于您声明友谊而不是成员,因此成员正文的定义语法无效 - 没有声明成员,因此您无法定义成员的主体。
您正在尝试创建成员方法,因此您需要删除friend
说明符(没有理由将成员声明为朋友):
class Foo {
public:
int getX() const;
private:
int x;
};
答案 2 :(得分:1)
朋友函数无权访问this
,this
只能作为该类成员的函数访问。 {{1}}引用该类的特定实例,并且本质上的友元函数虽然在类文件中定义,但不是成员函数。