我正在进行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;
}
除了n没有资源,也许对象应该通过Base类指针创建,还有什么可能是错的?
当我运行它时,我收到此错误:
error: 'virtual int Base::getN()' is private
答案 0 :(得分:14)
默认情况下,类 1 的每个成员都是private
,基类中的getN
被声明为private
。
将getN
公开为:
class Base {
friend class SubClass;
int n;
public: //<--------------------- you forgot this
virtual int getN()
{
return n;
}
};
1。我的意思是,用关键字class
定义的类。请注意,根据C ++标准,可以使用关键字struct
和union
定义类。
编辑:
如果您认为SubClass
是Base
的朋友,那么它可以从外部访问Base
的私人成员,那就错了。 friend
表示SubClass
的成员函数可以访问Base
类的私有成员。
但是,如果您main()
成为Base
的朋友,那么您的代码就可以运作:
class Base {
friend int main(); //make main() friend of Base
//...
};
现在来自main()
,可以访问Base
的所有私人成员!
请参阅此演示:http://www.ideone.com/UKkCF
答案 1 :(得分:4)
你的编译器应该给你一些线索......
% 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’
答案 2 :(得分:3)
错误消息显示全部:getN
隐式private
,这是C ++中类的默认值。
使用
class Base {
// ...
public:
virtual int getN();
};
使其成为可公开访问的成员。 SubClass
是Base
的朋友而getN
的朋友通过Subclass
这里的问题来调用的事实 - getN
只是简单的事实无法从main()
内部访问,从中调用它。不过,您可以main
friend
为Base
。
答案 3 :(得分:2)
功能
virtual int getN() { /*...*/ }
在您的Base类中是私有的(默认情况下)。因为它在你的SubClass中没有超载,所以当你在main函数中调用它时它会保持私有状态。
如果您想使其合法化,请在课堂上公开:
public:
virtual int getN() { /*...*/ }
答案 4 :(得分:2)
class Base {
friend class SubClass;
int n;
public:
virtual int getN()
{
return n;
}
};
类成员默认为私有
答案 5 :(得分:0)
您不能在将其设为公开状态之前访问getN()