【问题标题】:Pointer to an object that has a pointer member指向具有指针成员的对象的指针
【发布时间】:2012-10-18 05:50:24
【问题描述】:

在 c++ 中指向指针的指针合法吗?我遇到了这个 SO 问题:Pointer to Pointer to Pointer

但是,如果它是合法的 c++,答案还不清楚。假设我有:

class A{
public:
    void foo(){
        /* ect */
    }
};

class B{
public:
    A* a;
    /* ect */
};

void Some_Func() {
    B *b;

    // besides this looking ugly, is it legal c++?
    b->a->foo();
};

b->a->foo() 行可以写吗?有没有更好的方法来表示这个表达式?

【问题讨论】:

  • 除了fooa 在他们的每个类中都是私有的(你必须将它们公开才能工作),为什么不可以呢?实际上,它甚至不是特别难看。
  • 为什么不呢?指针是一种类型,就像任何其他类型一样。
  • 它们完全没问题,但是你不能直接从 'b' (b->a) 访问 'a',因为 a 是 B 类的私有成员。否则它应该可以工作。
  • 你这里的不是指向指针的指针。它是一个指向具有指针成员的对象的指针。
  • 它们应该是公开的......我做了更改。

标签: c++ pointers


【解决方案1】:

这是完全正确的。但是您使用的术语“指向指针的指针”是错误的。

该术语表示像**P这样的双指针,一个保存另一个指针地址的指针

但你的情况是指针(A类)是一个类的成员,其指针(B类)由你在some_func中创建

【讨论】:

  • “b”是B类的指针,其中保存了指向A类的指针。
  • 感谢您纠正我对“指向指针的指针”一词的使用。
【解决方案2】:

这是合法的,但在您的示例中,您的程序将崩溃(如果您可以编译它,因为您的成员是私有的),因为您没有创建 B 的实例

void Some_Func() {
    B *b;  // uninitialized B ptr  should be   B* b = new B;

    // legal
    b->a->foo();
};

尽管您可能想重新考虑直接访问变量,而是使用 getter/setter 来访问私有成员变量。

【讨论】:

    【解决方案3】:

    非法,“a”是私有的。 “富”也是如此。

    如果更正为“公共”,则它们是合法的构造。

    从您的代码中很难找到“更好”的方法。但是您可以修改代码以使代码看起来更清晰:

    class A{
    public:
        void foo(){ cout << "Work";}
    };
    
    class B{
    private:
        A *a;
    public:
        A& getA(){
           return *a;
        }
    };
    
    void SomeFunction()
    {
        B *b = new B();
        B& bRef = *b;
        bRef.getA().foo(); //better looking code? 
            delete b;
    }
    

    【讨论】:

      【解决方案4】:

      是的,但是你必须使用指向指针的指针,如**P
      实际上,如果我们想要访问一个持有另一个指针的指针,那么我们可以这样做。这在 c++ 中是允许的,但请记住仅在您分配了指向pointer p的指针的情况下@

      【讨论】:

      • “仅在公开的情况下”是什么意思?您在答案中描述的是指向指针的指针,但为此您不需要提问者最初提出的class Aclass B 构造。
      • 但我已经提到,如果我们分配它们,那么这一行必须是真的 b->a->foo()
      • 如果你还在说原来的例子,你需要一个指针A **a(在那种情况下不确定你的P是什么意思),你调用foo的方式是@ 987654328@ 或 (*a)-&gt;foo() 然后。
      • 不,我的意思是,你当然称变量为p,但首先,在你的文本中你有大写的P和小写的p,而在你谈到的评论中b-&gt;a-&gt;foo()...
      • 这个问题中没有“指向指针的指针”。 class B 的实例包含指向另一个类的实例的指针,但不涉及 ** 类型的变量。
      猜你喜欢
      • 2011-05-17
      • 2014-01-02
      • 2016-02-25
      • 2018-03-24
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多