MainWindow mam jakaś tam klasę przypuśćmy że nazywa się A W konstruktorze MainWindow uruchamiamy metody A i przypisujemy im jakieś wartości. Teraz mam combobox i wywołuje metode currentIndexChanged podczas zmiany obiektu w Comboboxie
Problem jest taki że w tej metodę currentIndexChanged nie mogę zmodyfikować żadnych obiektów z A bo traktuje je jako nową nie zainicjowaną zmienną lokalną wywalając SIGSEGV.
Bo trochę nieskładnie piszesz, a do tego chyba mieszasz pojęcia klasy z obiektem (egzemplarzem klasy), i metody z... nawet nie wiem czym, z jej argumentem?
@sylwke3100: No i w C++ nie ma czegoś takiego jak "niezainicjowana zmienna lokalna". Co najwyżej, jeżeli to wskaźnik, to może być NULLem (i zrobienie z nim czegokolwiek musi się kończyć segvaultem).
MainWindow(){ A = ProblematycznaKlasa(cośprzekazujemy); A.jakasmetoda(); }
void on_timetableTypeComboBox_currentIndexChanged(const QString &arg1){ A.zmienDane( ui->jakisComboBox->currentIndex()+1); } }; No i kiedy zmieniam jakąś pozycje w Comboboxie to się tam metoda ostatnia uruchamia i zgodnie z moimi oczekiwaniami powinna powinna zmienić wartości w użytej już klase A za pomocą metody zmienDane jednak tego nie robi tylko się wywala że zmienna
@KrzaQ2: Lokalna? Ok, rzeczywiście może, jeżeli jest typem prostym, w tym wskaźnikiem, mój błąd. Przyzwyczaiłem się do -Wall, które to wychwytuje - nie wiem, czemu to nie jest domyślnie error. Ale nie występuje między nimi problem kolejności incjalizacji (to tylko z globalnymi), bo ich kolejność jest ściśle ustalona, i wcześniejsze nie mogą zależeć od poprzednich (chyba, że ja bardzo czegoś nie wiem).
@sylwke3100: A jest typu ProblematycznaKlasa czy ProblematycznaKlasa*
@sylwke3100: Jedyne co mi przychodzi do głowy: setupUi w kodzie inicjalizacyjnym wywołuje coś, co łączy się z on_timetableTypeComboBox_currentIndexChanged zanim zainicjalizujesz tramsBase - ale to by się musiało wywalać zaraz po utworzeniu klasy, a nie z opóźnieniem,
albo to: ui->timetableTypeComboBox->addItems(timetableTypesBase->getAll()); - nie spowoduje wywołania on_timetableTypeComboBox_currentIndexChanged?
@sylwke3100: A, to chyba proste jest, @KrzaQ2 mnie naprowadził. Myślę, że ui->timetableTypeComboBox->addItems(timetableTypesBase->getAll()); powoduje emisję currentIndexChanged.
Jak by nie było, rozwiązanie sprowadza się do dodania if (tramsBase) do handlera currentIndexChanged.
void TramListModel::setDayType(int daytype) { qDebug()<< daytype; if (daytype >0) this->dayType = daytype; else this->dayType = 1; } Kwestią jest to że mi debugger wskazuje własnie na tą zmienną (czyli dayType) w setDayType jakoby ona nie była zainicjowana
@sylwke3100: To jest pierwsza rzecz z TramListModel którą sprawdzasz. Jeśli moja hipoteza jest prawdziwa, a jest przynajmniej sensowna, to tramBase jest śmieciem z pamięci, więc tramBase->setDayType wywoła się dla obiektu - śmiecia
@KrzaQ2: AFAIK domyślny konstruktor zeruje pola będące typami prymitywnymi, więc tramBase(nullptr) nie jest potrzebne.
@sylwke3100: wywołanie metody powodzi się zawsze, niezależnie od tego, czy this jest poprawnym wskaźnikiem. Dopiero odwołanie się do atrybutu powoduje naruszenie pamięci - dlatego problematyczne jest this->dayType.
MainWindow mam jakaś tam klasę przypuśćmy że nazywa się A
W konstruktorze MainWindow uruchamiamy metody A i przypisujemy im jakieś wartości.
Teraz mam combobox i wywołuje metode currentIndexChanged podczas zmiany obiektu w Comboboxie
Problem jest taki że w tej metodę currentIndexChanged nie mogę zmodyfikować żadnych obiektów z A bo traktuje je jako nową nie zainicjowaną zmienną lokalną wywalając SIGSEGV.
Jak uzyskać do niej dostęp?
#qt #programowanie #cpp
Bo trochę nieskładnie piszesz, a do tego chyba mieszasz pojęcia klasy z obiektem (egzemplarzem klasy), i metody z... nawet nie wiem czym, z jej argumentem?
Taki trochę pseudo kod:
class MainWindow {
ProblematycznaKlasa *A
//tujakis kod od qt
MainWindow(){
A = ProblematycznaKlasa(cośprzekazujemy);
A.jakasmetoda();
}
void on_timetableTypeComboBox_currentIndexChanged(const QString &arg1){
A.zmienDane( ui->jakisComboBox->currentIndex()+1);
}
};
No i kiedy zmieniam jakąś pozycje w Comboboxie to się tam metoda ostatnia uruchamia i zgodnie z moimi oczekiwaniami powinna powinna zmienić wartości w użytej już klase A za pomocą metody zmienDane jednak tego nie robi tylko się wywala że zmienna
A?-Wall, które to wychwytuje - nie wiem, czemu to nie jest domyślnie error. Ale nie występuje między nimi problem kolejności incjalizacji (to tylko z globalnymi), bo ich kolejność jest ściśle ustalona, i wcześniejsze nie mogą zależeć od poprzednich (chyba, że ja bardzo czegoś nie wiem).@sylwke3100:
Ajest typuProblematycznaKlasaczyProblematycznaKlasa*setupUiw kodzie inicjalizacyjnym wywołuje coś, co łączy się zon_timetableTypeComboBox_currentIndexChangedzanim zainicjalizujesztramsBase- ale to by się musiało wywalać zaraz po utworzeniu klasy, a nie z opóźnieniem,albo to:
ui->timetableTypeComboBox->addItems(timetableTypesBase->getAll());- nie spowoduje wywołaniaon_timetableTypeComboBox_currentIndexChanged?ui->timetableTypeComboBox->addItems(timetableTypesBase->getAll());powoduje emisjęcurrentIndexChanged.Jak by nie było, rozwiązanie sprowadza się do dodania
if (tramsBase)do handlera currentIndexChanged.void TramListModel::setDayType(int daytype){
qDebug()<< daytype;
if (daytype >0)
this->dayType = daytype;
else
this->dayType = 1;
}
Kwestią jest to że mi debugger wskazuje własnie na tą zmienną (czyli dayType) w setDayType jakoby ona nie była zainicjowana
TramListModelktórą sprawdzasz. Jeśli moja hipoteza jest prawdziwa, a jest przynajmniej sensowna, totramBasejest śmieciem z pamięci, więctramBase->setDayTypewywoła się dla obiektu - śmieciatramBase(nullptr)nie jest potrzebne.@sylwke3100: wywołanie metody powodzi się zawsze, niezależnie od tego, czy
thisjest poprawnym wskaźnikiem. Dopiero odwołanie się do atrybutu powoduje naruszenie pamięci - dlatego problematyczne jestthis->dayType.@frax: Metoda Krzaqa działa.
@frax: nie