3

我有两节课:

class ClassA {
    public:
        ClassB *classB;
        int i = 100;
}
// and:
class ClassB {
    public:
        void longProcess();
}

我从 ClassB() 中运行 void:

ClassA classA = new ClassA();
classA->i = 100;
classA->classB = new ClassB();
classB->longProcess(); // it's a long process!
// but when it will finish - I need to get the "i" variable from ClassA

如何从方法中获取“int i”变量:longProcess()?实际上,我需要在另一个线程中运行这个长代码,这就是为什么当 longProcess() 完成工作时我需要从 ClassB 中检索“i”变量的原因。有什么建议么?

更新:我尝试编写一些代码来保存指向父类的指针

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[ ChildClass.h ]-=-=-=- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#include "ParentClass.h"
class ChildClass {
    public:
        ChildClass();
        ParentClass *pointerToParentClass; // ERROR: ISO C++ forbids declaration of 'ParentClass' with no type
        void tryGet_I_FromParentClass();
};

错误:ISO C++ 禁止声明没有类型的“ParentClass”

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[ ChildClass.cpp ]-=-=-=- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#include "ChildClass.h"
ChildClass::ChildClass(){}
void ChildClass::tryGet_I_FromParentClass(){
    // this->pointerToParentClass...??? it's not work
}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[ ParentClass.h ]-=-=-=- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#include "ChildClass.h"
class ParentClass {
    public:
        ParentClass();
        ChildClass *childClass;
        int i;
};

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[ ParentClass.cpp ]-=-=-=- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#include "ParentClass.h"
ParentClass::ParentClass(){
    childClass = new ChildClass();
    childClass->pointerToParentClass = this;
}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[ MainWindow.cpp ]-=-=-=- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

ParentClass *parentClass = new ParentClass();
4

4 回答 4

8

您需要将this指针从 A 类(或任何指向它的指针)传递给 B 类(可能在构造函数中),以便它知道它包含在哪里,并且可能有一个指向 A 的 B 类成员。然后像调用其他方法一样调用实例方法。

这里没有继承,所以其他一些例子不起作用。

编辑:根据您的用户名,我猜您对 Java 更熟悉?你需要的是一个前向声明。基本上这将是ChildClass.h

class ParentClass; // Empty
class ChildClass
{
    ParentClass* myParent;
    // Body omitted
}

确保ChildClass.h包含在顶部ParentClass.h并正常声明,并包含ParentClass.h在两个 .cpp 文件中。并确保所有的实现ChildClass都在 .cpp 文件中,并且对于ParentClass(每个都在自己的,与否无关紧要)中相同。

这里发生的是您正在为编译器创建循环引用,但ChildClass.h您只需要告诉编译器“这里有一个指针”就可以了。因此,您不需要类的“全尺寸”,因此“空”前向声明就足够了。当 .cpp 文件滚动时,编译器“知道”每个文件的完整大小,并且不会抛出错误。

有关这方面的更多信息,请参阅C++ 常见问题解答。

于 2012-10-10T18:25:48.577 回答
1

如果A::callMeWhenLongProcessFinished()实际上是您每个人都想从中调用的唯一函数B::longProcess(),则可以将指向A对象的指针传递给该函数:

void B::longProcess(A* object) {
    // long process
    object->callMeWhenLongProcessFinished();
}

如果设置不是那么简单,您可以改为使用B::longProcess()设置std::function<void()>来调用正确的函数并调用它:

void B::longProcess(std::function<void()> callback) {
    // long process
    if (callback) {
        callback();
    }
}

void some_function() {
    A* aptr = get_A_object();
    B* bptr = get_B_object();
    bptr->longProcess(std::bind(&A::callMeWhenLongProcessFinished, aptr));
}

在不同线程中完成调用需要以适当的线程安全方式发送对象,但这是一个完全独立的问题。

于 2012-10-10T18:32:41.783 回答
0

在子方法结束时调用父方法:

void ClassB::longProcess() {
  // do your processing
  // ...

  callMeWhenLongProcessHasFinished();
}

如果由于某种奇怪的原因,您无法修改longProcess,请编写另一个方法来串行调用这两个方法。

于 2012-10-10T18:23:19.030 回答
0

您应该加入ClassB 以便 ClassA 在 ClassB 完成之前不会执行它的方法。或者,只需在 ClassB 的方法末尾调用 ClassA 中的方法。

于 2012-10-10T18:23:29.740 回答