我是 C++ 和 arduino 的新手,我不明白发生了什么。
问题是:
我有以下变量:
char *_array;
char _data[2];
当我这样做时:_array = data;
然后我更改 _data 的内容,例如 data[0] = 'C'
、data[1 ] = 'D'
。 _array 的内容没有改变,我需要再次执行 _array = _data
以应用更改。
他们似乎没有指向同一个地址。
下面的代码就是例证,我的第三个打印应该是 "3CD"
而不是 "3AB"
,但事实并非如此。
你能帮帮我吗?我不明白。谢谢!
#include <SoftwareSerial.h>
class Base {
public:
Base() {;};
void setArray(char* array) {_array = array;}
char *getArray() {return _array;}
private:
char *_array;
};
class A : public Base{
public:
A() : Base() {;};
A(char data1, char data2)
: Base()
{
setData(data1, data2);
setArray(_data);
}
void setData(char data1, char data2)
{
_data[0] = data1;
_data[1] = data2;
}
char *getData() {return _data;};
private:
char _data[2];
};
A a;
void setup()
{
Serial.begin(9600);
}
void loop()
{
a = A('A', 'B'); // This sets _data to "AB" and _array will point to _data
Serial.write('1');
Serial.write(a.getData()[0]);
Serial.write(a.getData()[1]); // This will print "1AB" (as expected)
a.setData('C', 'D'); // Here, _data changes to "CD" but _array no
Serial.write('2');
Serial.write(a.getData()[0]);
Serial.write(a.getData()[1]); // This will print "2CD" (as expected)
Serial.write('3');
Serial.write(a.getArray()[0]);
Serial.write(a.getArray()[1]); // This will print "3AB" (WHY?!?!?!)
Serial.write('4');
a.setArray(a.getData()); // If I call this function, _array changes to "CD"
Serial.write(a.getArray()[0]);
Serial.write(a.getArray()[1]); //This will print "4CD" (WHY I need to call setArray?)
delay(3000);
}
最佳答案
a = A('A', 'B'); // This sets _data to "AB" and _array will point to _data
在上面的行中,A('A', 'B')
构造了一个新的 A 并建立了内部的 _array
。然后 a = ...
调用默认赋值,它只是将每个成员从源复制到目标。现在,a._array
指向临时的 char 数组,这就是无效结果的来源。
为了避免以后的错误,
- 实现赋值运算符
- 复制构造函数
- 并让默认构造函数初始化 _array。
关于C++ : Two pointers (supposedly) to the same address. 改变其中一个的内容不会改变另一个的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14894637/