Доступ к родительским функциям из дочерней формы в c ++ - PullRequest
2 голосов
/ 30 августа 2011

Я видел пару решений этой проблемы в c # или PHP или даже в сценарии действий, но не в c ++.У меня есть родительская форма, которая вызывает дочернюю форму, обновляя ее и вызывая ShowWindow для нее.Теперь мне нужна дочерняя форма, чтобы иметь возможность вызывать одну из (общедоступных) функций родительской формы.

Моей первой мыслью было передать родительский элемент дочернему элементу в конструкторе дочернего элемента, но ребенок не знаеткаков родитель я получаю ошибку в определении конструктора моего ребенка.Родитель знает, что такое дочерний элемент (я # включил файл заголовка дочерней формы в файл заголовка родительской формы), но я не могу включить файл заголовка родительского элемента в файл заголовка дочернего элемента без конфликта.

Любые идеина лучшие способы или способы заставить это работать в C ++?Кроме того, я использую C ++ Builder 2010 fyi.

Я нашел решение этой проблемы и скоро опубликую его.

Ответы [ 3 ]

4 голосов
/ 30 августа 2011

Ваша проблема заключается в перекрестной зависимости: родительский и дочерний классы должны знать друг о друге.Но дело в том, что им не нужно знать слишком много.Решение состоит в том, чтобы использовать предварительное объявление , например:

В 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;
};
0 голосов
/ 31 августа 2011

Похоже, что лучший способ сделать это следующим образом:

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, но вы вполне можете объявлять классы безопределить их и просто определить их позже.

0 голосов
/ 30 августа 2011
    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, где должны находиться дочерние окна быть инициализированным.

На самом деле, я понял, они даже не находятся в родительско-дочерних отношениях как окна, вы можете инициализировать их в конструкторе.

...