Wpis z mikrobloga

Mam taki problem z Qt

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
  • 24
@sylwke3100: A tak bardziej po polsku? ( ͡° ʖ̯ ͡°)

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).
@kuhar: @KrzaQ2:

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
@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.
@KrzaQ2:

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.