两个 Arduino class 实例返回相同的值
Two Arduino class instances returning same values
我正在为 Uno 编写我的第一个代码,并且 运行 遇到了使用库的问题。我创建了两个 GPSLocation class 实例(loc1 和 loc2)来存储两个位置的经纬度。当我为它们赋值,然后立即调用它们时,两个实例都具有相同的值,即我为其设置值的最后一个对象的值。我已经看了几个小时了,看不出我做错了什么。
我的代码如下。任何帮助都会很棒。
Test.ino
void setup() {
Serial.begin(115200);
}
void loop() {
GpsLocation loc1;
loc1.setLat(-12.3456);
loc1.setLon(34.4567);
GpsLocation loc2;
loc2.setLat(-78.9123);
loc2.setLon(187.6325);
delay(1000);
Serial.print("Loc1: ");
Serial.print(loc1.getLat(), 4);
Serial.print(", ");
Serial.print(loc1.getLon(), 4);
Serial.print("\n");
Serial.print("Loc2: ");
Serial.print(loc2.getLat(), 4);
Serial.print(", ");
Serial.print(loc2.getLon(), 4);
Serial.print("\n");
}
GPSLocation.h
#ifndef GpsLocation_h
#define GpsLocation_h
#include "Arduino.h"
class GpsLocation
{
public:
GpsLocation();
void setLat(float lat);
void setLon(float lon);
float getLat();
float getLon();
};
#endif
GPSLocation.cpp
#include "Arduino.h"
#include "GpsLocation.h"
float latitude = 0.0;
float longitude = 0.0;
GpsLocation::GpsLocation(){}
void GpsLocation::setLat(float lat)
{
latitude = lat;
}
void GpsLocation::setLon(float lon)
{
longitude = lon;
}
float GpsLocation::getLat()
{
return latitude;
}
float GpsLocation::getLon()
{
return longitude;
}
这就是串行监视器returns
Loc1: -78.9123, 187.6325
Loc2: -78.9123, 187.6325
我按如下方式更新了我的 GPSLocation class,这解决了我的问题。谢谢大家。
GPSLocation.h
#ifndef GpsLocation_h
#define GpsLocation_h
#include "Arduino.h"
class GpsLocation
{
public:
float latitude;
float longitude;
};
#endif
GPSLocation.cpp
#include "Arduino.h"
#include "GpsLocation.h"
从Test.ino设置和获取如下
loc1.latitude = -12.3456;
Serial.print(loc1.latitude, 4);
您的初始代码的问题是您已将变量定义为全局变量(在全局范围内),并且两个实例都可以访问它们,因此从任何实例应用到它们的最后一个值会影响并且可供所有人访问实例。
一般来说,您应该避免使用全局变量,因为这被认为是一种不好的做法。
通过使变量成为非静态 class 成员,您实际上使它们成为实例的 "parts"。这样,每个 Arduino 实例在某种意义上都有自己的变量副本,您可以单独应用值。
更新:为了保持封装,最好将您的变量声明为私有的,并通过 setter 和 getter 方法应用对它们的访问。查看 wiki 上的概念了解更多信息。
我正在为 Uno 编写我的第一个代码,并且 运行 遇到了使用库的问题。我创建了两个 GPSLocation class 实例(loc1 和 loc2)来存储两个位置的经纬度。当我为它们赋值,然后立即调用它们时,两个实例都具有相同的值,即我为其设置值的最后一个对象的值。我已经看了几个小时了,看不出我做错了什么。
我的代码如下。任何帮助都会很棒。
Test.ino
void setup() {
Serial.begin(115200);
}
void loop() {
GpsLocation loc1;
loc1.setLat(-12.3456);
loc1.setLon(34.4567);
GpsLocation loc2;
loc2.setLat(-78.9123);
loc2.setLon(187.6325);
delay(1000);
Serial.print("Loc1: ");
Serial.print(loc1.getLat(), 4);
Serial.print(", ");
Serial.print(loc1.getLon(), 4);
Serial.print("\n");
Serial.print("Loc2: ");
Serial.print(loc2.getLat(), 4);
Serial.print(", ");
Serial.print(loc2.getLon(), 4);
Serial.print("\n");
}
GPSLocation.h
#ifndef GpsLocation_h
#define GpsLocation_h
#include "Arduino.h"
class GpsLocation
{
public:
GpsLocation();
void setLat(float lat);
void setLon(float lon);
float getLat();
float getLon();
};
#endif
GPSLocation.cpp
#include "Arduino.h"
#include "GpsLocation.h"
float latitude = 0.0;
float longitude = 0.0;
GpsLocation::GpsLocation(){}
void GpsLocation::setLat(float lat)
{
latitude = lat;
}
void GpsLocation::setLon(float lon)
{
longitude = lon;
}
float GpsLocation::getLat()
{
return latitude;
}
float GpsLocation::getLon()
{
return longitude;
}
这就是串行监视器returns
Loc1: -78.9123, 187.6325
Loc2: -78.9123, 187.6325
我按如下方式更新了我的 GPSLocation class,这解决了我的问题。谢谢大家。
GPSLocation.h
#ifndef GpsLocation_h
#define GpsLocation_h
#include "Arduino.h"
class GpsLocation
{
public:
float latitude;
float longitude;
};
#endif
GPSLocation.cpp
#include "Arduino.h"
#include "GpsLocation.h"
从Test.ino设置和获取如下
loc1.latitude = -12.3456;
Serial.print(loc1.latitude, 4);
您的初始代码的问题是您已将变量定义为全局变量(在全局范围内),并且两个实例都可以访问它们,因此从任何实例应用到它们的最后一个值会影响并且可供所有人访问实例。
一般来说,您应该避免使用全局变量,因为这被认为是一种不好的做法。
通过使变量成为非静态 class 成员,您实际上使它们成为实例的 "parts"。这样,每个 Arduino 实例在某种意义上都有自己的变量副本,您可以单独应用值。
更新:为了保持封装,最好将您的变量声明为私有的,并通过 setter 和 getter 方法应用对它们的访问。查看 wiki 上的概念了解更多信息。