Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在两个对象之间共享成员_C++ - Fatal编程技术网

C++ 在两个对象之间共享成员

C++ 在两个对象之间共享成员,c++,C++,我有两个班,A和B是这样的: 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和B是这样的:

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;
};
我想在两个对象之间共享一个成员。 我想当我在B中被修改时,我必须在A中被修改。 我怎么能做那样的事?可以参考吗? 我希望我是清楚的。
谢谢。

是的,可以参考,但随后会遇到范围界定问题


您还可以使用
std::shared_ptr
在类之间共享变量。

在不创建循环依赖项的情况下,您需要两个类共享/已知的第三个对象(如果需要,可以使用某个对象的地址)

虽然在许多情况下我更喜欢引用指针,但我倾向于避免引用,因为当共享对象的生命周期难以确定时,它们不一定是共享数据的好候选对象。std::shared_ptr可能是一个很好的选择

不过,它也可能像

int x;
A* a = new A(&x);
B* b = new B(&x);
然而,在本例中,引用更合适,但鉴于此处的范围没有说明
a
b
的生命周期,我将使用所有堆和
共享\u ptr
以避免遇到谁将删除共享内存的问题

#包括
自动x=std::使_共享(0);
A*A=新的A(x);
B*B=新的B(x);

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