我有两个类,其中第一个在一个对象中实例化,该对象在类“ two”的另一个对象内使用。我遇到的问题是尝试通过第二类的对象访问第一类的对象的成员时。
我在arduino上使用这种方法来实例化一个对象,该对象将控制带有LiquidCrystal_I2C类的LCD,该对象将在实例化后立即需要参数。
示例代码:
#include <iostream>
using namespace std;
class A
{
public:
int data;
int state;
A (int); // Constructor needs parameter
void setState (int);
int getState ();
};
A::A (int newdata)
{
data = newdata;
}
void A::setState (int newstate)
{
state = newstate;
}
int A::getState ()
{
return state;
}
class B
{
public:
A * a;
int aState;
B ();
void attachA (int);
void printall ();
};
B::B ()
{
}
void B::attachA (int data)
{
A newobj (data);
a = &newobj;
a->setState (data + 1);
aState = a->getState ();
cout << "B obj. address?: " << this <<
", 'A' class obj. creation with data: " << data << " B.a->getState(): " <<
a->getState () << ", B.a->data: " << a->data << "\n";
}
void B::printall ()
{
cout << "B obj. address?: " << this << ", 'A' member class address?: " << a
<< ", B.aState: " << aState << ", B.a->getState(): " << a->
getState () << ", B.a->data: " << a->data << "\n";
}
int main ()
{
B temp_one;
temp_one.attachA (123);
B temp_two;
temp_two.attachA (345);
temp_one.printall ();
temp_two.printall ();
temp_one.printall ();
temp_one.a->setState (42);
temp_one.printall ();
return 0;
}
输出:
B obj. address?: 0x7ffe088aa130, 'A' class obj. creation with data: 123 B.a->getState(): 124, B.a->data: 123
B obj. address?: 0x7ffe088aa140, 'A' class obj. creation with data: 345 B.a->getState(): 346, B.a->data: 345
B obj. address?: 0x7ffe088aa130, 'A' member class address?: 0x7ffe088aa108, B.aState: 124, B.a->getState(): 0, B.a->data: 4196144
B obj. address?: 0x7ffe088aa140, 'A' member class address?: 0x7ffe088aa108, B.aState: 346, B.a->getState(): 0, B.a->data: 4196144
B obj. address?: 0x7ffe088aa130, 'A' member class address?: 0x7ffe088aa108, B.aState: 124, B.a->getState(): 0, B.a->data: 4196144
B obj. address?: 0x7ffe088aa130, 'A' member class address?: 0x7ffe088aa108, B.aState: 124, B.a->getState(): 0, B.a->data: 4196144
问题来源:stackoverflow
我没有全部检查过,但是我之前遇到过此错误。
在attachA
中,创建一个临时对象并保存其地址。这样做是不行的,因为对象会在方法结束时被破坏。
因此,您有一个地址到达堆栈中的某个位置(因为堆栈局部变量)。 在另一个对象上调用该方法时,堆栈框架偶然(或多或少)是相同的,并且该对象位于同一位置。
因此,两个地址的末尾相同(并且附带无效)。
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。