如何从传递到对象中的对象内部访问对象的类属性?

3

我创建了一个接受另一个对象作为引用的类。问题是...我想访问传递对象内部对象的一些属性。我真的只需要两个对象之间的双向通信,但我不确定如何最好地完成这项工作。

class A {
    private:
        void someMethod();
    public:
        A();
};

class B {
    protected:
        char someAttribute;
        A& a; 
    public:
        B(A& a);
};

someMethod() {
    char newAttribute = someAttribute;
}

我希望 someMethod 能够访问 someAttribute,但我不确定这是否是解决问题的正确方法。我在主函数中将对象传递给了另一个对象。如果我直接在另一个类中实例化该类,我不确定会发生多少变化。

我还尝试过将 A 设为子类,但这并没有起作用,而且我认为这会创建两个独立的父类实例,这对我来说没有任何意义。

然后我尝试使用 friend。

class A {
    private:
        void someMethod();
    public:
        A();
};

class B {
    protected:
        char someAttribute;
        friend class A;
        A& a; 
    public:
        B(A& a);
};

someMethod() {
    char newAttribute = someAttribute;
}

我不确定正确的方法,但上面的代码无效。

如果有人有更好的实现这段代码的方法,我愿意倾听。


你如何调用 someMethod() - Thomas Sablik
为什么你不为此定义公共的getter方法? - ΦXocę 웃 Пepeúpa ツ
2
这似乎是一个XY问题类型的问题。如果您展示出实际问题,那将更有帮助。 - bitmask
我想在someMethod内访问someAttribute。 - Joemoor94
2个回答

1
你可以传递一个引用(指针):

class B;

class A {
    private:
        void someMethod();
        B *b = nullptr;
    public:
        A();
        void setRef(B &b) {this->b = &b;}
};

class B {
    friend A;
    protected:
        char someAttribute;
        A& a; 
    public:
        B(A& a) : a(a) {this->a.setRef(*this);}
};

void A::someMethod() {
    if (b)
    char newAttribute = b->someAttribute;
}


如果变得更加复杂,您可以使用 weak_ptr

1
B::someAttribute 仍然无法从 A::someMethod() 访问,因为它仍然是 protected 的,而且 A 不是 B 的友元。 - bitmask

0

如果您没有其他限制,也可以采用以下方式。使用类的前向声明。

   class B
    {
    protected:
        char someAttribute;
    public:
        friend class A;
    };
    
    class A
    {
    private:
         void someMethod(B b);
    public: 
    };
    
    void A::someMethod(B b)
    {
        char newAttribute = b.someAttribute;
    }

我需要将b作为引用传递吗? - Joemoor94
你可以按照自己的方式进行,@JoeyMoore。 - Nilesh Solanki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接