以下代码在C ++中是否合法。访问朋友类成员的公共方法?我知道这听起来令人困惑,展示它的最好方法是在代码中。我想知道TestClassC :: Method()在下面的代码中是否有效?
我已编译(g ++)并且它有效,但是,我遇到了一种情况,它在TestClassC :: Method()的其他机器/发行版上产生分段错误。这让我想知道这是否 - > classA_Ptr-> classB.Method();在C ++中是合法的。
#include <iostream>
using namespace std;
class TestClassB
{
public:
TestClassB(void){};
~TestClassB(void){};
void Method(void){
cout << "Hello Again" << endl;
}
};
class TestClassC; //Forward Declaration
class TestClassA
{
friend class TestClassC;
public:
TestClassA(void){};
~TestClassA(void){};
private:
TestClassB classB;
};
class TestClassC
{
public:
TestClassC(TestClassA* a_Ptr){
this->classA_Ptr = a_Ptr;
}
~TestClassC(void){};
void Method(void){
//Is this Valid/Legal ???
this->classA_Ptr->classB.Method();
}
private:
TestClassA* classA_Ptr;
};
int main()
{
cout << "Hello world!" << endl;
TestClassA testClassA;
TestClassC classC(&testClassA);
classC.Method();
return 0;
}
答案 0 :(得分:4)
公共/私有/受保护的访问者修饰符在编译时强制执行,而不是在运行时强制执行。 SEGFAULT是运行时错误,而不是编译时错误。因此,在将来,如果您获得SEGFAULT,您可以确定它与访问级别无关。听起来你的混淆是基于访问修饰符是直接,间接,传递等应用的。访问修饰符以最简单和直接的方式工作:它们只是直接应用于已声明的函数或变量在该类中并通过给定类控制对这些项的访问。一旦您有权访问此类项目,则进一步访问仅由该项目自己的访问修饰符确定。
SEGFAULT通常表示非法内存访问。如果您遇到SEGFAULTS,请查看您取消引用指针的位置(只要您有* X或X-> Y)。 SEGFAULTS的常见原因包括取消引用NULL,逐个数组访问,以及通过指针使用对象,其中有问题的对象已经超出范围而被删除。
答案 1 :(得分:2)
是。友元规范使TestClassC可以访问TestClassA的任何受保护或私有成员。这意味着它可以访问classB成员。之后,正常规则适用于TestClassC可以对该成员执行的操作。因为Method()是公共的,所以允许TestClassC调用它,就好像它通过任何其他方式获得了TestClassB实例的支持一样。
关于seg错误:
Public / protected / private / friend都是编译时限制。它们应该在运行时对代码的操作没有影响。
这个完全代码是否会出错?或者它只是概念上类似的东西?如果它不是完全相同的代码,那么您是否已经验证所有指针在有问题的代码中实际上是否有效?
答案 2 :(得分:1)
只要该类明确可访问,调用任何类的公共方法都是有效/合法的,并且我们有一个有效的对象表达式来访问它。事实上,这就是为什么它首先被公之于众。你的代码对我来说没问题。