【发布时间】:2016-10-25 05:59:26
【问题描述】:
我目前在为粒子 P0 编写的某些代码中有两个类,例如 ClassA 和 ClassB。固件与 Arduino 非常相似。我希望能够在我的主代码中实例化 ClassA 和 ClassB,然后从 ClassB 访问 ClassA。请参阅下面的示例主线。
ClassA cA;
ClassB cB(&cA);
void setup(){}
void loop(){}
这是我在 ClassA 中的内容:
#ifndef _ClassA_H
#define _ClassA_H
#include "application.h"
class ClassA{
public:
ClassA();
void test(void){q++};
private:
int q;
};
#endif
在 B 类中:
#ifndef _ClassB_H
#define _ClassB_H
#include "application.h"
#include "ClassA.h"
class ClassB{
public:
ClassB(ClassA * classA);
private:
int i = 0;
};
#endif
目标是在 ClassB 中有一个方法可以访问 ClassA 中的信息。比如……
_classA->test();
在我的用例中,我试图将云信息存储在 ClassA 中,而 ClassB 包含一系列计时器回调。这样,在 ClassB 中的某些计时器回调之后,我可以检查 ClassA 中是否有任何来自云端的状态更新,例如用户输入。
但是,我在尝试执行此操作时遇到多个错误。
ClassB.h:9:3: note: ClassB::ClassB(ClassA*)
ClassB(ClassA * classA);
^
ClassB.h:9:3: note: no known conversion for argument 1 from 'ClassA (*)()' to 'ClassA*'
ClassB.h:7:7: note: constexpr ClassB::ClassB(const ClassB&)
class ClassB{
^
ClassB.h:7:7: note: no known conversion for argument 1 from 'ClassA (*)()' to 'const ClassB&'
ClassB.h:7:7: note: constexpr ClassB::ClassB(ClassB&&)
ClassB.h:7:7: note: no known conversion for argument 1 from 'ClassA (*)()' to 'ClassB&&'
make[1]: *** [../build/target/user/platform-6TestCode.o] Error 1
make: *** [user] Error 2
通过将 ClassB 更改为以下内容,我取得了一些成功:
class ClassB{
public:
ClassB();
private:
int i = 0;
ClassA * classA;
};
我的问题是我有一个指向 classA 的指针,但无法访问分配给 cA 的内存(在 main 中实例化)。
非常感谢您在这里的帮助。
【问题讨论】:
-
我现在有了 ClassA 的另一个实例化——指向实例的指针不是 另一个实例化,通过它你可以参考
cA。无论如何,发布一个最小的示例来重现错误,否则很难准确地说出什么问题。 -
我明白了,感谢您的快速响应。您能否澄清一下,我如何从
ClassA * classA;访问cA?谢谢! -
什么是
_classA,为什么要通过使用指针调用其构造函数来初始化它?你的例子没有意义。 -
_classA可以被删除。我希望能够使用指向类的实例化的指针来调用构造函数。在发送 Serial 或 SPI 类的地址时,这对我有用。请参阅此adafruit example。在那里,他们将 Serial 类的地址传递给用于 GPS 接口的类。想对 ClassA 和 ClassB 做类似的事情。 -
消息中的
'ClassA (*)()'表示您有一个返回ClassA的函数。你的真实代码中没有ClassA cA();,是吗?
标签: c++ class pointers arduino embedded