C ++我有一个窗口类,父窗口,它创建了几个标签窗口,child1,child2,ect .. 父窗口具有每个子窗口的成员变量。我想从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.建议更好地建立这种关系。
答案 0 :(得分:3)
使用子项的初始化列表并传递this
。但是,请注意this
的某些用法在初始化列表中是不正确的(因为对象仍在构建中,而某些成员尚未初始化)。
如果m_Child1
需要使用m_Child2
,则应将m_Child2
置于类{1}}之上,以便首先对其进行初始化。然后你可以将m_Child1
指针传递给this
,如下所示:
m_Child2
您可以考虑仅将struct CParent {
CParent() : m_Child1( this ) { }
private:
CChild2 m_Child2;
CChild1 m_Child1;
};
传递给m_Child2
,以使数据依赖性显式化,以提示为什么m_Child1
必须首先出现,并且不提供对正在建造的物体。这看起来像这样:
m_Child2
答案 1 :(得分: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;
}