指向具有指针成员的对象的指针

时间:2012-10-18 05:50:25

标签: c++ pointers

指针在c ++中是否合法?我遇到过这个问题: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()可以写吗?有没有更好的方式来表示这个表达式?

4 个答案:

答案 0 :(得分:2)

这是完全有效的。但是你使用“指向指针的指针”一词是错误的。

该术语表示双指针,如**P指针,用于保存另一个指针的地址

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

中创建

答案 1 :(得分:0)

非法,“a”是私人的。 “foo”也是如此。

如果纠正为“公开”,那么它们就是合法的结构。

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

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;
}

答案 2 :(得分:0)

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

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

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

虽然您可能希望重新考虑直接访问变量,而是让getter / setter访问私有成员变量。

答案 3 :(得分:-1)

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

的指针的情况下