我有两节课:
class ClassA {
public:
ClassB *classB;
int i = 100;
}
// and:
class ClassB {
public:
void longProcess();
}
Run Code Online (Sandbox Code Playgroud)
我从ClassB()运行一个空格:
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
Run Code Online (Sandbox Code Playgroud)
如何从方法中获取"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();
};
Run Code Online (Sandbox Code Playgroud)
错误:ISO C++禁止声明'ParentClass'没有类型
// - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = [ChildClass.cpp] - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - =
#include "ChildClass.h"
ChildClass::ChildClass(){}
void ChildClass::tryGet_I_FromParentClass(){
// this->pointerToParentClass...??? it's not work
}
Run Code Online (Sandbox Code Playgroud)
// - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = [ParentClass.h] - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - =
#include "ChildClass.h"
class ParentClass {
public:
ParentClass();
ChildClass *childClass;
int i;
};
Run Code Online (Sandbox Code Playgroud)
// - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = [ParentClass.cpp] - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - =
#include "ParentClass.h"
ParentClass::ParentClass(){
childClass = new ChildClass();
childClass->pointerToParentClass = this;
}
Run Code Online (Sandbox Code Playgroud)
// - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = [MainWindow.cpp] - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - =
ParentClass *parentClass = new ParentClass();
Run Code Online (Sandbox Code Playgroud)
您需要将this指针从类A(或任何指向它的指针)传递给类B(可能在构造函数中),以便它知道它包含在哪里,并且可能有一个B类成员指向A.然后像调用其他任何方法一样调用实例方法.
这里没有继承,所以其他一些例子不起作用.
编辑:根据您的用户名,我猜你更熟悉Java?您需要的是前瞻性声明.基本上这将是ChildClass.h:
class ParentClass; // Empty
class ChildClass
{
ParentClass* myParent;
// Body omitted
}
Run Code Online (Sandbox Code Playgroud)
确保它ChildClass.h包含在顶部ParentClass.h并正常声明,并包含ParentClass.h在两个.cpp文件中.并确保所有的实现ChildClass都在.cpp文件中,并且相同ParentClass(每个都在它们自己,或不是,无关紧要).
这里发生的是你正在为编译器创建一个循环引用,但是ChildClass.h你需要的只是告诉编译器"这里是一个指针"就是这样.因此,您不需要该类的"完整大小",因此"空"前向声明就足够了.当.cpp文件滚动时,编译器"知道"每个文件的完整大小,并且不会抛出错误.
有关详细信息,请参阅C++ FAQ.