0

C++ 我有一个窗口类,父级,它创建了几个选项卡窗口,child1、child2 等。父窗口有每个子窗口的成员变量。我想从 child1 访问 child2,并认为我可以在 child1 的构造函数中传递一个指向 parent 的指针,并使用 parent 的指针来访问 child2。我什至不知道如何开始。我尝试了类似以下的方法,但它没有编译,从包含 (*this) 的行开始。

class CParent
{
public:
    CParent() {};
    CChild1 m_Child1(*this);
    CChild2 m_Child2;
    ....
};

class CChild1
{
public:
    CChild1(CParent *pParent) {};
    int getChild2Number(return pParent->m_Child2.m_number);
};

class CChild2
{
public:
    CChild2() {};
    m_number = 1;
}

我想知道是否有人可以提供帮助 1. 在不过多改变结构的情况下编译它 2. 建议建立这种关系的更好方法。

4

2 回答 2

3

使用孩子的初始化列表并通过this. 但是,请注意,this在初始化列表中的某些用法是不正确的(因为对象仍在构建中,并且某些成员还没有被初始化)。

如果m_Child1需要使用m_Child2,你应该把m_Child2上面m_Child1的类定义,以便它会首先被初始化。然后你可以像这样传递this指针m_Child2

struct CParent {
    CParent() : m_Child1( this ) { }
private:
    CChild2 m_Child2;
    CChild1 m_Child1;
};

但是,您可能会考虑只传递m_Child2m_Child1,以明确数据依赖关系,提示为什么m_Child2必须先出现,并且不提供对正在构建的对象的引用。看起来像这样:

struct CChild2;  // Forward declare the class so CChild1 can accept it
struct CChild1 { // Define CChild1 first because CParent uses it for a member
    CChild1( CChild2 &child2 );
    // ...
};
// ...
struct CParent {
    CParent() : m_Child1( m_Child2 ) { }
private:
    CChild2 m_Child2;
    CChild1 m_Child1;
};
于 2013-06-18T22:33:13.387 回答
1

您的代码在声明和定义语法、成员初始化等方面存在几个严重问题。我的建议是继续使用 C++ 基础知识。

我建议为您的孩子使用动态存储,因为您的问题暗示可能有两个以上。

class CParent;

class CChild
{
public:
  CChild (CParent * p_parent);
  int get_other_child_number(size_t const other_child);
  int number (void) { return m_number; }
private:
  CParent * m_parent;
  int m_number;
};

class CParent
{
public:
  CParent (void) { }
  void add_child (void) { m_children.emplace_back(this); }
  CChild & child (size_t const child_num) { return m_children.at(child_num); }
  CChild const & child (size_t const child_num) const { return m_children.at(child_num); }
  size_t num_childs (void) const { return m_children.size(); }
private:
  std::vector<CChild> m_children;
};

CChild::CChild (CParent * p_parent) : m_parent(p_parent), m_number(p_parent->num_childs()) { }
int CChild::get_other_child_number(size_t const other_child)
{ 
  return m_parent->child(other_child).number(); 
}


int main()
{
  CParent par;
  par.add_child();
  par.add_child();
  cout << "Number of Child 0 is " << par.child(0).number() << endl;
  cout << "Number of Child 1 is " << par.child(1).number() << endl;
  cout << "Number of Child 0 from Child 1 is " << par.child(1).get_other_child_number(0) << endl;
  cout << "Number of Child 1 from Child 0 is " << par.child(0).get_other_child_number(1) << endl;
}
于 2013-06-18T22:50:57.297 回答