如何调用一个类函数,但使用另一个类对象

时间:2019-02-13 13:48:08

标签: c++

因此,我最近刚刚了解了C ++中的friendthis,当时我正在观看面向C ++和编程初学者的教程。我对this语法或其他语法感兴趣,他说这是一个指针,并存储对象的地址,因此我进行了实验。

有可能使用来自不同类函数的不同类对象吗?如果可以,怎么办?

无论如何这里是代码

||
\/

#include <iostream>

    class A
    {
    public:
        void Aprint()
        {
            std::cout << "It is A " << this->Number << std::endl;
        }
    private:
        int Number = 1;
    };

    class B
    {
    public:
        void Bprint()
        {
            std::cout << "It is B " << std::endl;
        }
    private:
        int Number = 0;

        friend void A::Aprint();
    };

    int main()
    {
       A Abo;
       B Bbo;

       Abo.Aprint();
    }

当我使用B类对象时,我希望它打印0。 在调用或编译时,在0之后显示show "It is A"。原因我想看看使用Bbo.Aprint()时会发生什么。我想知道thisfriend的工作方式。还在尝试。

Before it was `Bbo.Aprint()` just edited.

3 个答案:

答案 0 :(得分:2)

我认为您正在尝试模仿带有朋友声明的继承。据我了解,朋友声明允许您从朋友类或函数访问A类的私有成员。如果您希望B类能够调用A类函数,我认为您应该使用继承和虚函数。

也许这对您有帮助。

https://www.ibm.com/support/knowledgecenter/SS2LWA_12.1.0/com.ibm.xlcpp121.bg.doc/language_ref/cplr042.html

答案 1 :(得分:1)

您不能使用另一个类的实例调用一个类的成员函数(除非这些类通过继承关系关联):

Abo.Aprint(); // OK
Bbo.Aprint(); // Not OK

答案 2 :(得分:1)

有一种方法可以做到这一点。为此,您必须将A::Aprint的签名更改为void Aprint(const B&);

#include <iostream>

class B; // forward declaration

class A
{
    public:
    void Aprint(const B&);
    private:
    int Number = 1;
};

class B
{
    public:
    void Bprint()
    {
        std::cout << "It is B " << std::endl;
    }
    private:
    int Number = 0;

    friend void A::Aprint(const B&);
};

void A::Aprint(const B& b) {
    std::cout << "It is A " << b.Number << std::endl;
}

int main()
{
    A Abo;
    B Bbo;

    Abo.Aprint(Bbo);
}

在此示例中,因为A::Aprint()是B的朋友,所以Aprint()甚至可以访问Bbo的私有成员(即使是私有的,请参见b.Number也可以)