我在c#或PHP甚至动作脚本中看到过这个问题的几个解决方案,但在c ++中没有。我有一个父表单,通过新建它并在其上调用ShowWindow来调用子表单。我现在需要子表单能够调用其中一个父表单(公共)函数。
我的第一个想法是将父级传递给子级构造函数中的子级,但由于子级不知道父级是什么,因此我的子级构造函数定义中出现错误。父级知道子级是什么(我在父级表单的头文件中包含了子表单的头文件),但我不能将父级的头文件包含在子级的头文件中而不会发生冲突。
有关更好的方法或方法的任何想法,使其在c ++中工作?另外,我正在使用C ++ Builder 2010 fyi。
我找到了解决方案,并将很快发布。
答案 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文件中声明的多个事物发生任何冲突,但你完全能够在不定义类的情况下声明类,并且稍后再定义它们。