C ++类友谊

时间:2017-02-20 19:18:40

标签: c++

我正在编写代码以通过另一个朋友类访问类的私有成员。以下代码可以使用

// Example program
#include <iostream>
#include <string>
using namespace std;

class Foo
{
    private:
    int a;
    protected:
    public:

    friend class Bar;


    Foo(int x)
    {
        a = x ;
    }
};

class Bar
{
    private:
    protected:
    public:
    int b;

    Bar(Foo& f)
    {
        b = f.a;
        cout << "f.a is " << f.a << endl;
    }

};

int main()
{
    Foo foo(5);
    Bar bar(foo);

    cout << "Value of variable b is " << bar.b << endl;
}

以上代码工作正常。但是,如果我想通过朋友类Foo中的函数访问Bar的私有变量,我无法做到。见下面的代码

#include <iostream>
#include <string>
using namespace std;

class Foo
{
    private:
    int a;
    protected:
    public:

    friend class Bar;


    Foo(int x)
    {
        a = x ;
    }
};

class Bar
{
    private:
    protected:
    public:
    int b;

    Bar(Foo& f)
    {
        b = f.a;
    }
    void printvariable(void)
    {
        cout << "f.a is " << f.a << endl;
    }

};

int main()
{
    Foo foo(5);
    Bar bar(foo);

    cout << "Value of variable b is " << bar.b << endl;
}

我完全理解为什么执行失败

void printvariable(void)
    {
        cout << "f.a is " << f.a << endl;
    }

函数,因为f不在函数范围内。但是,由于我在Foo f的构造函数中传递Bar b,我希望编写的代码允许我访问Foo中的成员而不将Foo f传递给函数再次printvariable()

编写此代码的最有效方法是什么?

3 个答案:

答案 0 :(得分:0)

您可以保留对f的引用。代码应该是:

class Bar
{
    private:
    protected:
    public:
    int b;
    Foo& f_ref;

    Bar(Foo& f)
    :f_ref(f)
    {
        b = f.a;
    }
    void printvariable(void)
    {
        cout << "f.a is " << f_ref.a << endl;
    }

};

TEST!

答案 1 :(得分:0)

你可以这样做,但如果我是你,我会写一些吸气剂,也不是真正推荐的阶级友谊。

<img src="<?php echo base_url('uploads'); ?>/'+ status_image +'">

顺便说一下,没有理由在C ++的括号中添加class Bar { public: Foo& ref; Bar(Foo& f) : ref { f } { } void printvariable() { cout << "f.a is " << ref.a << endl; } }; ,它从C中失去了意义,现在没有效果。

答案 2 :(得分:0)

你错了一点。您确实在ctor中传递了对f的引用,但构造函数和整个class Bar 不记得 {{1>的整个对象}}。在原始代码中,构造函数只使Bar对象记住对象的f部分,因此稍后只能访问该对象:

int a

请注意您的律师只会阅读class Foo { ... friend class Bar; ... }; class Bar { ... int b; Bar(Foo& f) { b = f.a; // <=--- HERE } void printvariable(void) { cout << "f.a is " << b << endl; // <-- now it refers B } 并将其存储在f.a中。从现在开始,Bar对象只记得b,而这就是全部。您可以b自由访问b。但是,它不会是printvariable - 取自 - a。它将是f,在构造函数中设置为与f.a相同的值。从那时起,bb完全分开。这就是复制价值的方式。

要让Bar记住整个 f.a,您必须记住整个 f:

f

然而,还有一个问题:现在class Bar { ... Foo wholeThing; Bar(Foo& f) { wholeThing = f; // <=--- HERE } void printvariable(void) { cout << "f.a is " << wholeThing.a << endl; } 的类型为wholeThing,构造函数实际上会在Foo期间复制该对象。与wholeThing=f时的情况相同,但现在它还记得整个f的副本。

当然,这只是类型问题。您可以存储引用而不是整个Foo,但它需要一些不同的初始化语法:

b=f.a