在c ++中从子表单访问父函数

时间:2011-08-30 13:22:52

标签: c++ forms parent-child

我在c#或PHP甚至动作脚本中看到过这个问题的几个解决方案,但在c ++中没有。我有一个父表单,通过新建它并在其上调用ShowWindow来调用子表单。我现在需要子表单能够调用其中一个父表单(公共)函数。

我的第一个想法是将父级传递给子级构造函数中的子级,但由于子级不知道父级是什么,因此我的子级构造函数定义中出现错误。父级知道子级是什么(我在父级表单的头文件中包含了子表单的头文件),但我不能将父级的头文件包含在子级的头文件中而不会发生冲突。

有关更好的方法或方法的任何想法,使其在c ++中工作?另外,我正在使用C ++ Builder 2010 fyi。

我找到了解决方案,并将很快发布。

3 个答案:

答案 0 :(得分:4)

您的问题是交叉依赖:父类和子类需要彼此了解。但问题是他们不需要太了解。解决方案是使用前向声明,如下所示:

parent.h

#include "child.h"

class Parent {
    Child c;
    Parent() : c( this ) {}
};

child.h

class Parent; // this line is enough for using pointers-to-Parent and references-to-Parent, but is not enough for defining variables of type Parent, or derived types from Parent, or getting sizeof(Parent) etc

class Child {
public:
    Child(Parent* p) : parent( p ) {}

private:
    Parent *parent;
};

答案 1 :(得分:0)

    On the constructor in my parent class is gives the error "Cannot convert from "TEISForm * const" to "TForm1 *" Any ideas?

这是因为LabelFrm被声明为指针。您应该将其声明为成员(我现在不确定这是否在VCL中是正确的),或者在适当的位置使用LabelFrm = new TForm1(this, "", this)之类的语法初始化指针(请阅读VCL docs for this,where should should子窗口初始化。

实际上,我现在得到它,它们甚至不是作为窗口的父子关系,你可以在构造函数中初始化。

答案 2 :(得分:0)

看来最好的方法如下:

Parent.h:

class Child;
class Parent{
public:
Parent(){
//Constructor
}

Parent.cpp:

#include Child.h

//declare a child ie. Child chld = new Child(this);

Child.h:

class Parent;
class Child{
public:
Child(){
//Constructor
}

Child.cpp:

#include Parent.h

Parent prnt;

//point Tell your child that it's parent is of type "Parent" in it's constructor
 Child::Child(TComponent *Owner){
prnt = (Parent *)Owner;
    }

你不应该与.h文件中声明的多个事物发生任何冲突,但你完全能够在不定义类的情况下声明类,并且稍后再定义它们。