0

私はこのようなAとBの2つのクラスを持っています:

class A
{
public:
    A(int i)
    {
        this->i = i;
    }
private:
    int i;
};

class B
{
public:
    B()
    {
        i = 0;
        a = new A(i);
        i++;
        // i = 1
        // a->i must be 1
    }

private:
    A* a;
    int i;
};

2つのオブジェクト間でメンバーを共有しようとしています。Bで変更した場合、Aで変更する必要があります。どうすればそのようなことができますか?参照により可能ですか?はっきりしていたと思います。ありがとう。

4

3 に答える 3

1

循環依存関係を作成せずに、両方のクラスで共有/認識される3番目のオブジェクト(必要に応じて何かのアドレスを使用できます)が必要です。

多くの場合、ポインターへの参照を好みますが、共有オブジェクトの存続期間を決定するのが難しい場合、ポインターは必ずしもデータを共有するための適切な候補ではないため、参照を避ける傾向があります。Astd::shared_ptrがぴったりかもしれません。

しかし、それはまた、

int x;
A* a = new A(&x);
B* b = new B(&x);

ただし、この例では参照の方が適切ですが、ここでのスコープはの存続期間について何も述べていないため、共有メモリを誰が削除するかという問題に遭遇しないように、すべてのヒープを使用aします。 ..。bshared_ptr

#include <memory>
auto x = std::make_shared<int>(0);
A* a = new A(x);
B* b = new B(x);
于 2012-12-16T14:25:36.140 に答える
0

はい、参照により可能ですが、スコープの問題が発生します。

std::shared_ptrクラス間で変数を共有することもできます。

于 2012-12-16T14:17:19.380 に答える
0

Luchianが言ったように、参照している変数のスコープと存続期間に注意する必要があります。あなたの例では、BがAより長生きしない限り、あなたは大丈夫でしょう。

class A
{
public:
    A(int &i) : m_i(i)
    {
    }
private:
    int &m_i;
};

class B
{
public:
    B()
    {
        i = 0;
        a = new A(i);
        i++;
        // i = 1
        // a->i must be 1
    }

private:
    A* a;
    int i;
};
于 2012-12-16T14:26:12.503 に答える