c++ - C++ 字符串不在类中连接
问题描述
我尝试编写一个小程序来控制与树莓派 3B+ 上的两个 ds18b20 温度传感器连接的泵和阀门。我为泵和阀门定义了一个类,将来会添加更多的泵和阀门,我还为通过 1 根电线连接的 ds18b20 传感器创建了一个类。传感器可以通过“文件”读取,因此有一个基本目录string baseDir = "/sys/bus/w1/devices/";
,后跟设备 IDstring tSensor1 = "28-3c01a81688f4";
和温度“文件” string tempFile = "/w1_slave";
,完整路径应如下所示/sys/bus/w1/devices/28-3c01a81688f4/w1_slave
。
但我得到的是这个TestSensor1= Error reading file at /sys/bus/w1/devices//w1_slave
设备丢失了,对于TestSensor2= Error reading file at /sys/bus/w1/devices//w1_slave
.
代码直接在 rPi 上编译,g++ -Wall -o oww ofen-warmwasser.cpp -lwiringPi
这是我的代码
#include <wiringPi.h> // library to access the GPIO Pins on a raspberryPI !!deprecated!!
#include <iostream> // cout
#include <fstream> // file stream access
#include <string> // string class
#include <sstream> // string stream needed for file access to put data into string
//... code skipped ...
class temperaturSensor {
private:
string device;
string baseDir = "/sys/bus/w1/devices/";
string tempFile = "/w1_slave";
string path = baseDir + device + tempFile;
stringstream buffer;
string data;
string strTemp;
double temp = 987.6;
public:
// constructor declaration
temperaturSensor(string str);
// methodes
double temperatur() {
//cout << "----->>>> " << device << " ----->>>> " << path << endl;
ifstream infile(path);
if (infile) {
buffer << infile.rdbuf();
data = buffer.str();
infile.close();
}
else {
infile.close();
cout << "Error reading file at " << path << endl;
return -100;
}
size_t crcCheck = data.find("YES");
if (crcCheck == string::npos) {
cout << "CRC fail not reading temperatur" << endl;
return -101;
}
size_t TempPos = data.find("t=");
if (TempPos == string::npos) {
cout << "failed to find value -> abort!" << endl;
return -102;
}
strTemp = data.substr(TempPos+2);
temp = stod(strTemp)/1000;
return temp;
}
};
// constructor
temperaturSensor::temperaturSensor(string str) {
device = str;
}
int main(void) {
// test setup
pump boilerpumpe(21);
valve boilervalve(28);
string tSensor1 = "28-3c01a81688f4";
temperaturSensor testSensor1(tSensor1);
temperaturSensor testSensor2("28-3c01a816d9c1");
while (true)
{
boilerpumpe.on();
boilervalve.close();
cout << "TestSensor1= " << testSensor1.temperatur() << "°C \nTestSensor2= " << testSensor2.temperatur() << "°C" << endl;
delay(5*1000);
boilerpumpe.off();
boilervalve.open();
delay(5*1000);
}
return 0;
}
正如您在代码中看到的那样,我尝试了不同的方法,从将string device;
变量从 private: 声明为 public: 从类的末尾到开头,当我cout
正确显示设备变量时,我认为问题出在此处string path = baseDir + device + tempFile;
,我也试过string path = baseDir.append(device);
但没有成功
任何帮助表示赞赏,如果需要更多信息,请告诉我什么,我尝试提供
谢谢蚀刻
解决方案
在您的班级声明中:
string device;
此类成员默认初始化为空字符串。
string baseDir = "/sys/bus/w1/devices/";
此类成员默认初始化为给定的字符串。
string tempFile = "/w1_slave";
此类成员默认初始化为给定的字符串。
string path = baseDir + device + tempFile;
并且这个类成员被初始化为组合字符串。请记住,这device
是一个空字符串,因此路径最终设置为“/sys/bus/w1/devices//w1_slave”,这是您的代码最终尝试打开的内容,但失败了。
在你的类的构造函数中:
device = str;
这为 设置了一个新值device
。然而为时已晚,因为另一个类成员,path
特别是已经初始化了。在设置值之后,它不会再次初始化device
。C++ 不能以这种方式工作。
这里最简单的解决方法是让您的构造函数使用其初始化部分按顺序初始化所有类成员。
推荐阅读
- azure - Azure App service resource group on Sandbox. Created for learning does not allow Free Service plans
- blazemeter - 将 Taurus 测试指定为 Blazemeter 功能测试
- matplotlib - 更改子图上刻度标签的旋转
- python - Sympy 返回日志而不是 ln
- reactjs - setState 不会在 intervalRef 内更新
- azure - 使用内置策略时 Azure AD B2C“用户名或密码无效”
- python-3.x - “配额组'ReadGroup'的配额超出并限制'每100秒每个用户的读取请求'服务google api
- json - Azure Blob 的奇怪编码问题导致无法从 JSON 转换为对象
- android - ReactNative 中的可访问性标识符问题
- reactjs - 功能组件上的反应更新状态钩子不允许点符号