C++;面向对象问答题 我正在做一个C++问答,我需要说下面的代码有什么错误: class Base { friend class SubClass; int n; virtual int getN() { return n; } }; class SubClass: public Base { public: SubClass() {} SubClass(const SubClass& s) {} }; int main() { SubClass sc; if(sc.getN() <= 5) { int x = sc.getN(); } return 0; } 错误消息说明: GETN/CODE>隐式私下< /代码>,这是C++类中的默认值。p>

C++;面向对象问答题 我正在做一个C++问答,我需要说下面的代码有什么错误: class Base { friend class SubClass; int n; virtual int getN() { return n; } }; class SubClass: public Base { public: SubClass() {} SubClass(const SubClass& s) {} }; int main() { SubClass sc; if(sc.getN() <= 5) { int x = sc.getN(); } return 0; } 错误消息说明: GETN/CODE>隐式私下< /代码>,这是C++类中的默认值。p>,c++,C++,使用 使其成为可公开访问的成员。SubClass是Base的朋友,而getN是通过SubClass的实例调用的,这一事实在这里并不重要-getN是无法从main()中访问的,因为它是从main()调用的。但是,您可以使main成为Base的friend。默认情况下,类1的每个成员都是private,基类中的getN被声明为private 将getN公开为: class Base { friend class SubClass; int n; public: //<-----

使用


使其成为可公开访问的成员。
SubClass
Base
的朋友,而
getN
是通过
SubClass
的实例调用的,这一事实在这里并不重要-
getN
是无法从
main()
中访问的,因为它是从
main()调用的。但是,您可以使
main
成为
Base
friend

默认情况下,类1的每个成员都是
private
,基类中的
getN
被声明为
private

getN
公开为:

class Base {
    friend class SubClass;
    int n;
public: //<--------------------- you forgot this
    virtual int getN()
    {
        return n;
    }
};
现在,从
main()
,可以访问
Base
的任何私有成员

请参阅此演示:

函数

virtual int getN() { /*...*/ }
在基类中是私有的(默认情况下)。因为它在子类中没有重载,所以当您在主函数中调用它时,它保持私有

如果要使其合法,请在类中公开:

public:
    virtual int getN() { /*...*/ }

默认情况下,类成员是私有的

编译器应该为您提供一些线索

% g++ -Wall -Wextra -Wshadow -Weffc++ test.cpp
test.cpp:1: warning: ‘class Base’ has virtual functions but non-virtual destructor
test.cpp:10: warning: ‘class SubClass’ has virtual functions but non-virtual destructor
test.cpp: In constructor ‘Base::Base()’:
test.cpp:1: warning: ‘Base::n’ should be initialized in the member initialization list
test.cpp: In constructor ‘SubClass::SubClass()’:
test.cpp:12: note: synthesized method ‘Base::Base()’ first required here 
test.cpp: In copy constructor ‘SubClass::SubClass(const SubClass&)’:
test.cpp:13: warning: base class ‘class Base’ should be explicitly initialized in the copy constructor
test.cpp: At global scope:
test.cpp:13: warning: unused parameter ‘s’
test.cpp: In function ‘int main()’:
test.cpp:4: error: ‘virtual int Base::getN()’ is private
test.cpp:19: error: within this context
test.cpp:4: error: ‘virtual int Base::getN()’ is private
test.cpp:21: error: within this context
test.cpp:21: warning: unused variable ‘x’

在将getN()设置为公共之前,您无法访问它

,因此这就是问题所在,getN()应该是公共的。但我对此感到困惑,如果子类是Base的朋友,他对私有成员没有访问权限吗?或者只在派生类中可访问,而不是在main中,我guess@vBx:使
main()
成为
Base
的朋友,那么您的代码就可以工作了。有关解释,请参见编辑。@Nawaz:是的,如果子类是base的朋友,那么只有子类才能访问私有成员,没有其他人,我犯了一个愚蠢的错误:)这段代码在概念上有太多错误,甚至那些编译器消息也不能涵盖所有内容。例如:
SubClass
a
friend
?你的编译器可能…我的编译器只给出最后2个,我使用MinGW@LumpN这是一个测验,不是应该是这样的吗@伦彭:我只是说线索,不是答案。这毕竟是一个[家庭作业]问题@vBx:尝试提高您的警告级别以获得更多反馈。即使考虑到这是一个测验问题,这段代码中的主要错误是它完全没有意义。反过来试试:这段代码的意义是什么?它既不做任何定义,也不代表任何有价值的概念。
virtual int getN() { /*...*/ }
public:
    virtual int getN() { /*...*/ }
class Base {
    friend class SubClass;
    int n;
public:
    virtual int getN()
    {
        return n;
    }
};
% g++ -Wall -Wextra -Wshadow -Weffc++ test.cpp
test.cpp:1: warning: ‘class Base’ has virtual functions but non-virtual destructor
test.cpp:10: warning: ‘class SubClass’ has virtual functions but non-virtual destructor
test.cpp: In constructor ‘Base::Base()’:
test.cpp:1: warning: ‘Base::n’ should be initialized in the member initialization list
test.cpp: In constructor ‘SubClass::SubClass()’:
test.cpp:12: note: synthesized method ‘Base::Base()’ first required here 
test.cpp: In copy constructor ‘SubClass::SubClass(const SubClass&)’:
test.cpp:13: warning: base class ‘class Base’ should be explicitly initialized in the copy constructor
test.cpp: At global scope:
test.cpp:13: warning: unused parameter ‘s’
test.cpp: In function ‘int main()’:
test.cpp:4: error: ‘virtual int Base::getN()’ is private
test.cpp:19: error: within this context
test.cpp:4: error: ‘virtual int Base::getN()’ is private
test.cpp:21: error: within this context
test.cpp:21: warning: unused variable ‘x’