代码之家  ›  专栏  ›  技术社区  ›  Dennis Miller

C++访问朋友类->成员->公共方法?

  •  1
  • Dennis Miller  · 技术社区  · 14 年前

    下面的代码在C++中是合法的吗?访问友元类成员公共方法?我知道这听起来很混乱,最好的方法是用代码来显示它。我想知道testclassc::method()在下面的代码中是否有效?

    我已经编译了(g++)并且它可以工作,但是,我遇到了这样一种情况:它在testclassc::method()的其他机器/发行版上产生了一个分段错误。这让我想知道这个-gt;ClasujpTr& gt;Clasb.Mult.方法()在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;
    }
    
    3 回复  |  直到 14 年前
        1
  •  4
  •   Michael Aaron Safyan    14 年前

    public/private/protected访问器修饰符在编译时强制执行,而不是在运行时强制执行。segfault是运行时错误,而不是编译时错误。因此,在将来,如果您得到一个segfault,您可以确定它与访问级别无关。听起来您的困惑是基于访问修饰符是否直接、间接、传递等等。访问修饰符以最简单和直接的方式工作:它们只直接应用于该类中声明的函数或变量,并通过给定的类控制对这些项的访问。一旦您有权访问这样的项目,进一步的访问完全由该项目自己的访问修饰符决定。

    SegFault通常表示内存访问非法。如果遇到SegFaults,请查看取消引用指针的位置(每当有*X或X->Y时)。SegFaults的常见原因包括取消对空值的引用、由一个数组访问关闭以及通过指针使用一个对象,在该指针中,相关对象已被超出范围删除。

        2
  •  2
  •   TheUndeadFish    14 年前

    对。友元规范允许testclasc访问testclasa的任何受保护或私有成员。这意味着它可以访问ClassB成员。之后,标准规则适用于testclasc可以对该成员做什么。而且由于method()是公共的testclass,所以可以调用它,就像它通过任何其他方式获得了testclassb实例一样。


    关于SEG故障:

    public/protected/private/friend都是编译时限制。它们不应影响运行时代码的操作。

    是这个吗? 准确的 对SEG故障进行编码?或者只是概念上类似的东西?如果不是完全相同的代码,那么您是否验证了所有指针在有问题的代码中都是有效的?

        3
  •  1
  •   Chubsdad    14 年前

    只要类是明确可访问的,调用任何类的公共方法都是有效/合法的,并且我们有一个有效的对象表达式来访问它。事实上,这就是它最初被公开的原因。你的代码对我来说很好。