Witam,
mam problem z wektorem. Program wysypuje mi sie wtedy, gdy próbuje wykonać operacje na obiekcie umieszczonym w wektorze (np.próba wyświetlenia nazwy obiektu kończy się wyłączeniem programu, ale sprawdzenie czy wektor jest pusty nie powoduje problemów. W kodzie opisałem dokładniej gdzie znajduje się problem .Wklejam kod
MainWindow.h
ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <vector>
#include "produkt.h"
#include "dodawanie_nowego_produktu.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void pokaz_wektor(vector <Produkt> wektor);
private slots:
void on_dodaj_produkt_clicked();
private:
Ui::MainWindow *ui;
vector <Produkt> wektor_produktow;
Produkt temp_produkt;
Dodawanie_nowego_produktu okno_dodawania;
};
Dodawanie_nowego_produktu.h
#ifndef DODAWANIE_NOWEGO_PRODUKTU_H
#define DODAWANIE_NOWEGO_PRODUKTU_H
#include "produkt.h"
#include <QDialog>
namespace Ui {
class Dodawanie_nowego_produktu;
}
class Dodawanie_nowego_produktu : public QDialog, public Produkt
{
Q_OBJECT
public:
explicit Dodawanie_nowego_produktu(QWidget *parent = nullptr);
~Dodawanie_nowego_produktu();
Produkt wczytaj_nowy_produkt() ;
void dodaj_do_listy(QString text);
private slots:
void on_zakoncz_clicked();
private:
Ui::Dodawanie_nowego_produktu *ui;
QString temp_nazwa_produktu;
Produkt nowy_produkt;
double temp_wartosc_kcal, temp_ilosc_sztuk, temp_cena;
};
Produkt.h
#ifndef PRODUKT_H
#define PRODUKT_H
#include <QString>
using namespace std;
class Produkt
{
private:
QString nazwa;
double ilosc_sztuk, cena, wartosc_kcal;
public:
Produkt();
//settery
void setNazwa(QString text);
void setCena(double cen);
void setIlosc_sztuk(double ilosc);
void setWartosc_kcal(double wartosc);
//gettery
QString getNazwa();
};
#endif
Ciała klas
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dodawanie_produktu.h"
#include "dodawanie_nowego_produktu.h"
#include <QDebug>
#include <vector>
using namespace std;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//Funkcja pokaz_vector nie jest nigdzie wykorzystywana
void MainWindow::pokaz_wektor(vector <Produkt> wektor)
{
for (int i=0;i<wektor.size();i++)
{
qDebug()<<wektor[i].getNazwa();
}
}
void MainWindow::on_dodaj_produkt_clicked()
{
//W funkcji wczytaj_nowy_produkt otwieram nowe okno klasy
//Dodawanie_nowego_produktu i tam pobieram dane
temp_produkt =okno_dodawania.wczytaj_nowy_produkt() ;
//dodaje zwrócony obiekt do wektora
wektor_produktow.push_back(temp_produkt);
//sprawdzam czy obiekt dodał sie do wektora
//testowałem, obiekt dodaje się
if(wektor_produktow.empty()==true)
{
qDebug()<<"Pusty";
}
else
{
qDebug()<<"Niepusty";
//Program dochodzi tutaj wypisuje mi w konsoli "Niepusty"
//i kończy niezapowiedzianie się kończy bez oznajmienia jakiegokolwiek błędu
qDebug()<<wektor_produktow[0].getNazwa();//tak nie działa
// qDebug()<<temp_produkt.getNazwa();//działa bez problemu (Oczywiście po //wcześniejszym usunięciu linijki z wypisywaniem wektora)
}
}
Dodawanie_nowego_produktu.cpp
#include "dodawanie_nowego_produktu.h"
#include "ui_dodawanie_nowego_produktu.h"
#include <QDebug>
Dodawanie_nowego_produktu::Dodawanie_nowego_produktu(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dodawanie_nowego_produktu)
{
ui->setupUi(this);
}
Dodawanie_nowego_produktu::~Dodawanie_nowego_produktu()
{
delete ui;
}
Produkt Dodawanie_nowego_produktu :: wczytaj_nowy_produkt()
{
//tutaj wszystko działa poprawnie, obiekt jest zwracany
this->exec();
temp_nazwa_produktu= ui->nazwa_produktu->text();
temp_cena = ui->cena_za_sztuke->text().toDouble();
temp_wartosc_kcal = ui->wartosc_kcal->text().toDouble();
temp_ilosc_sztuk = ui->ilosc_sztuk->text().toDouble();
nowy_produkt.setNazwa(temp_nazwa_produktu);
nowy_produkt.setCena(temp_cena);
nowy_produkt.setIlosc_sztuk(temp_ilosc_sztuk);
nowy_produkt.setWartosc_kcal(temp_wartosc_kcal);
return nowy_produkt;
}
//funkcja nieużywana
void Dodawanie_nowego_produktu:: dodaj_do_listy(QString text)
{
ui->lista->addItem(text);
}
//funkcja zamykająca okno klasy Dodawanie_nowego_produktu
void Dodawanie_nowego_produktu::on_zakoncz_clicked()
{
this->close();
}
Produkt.cpp
#include "produkt.h"
Produkt::Produkt()
{
}
void Produkt::setNazwa(QString text)
{
nazwa= text;
}
void Produkt ::setCena(double cen)
{
cena=cen;
}
void Produkt::setIlosc_sztuk(double ilosc)
{
ilosc_sztuk=ilosc;
}
void Produkt::setWartosc_kcal(double wartosc)
{
wartosc_kcal=wartosc;
}
QString Produkt::getNazwa()
{
return nazwa;
}