【问题标题】:C++ referring to an object being constructedC++ 引用正在构造的对象
【发布时间】:2009-11-02 19:23:39
【问题描述】:

在 C++ 中,我引用了一个想要指向其所有者的对象,但我无法在包含类的构造期间设置指针,因为它没有完成构造。所以我正在尝试做这样的事情:

class A {
   public:

     A() : b(this) {}
   private:
     B b;
};

class B {
   public:
     B(A* _a) : a(_a) {}
   private:
     A* a;
};

有没有办法确保 B 总是用 A* 初始化,而 A 没有指向 B 的指针?

谢谢

【问题讨论】:

  • 这是一个非常讨厌的耦合。你在解决什么问题?

标签: c++ reference construction


【解决方案1】:

试试这个:

class A;

class B {
public:
  B(A *_a) : a(_a) {};

private:
  A* a;
};

class A {
public:
  A() : b(this) {};

private:
  B b;

};

由于 B 完全包含在 A 中,所以必须先声明它。它需要一个指向 A 的指针,因此您必须在声明 B 之前前向声明 A。

此代码在或多或少当前版本的 g++ 下编译。

【讨论】:

    【解决方案2】:

    在 C++ 中,我引用了一个想要指向其所有者的对象,但我无法在包含类的构造过程中设置指针,因为它没有完成构造。

    你可以存储指针了。

    你不能做的是尝试通过 B 的构造函数中的指针来获取 A 的成员/方法,因为此时父实例可能没有完全初始化:

    #include <iostream>
    
    class Y;
    
    class X
    {
        Y* y;
    public:
        X(Y* y);
    };
    
    class Y
    {
        X x;
        int n;
    public:
        Y(): x(this), n(42) {}
        int get_n() const { return n; }
    };
    
    X::X(Y* p): y(p)
    {
        //Now this is illegal:
        //as it is, the n member has not been initialized yet for parent
        //and hence get_n will return garbage
        std::cout << p->get_n() << '\n';
    }
    
    int main()
    {
        Y y;
    }
    

    如果你要切换 Y 中的成员,那么 n 会首先被初始化,X 的构造函数会打印 42,但这太脆弱了,无法依赖。

    【讨论】:

      猜你喜欢
      • 2017-02-22
      • 2020-04-30
      • 1970-01-01
      • 2015-07-01
      • 2018-07-05
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多