1

我有两个文件:

测试.h

#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
class A{
  private:
    class B;
    B *bp;
  public:
    A(int val);
    void setX(int value);
};
#endif // TEST_H_INCLUDED

测试.cpp

#include "test.h"

class A::B{
  int x;
  B(A &a, int value){
    a.setX(value);
  }
  friend class A;
};

A::A(int val) : bp(new B(*this, val)){
}

void A::setX(int value){
  bp->x = value;
}

尝试创建类型为 AI 的对象时发生崩溃

A a(5);

经过一些调试后,我发现程序在这一行崩溃了:

bp->x = value;

我的猜测是,因为我从构造函数调用setX() ,所以bp并没有指向正在创建的 B 类实例。但是解决这个问题的方法是什么?我不想在 B 构造函数中复制setX()的代码(这只是一个例子,你可以猜到,真正的代码更长)。

4

2 回答 2

4

A::B除了将其构造与其初始化分开以避免这种先有鸡还是先有蛋的问题之外,您无能为力:

class A::B{
    int x;
    void init(A &a, int value){
        a.setX(value);
    }
    friend class A;
};

A::A(int val) : bp(new B){
    bp->init(*this, val);
}
于 2013-10-30T20:32:44.283 回答
1

虽然 Daniel 的代码可以工作,但我建议在 B 中使用成员函数。然后,您只是朝着一个方向(向内)前进,而不是在两个类之间来回弹跳。我不知道; 也许这是个人喜好。

class A::B{
public:
  B(int value){
    setX(value);
  }
  void setX(int value){
    x = value;
  }
private:
  int x;
};

A::A(int val) : bp(new B(val)){
}

void A::setX(int value){
  bp->setX(value);
}
于 2013-10-30T20:49:52.043 回答