【问题标题】:C++ string does not concatenate in a classC++ 字符串不在类中连接
【发布时间】:2021-01-31 11:24:09
【问题描述】:

我尝试编写一个小程序来控制与树莓派 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);,但没有成功

感谢任何帮助,如果需要更多信息,请告诉我什么,我会尽力提供

感谢蚀刻

【问题讨论】:

  • 在为device 设置值之前,您正在初始化path 的值。不要尝试为 path 设置值,直到您知道它实际上是什么,即在构造函数中。
  • @NathanPierson 谢谢你说得通

标签: c++ string class raspberry-pi concatenation


【解决方案1】:

您的三个成员变量都有默认的成员初始化器。这些将在您的构造函数主体中分配 device 之前执行,此时 device 仍然是一个空字符串。

class temperaturSensor {
  private:
    string device;
    string baseDir = "/sys/bus/w1/devices/";
    string tempFile = "/w1_slave";
    string path = baseDir + device + tempFile;

baseDirtempFile 的值似乎永远不会改变,因此将它们设为 const 静态可能是最简单的,然后在构造函数中初始化 device 后初始化 path,或者使用传递给它的参数的值。

【讨论】:

    【解决方案2】:

    在你的类声明中:

    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++ 不能以这种方式工作。

    这里最简单的解决方法是让您的构造函数使用其初始化部分按顺序初始化所有类成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2010-12-16
      相关资源
      最近更新 更多