Программа на c++ аварийно завершается в Qt Creator
Пытаюсь написать программу на c++ в Qt Creator, которая бы читала простой *.obj файл. Вроде всё должно работать, но получаю следующий вывод приложения:
Starting C:...\build-client-3d-Desktop_x86_windows_msys_pe_64bit-Debug\debug\client-3d.exe...
C:...\build-client-3d-Desktop_x86_windows_msys_pe_64bit-Debug\debug\client-3d.exe аварийно завершился.
modelloader.cpp:
#include "modelloader.h"
#include <fstream>
#include <sstream>
#include <stdexcept>
#include <QDebug>
ModelLoader::ModelLoader() {}
void ModelLoader::readFromObjFile(const QString& filename) {
std::ifstream objFile(filename.toStdString());
std::string line;
if (!objFile.is_open()) {
throw std::runtime_error("Cannot open the file: " + filename.toStdString());
}
while (getline(objFile, line)) {
std::istringstream lineStream(line);
std::string type;
lineStream >> type;
if (type == "v") {
double x, y, z;
lineStream >> x >> y >> z;
nodes.push_back(std::make_shared<node>(x, y, z));
} else if (type == "f") {
int idx1, idx2, idx3;
lineStream >> idx1 >> idx2 >> idx3;
// Используем get() для получения обычных указателей из shared_ptr для передачи в конструктор triangle
triangles.push_back(std::make_shared<triangle>(true, nodes[idx1 - 1].get(), nodes[idx2 - 1].get(), nodes[idx3 - 1].get()));
}
}
objFile.close();
}
modelloader.h:
#ifndef MODELLOADER_H
#define MODELLOADER_H
#include "Node.h"
#include "Triangle.h"
#include <vector>
#include <QString>
class ModelLoader
{
public:
ModelLoader();
void readFromObjFile(const QString& filename);
private:
std::vector<std::shared_ptr<node>> nodes;
std::vector<std::shared_ptr<triangle>> triangles;
};
#endif // MODELLOADER_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "modelloader.h"
#include <QDebug>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
try {
// Создаем экземпляр загрузчика моделей
ModelLoader loader;
// Попытка загрузить модель
loader.readFromObjFile("./simple_triangle.obj");
} catch (const std::runtime_error& e) {
qDebug() << "Error loading model: " << e.what();
QMessageBox::critical(this, "Loading error", "Could not load the model: " + QString(e.what()));
}
}
MainWindow::~MainWindow()
{
delete ui;
}
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
.obj файл:
v 0.0 0.0 0.0
v 1.0 0.0 0.0
v 0.0 1.0 0.0
f 1 2 3