Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问私有类变量时出现分段错误_C++_Qt - Fatal编程技术网

C++ 访问私有类变量时出现分段错误

C++ 访问私有类变量时出现分段错误,c++,qt,C++,Qt,我遇到的问题已经讨论过多次,但我仍然不知道如何解决我遇到的问题。我过去经常用C++编程,但由于工作而切换到java。我回到了C++,现在我有很多问题,内存管理/指针/引用等。这个问题源于。< /P> 在上下文中,这些是我正在处理的Qt5.14项目的文件 问题是我有一个名为loggerLevel的私有类变量,创建分段错误的方法是getLevel,它只返回loggerLevel的值。应该存储在变量中的是类头中定义的名为Level的枚举 我不知道问题是因为我缺乏知识,还是因为我误解了C++中的类是如何

我遇到的问题已经讨论过多次,但我仍然不知道如何解决我遇到的问题。我过去经常用C++编程,但由于工作而切换到java。我回到了C++,现在我有很多问题,内存管理/指针/引用等。这个问题源于。< /P> 在上下文中,这些是我正在处理的Qt5.14项目的文件

问题是我有一个名为
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);