C++ 访问私有类变量时出现分段错误
我遇到的问题已经讨论过多次,但我仍然不知道如何解决我遇到的问题。我过去经常用C++编程,但由于工作而切换到java。我回到了C++,现在我有很多问题,内存管理/指针/引用等。这个问题源于。< /P> 在上下文中,这些是我正在处理的Qt5.14项目的文件 问题是我有一个名为C++ 访问私有类变量时出现分段错误,c++,qt,C++,Qt,我遇到的问题已经讨论过多次,但我仍然不知道如何解决我遇到的问题。我过去经常用C++编程,但由于工作而切换到java。我回到了C++,现在我有很多问题,内存管理/指针/引用等。这个问题源于。< /P> 在上下文中,这些是我正在处理的Qt5.14项目的文件 问题是我有一个名为loggerLevel的私有类变量,创建分段错误的方法是getLevel,它只返回loggerLevel的值。应该存储在变量中的是类头中定义的名为Level的枚举 我不知道问题是因为我缺乏知识,还是因为我误解了C++中的类是如何
loggerLevel
的私有类变量,创建分段错误的方法是getLevel
,它只返回loggerLevel的值。应该存储在变量中的是类头中定义的名为Level的枚举
我不知道问题是因为我缺乏知识,还是因为我误解了C++中的类是如何工作的,或者是它完全不同的东西。无论如何,如果有人能帮我,那就太好了:)
---下面是源代码---
logger.cpp
#包括“logger.h”
QString debugHTML=“”;
QString infoHTML=“”;
QString警告tml=“”;
QString errorHTML=“”;
QString criticalHTML=“”;
QString endHTML=“
”;
记录器::记录器(QObject*父对象,
QString文件名,
QTextEdit*编辑器):QObject(父对象)
{
m_editor=编辑器;
m_showDate=真;
loggerLevel=Level::INFO;
如果(!fileName.isEmpty()){
文件=新的QFile;
文件->设置文件名(文件名);
文件->打开(QIODevice::Append | QIODevice::Text);
}
}
无效记录器::写入(常量QString和值){
QString文本=值;
如果(m_showDate){
text=QDateTime::currentDateTime()
/*.toString(“dd.MM.yyyy hh:MM:ss”)+文本*/
.toString(“hh:mm:ss:”)+文本;
}
QTextStream out(文件);
out.setCodec(“UTF-8”);
如果(文件!=0){
out insertHtml(文本);
}否则{
//TODO:在此处添加QMessageBox时出错
}
}
无效记录器::写入(常量级别和级别、常量字符串和值){
Level prevLoggerLevel=记录器::getLevel();
记录器::设置级别(级别);
写入(值);
记录器::设置级别(prevLoggerLevel);
}
//--------二传手--------
无效记录器::设置级别(常量级别和级别){
loggerLevel=level;
}
无效记录器::setShowDateTime(布尔值){
m_showDate=值;
}
//--------吸气剂--------
记录器::级别记录器::getLevel(){
返回日志级别;
}
记录器::~Logger(){
如果(文件!=0){
文件->关闭();
}
}
记录器.h
\ifndef记录器\u H
#定义记录器
#包括
#包括
#包括
#包括
#包括
类记录器:公共QObject
{
Q_对象
公众:
显式记录器(QObject*父对象,
QString文件名=0,
QTextEdit*编辑器=0);
~Logger();
void setShowDateTime(布尔值);
枚举级别
{
调试,
信息,
警告
错误,
批评的
};
私人:
QFile*文件;
QTextEdit*m_编辑器;
布尔穆肖达特;
水平记录器水平仪;
信号:
公众时段:
无效写入(常量q字符串和值);
无效写入(常量级别和级别、常量字符串和值);
无效设置级别(常量级别和级别);
Level getLevel();
};
#endif//LOGGER\u H
MainWindow.cpp
#包括
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括“设置Dialog.h”
#包括“logger.h”
记录器*记录器;
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级)
,ui(新ui::Main窗口)
{
用户界面->设置用户界面(此);
QString logFileName=“log.txt”;
Logger*Logger=新的记录器(这个,logFileName,ui->loggerOutput);
logger->write(logger::Level::INFO,“logger初始化!”);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在工具按钮上单击()
{
设置对话框设置对话框;
设置Dialog.setModal(真);
设置Dialog.exec();
}
//控制器左侧
无效主窗口::在左操纵杆上,节气门滑动条已移动(内部位置)
{ui->l_leftJoystickX->setText(QStringLiteral(“X轴:%1%”)。arg(位置));}
void main window::在\u s\u leftjoy\u Throttle\u滑块移动(内部位置)
{ui->l_->setText(QStringLiteral(“Y轴:%1%”)。arg(位置));}
void main window::在\u s\u leftTrigger\u Throttle\u滑块上移动(int位置)
{ui->l_leftTrigger->setText(QStringLiteral(“触发器:%1%”)arg(位置));}
无效主窗口::在滑动条上移动(内部位置)
{ui->l_joystickThrottle->setText(QStringLiteral(“节流阀:%1%”)。arg(位置));}
//控制器右侧
无效主窗口::在右侧操纵杆X油门滑动条移动(内部位置)
{ui->l_rightJoystickX->setText(QStringLiteral(“X轴:%1%”)。arg(位置));}
void main window::在\u s\u rightjoy\u Throttle\u滑块移动(内部位置)
{ui->l_->setText(QStringLiteral(“Y轴:%1%”)。arg(位置));}
无效主窗口::在右触发按钮上,油门按钮移动(内部位置)
{ui->l_rightTrigger->setText(qstringTerral(“触发器:%1%”)arg(位置));}
无效主窗口::在键盘上油门滑块移动(内部位置)
{ui->l_键盘Throttle->setText(QStringLiteral(“Throttle:%1%”)。arg(position));}
void主窗口::在键盘上单击操作1
{
记录器->写入(记录器::级别::关键,“测试”);
}
有更多的文件,但我相信它们与问题无关,如果需要,我也可以发布其他文件
----解决方案-----强>
@churill Solution解释了解决此问题需要做什么,但我也将在下面详细介绍以完成此问题
因为我已经提前声明了
Logger*记录器
在MainWindow.cpp的顶部,创建一个新的记录器对象
Logger*Logger=新的记录器(这个,logFileName,ui->loggerOutput);
没有必要,因此调用转发声明变量名而不是创建新的记录器对象Logger *logger = new Logger(this, logFileName, ui->loggerOutput);
logger = new Logger(this, logFileName, ui->loggerOutput);