从c+中的子窗体访问父函数+; 我在C语言或PHP中甚至在动作脚本中看到了一些解决这个问题的方法,但是在C++中没有。我有一个父窗体,它通过新建子窗体并在其上调用ShowWindow来调用子窗体。我现在需要子窗体能够调用父窗体的一个(公共)函数

从c+中的子窗体访问父函数+; 我在C语言或PHP中甚至在动作脚本中看到了一些解决这个问题的方法,但是在C++中没有。我有一个父窗体,它通过新建子窗体并在其上调用ShowWindow来调用子窗体。我现在需要子窗体能够调用父窗体的一个(公共)函数,c++,forms,parent-child,C++,Forms,Parent Child,我的第一个想法是将父对象传递给子对象的构造函数中的子对象,但是由于子对象不知道父对象是什么,我在子对象的构造函数定义中得到了一个错误。父级知道子级是什么(我将子窗体的头文件包含在父级窗体的头文件中),但我不能将父级的头文件包含在子级的头文件中而不发生冲突 关于如何在C++中实现更好的方法或方法有什么想法?另外,我使用C++ Builder 2010 FIY。 我已经找到了这个问题的解决方案,并将很快发布。您的问题是交叉依赖:父类和子类需要相互了解。但问题是他们不需要知道太多。解决方案是使用如下转

我的第一个想法是将父对象传递给子对象的构造函数中的子对象,但是由于子对象不知道父对象是什么,我在子对象的构造函数定义中得到了一个错误。父级知道子级是什么(我将子窗体的头文件包含在父级窗体的头文件中),但我不能将父级的头文件包含在子级的头文件中而不发生冲突

关于如何在C++中实现更好的方法或方法有什么想法?另外,我使用C++ Builder 2010 FIY。
我已经找到了这个问题的解决方案,并将很快发布。

您的问题是交叉依赖:父类和子类需要相互了解。但问题是他们不需要知道太多。解决方案是使用如下转发声明:

parent.h
中:

#include "child.h"

class Parent {
    Child c;
    Parent() : c( this ) {}
};
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;
};
child.h
中:

#include "child.h"

class Parent {
    Child c;
    Parent() : c( this ) {}
};
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;
};
这是因为
LabelFrm
被声明为指针。您应该将其声明为成员(我现在不确定这在VCL中是否正确),或者在适当的位置使用类似
LabelFrm=new TForm1(this,“,this)
的语法初始化指针(阅读VCL文档了解这一点,应该在哪里初始化子窗口)


实际上,我现在明白了,它们甚至不像windows那样处于父子关系中,您可以在构造函数中初始化。

这样做的最佳方法如下:

家长:h:

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

#include Child.h

//declare a child ie. Child chld = new Child(this);
儿童健康:

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文件中声明的多个内容发生任何冲突,但您完全可以在不定义类的情况下声明类,然后再定义它们。

您使用的是什么GUI库?可能的重复看起来很有希望。不过,在编译时,它告诉我它无法转换父实例“在我定义父构造函数以从子构造函数继承的行上的'Child Instance'。这是不是告诉我不能从子类继承?可能
Child
是从
parent
继承的,所以应该是
class Child:public parent{
…顺便说一下,“Child”和“parent”“是-是”关系的可怕名称!不,我真的不想让子对象从父对象继承,除非这是唯一的方法。它们是根本不同的类,因此继承会带来不必要的东西。@Kerrek,是的,但我的示例不包含继承:)我从UI控制父子关系的角度理解它。是的,unkulunkulu,这正是我拥有的关系。你知道为什么它会给我那个编译器错误吗?是的,我没有在那里声明任何儿童实例。我在我的.cpp代码中新了它,而不是在你可能想象的.h文件中。我尽可能地从字面上理解它从你的代码中,我可以看到这是一个错误。我再次建议你阅读一本关于C++的好书,因为没有继承者的构造函数(什么是废话!),这种语法被称为成员初始化列表,你可以谷歌它。