為了在我的 C 應用程式的不同部分記錄不同的值,我希望能夠實體化一個類,該類抽象了在檔案中記錄不同值所需的所有命令。這是該類的原型頭檔案:
#include <string.h>
#include <fstream>
#include <iostream>
#include <Eigen/Dense>
....
class FileLogger {
public:
FileLogger(const std::string& log_name, const std::string& columnNames, const uint& columnCount, const double& timerOffsetSeconds = 0);
// Checks if logging of previous timestamp is completed and
//starts a new row with logging the current time.
void startNewTimestamp();
// different predefined methods to log several data types
void logScalar(const double& value);
void logVector(const Eigen::VectorXd& values);
template <int SIZE, typename TYPE>
void logArray(TYPE (&values)[SIZE]) {
for (int i; i < SIZE; i ) {
fileHandle_ << values[i] << ",";
currentColumnCount_ = 1;
}
}
// Method to close the fileHandle_ of the class
void closeFileHandle();
private:
void checkLastTimestampCompletion();
uint countColumnNames();
std::string file_name_;
uint currentColumnCount_;
const uint columnCount_;
const std::string columnNames_;
std::ofstream fileHandle_;
....
};
我現在遇到的問題是,每個類都需要在程式終止之前關閉它正在fileHandle_使用的方法closeFileHandle(),以獲得作業日志。由于程式通常使用CTL C此方法終止,因此需要在信號回呼中發生。我發現可以使用終止信號來執行回呼函式,如下所示:
...
#include <signal.h>
#include <iostream>
void signal_callback_handler(int signum) {
std::cout << "Caught signal " << signum << ", starting exit procedure." << std::endl;
.... do something ...
exit(1);
}
int main(){
....
signal(SIGINT, signal_callback_handler);
....
}
我能找到的關閉fileHandle_FileLogger 類的每個實體的所有必需的唯一方法是全域定義它們并手動添加fileLogger.closeFileHandle();到回呼函式中。由于多種原因,這是不可取的。
因此,我想知道是否有辦法以某種方式包含在退出類本身的程式時關閉檔案句柄的功能,這種方式可以在代碼中的任何地方實體化類?或者,如果這是不可能的,我怎么能以另一種方式處理這個問題?
uj5u.com熱心網友回復:
每個的銷毀都會FileLogger自動解決這個問題,因為fileHandle_當FileLogger超出范圍或呼叫std::exit.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/396926.html
上一篇:引數未正確傳遞給函式
下一篇:創建超類和子類Java問題
