Obiekt klasy
Logowanie
Start
Aktualności
Kursy
Dokumentacja
Artykuły
Forum
CodeDesk
Panel użytkownika
Nazwa użytkownika:
Hasło:
Zaloguj
Nie masz jeszcze konta?
Zarejestruj się!
Zapomniałem hasła
»
Forum
»
Programowanie
»
[C, C++] Szukam pomocy
Obiekt klasy
Ostatnio zmodyfikowano 2017-12-19 10:27
Autor
Wiadomość
Garniturek
Temat założony przez niniejszego użytkownika
Obiekt klasy
» 2017-12-18 20:04:01
Dzień dobry,
w klasie cWorker stworzono wskaźnik na obiekt klasy cSingIn. Kiedy użytkownik wejdzie w "Zaloguj się" i poprawnie wypełni dane logowania wraca na stronę główną aplikacji, gdzie może wypożyczyć książkę. Tutaj jest problem, ponieważ instrukcja warunkowa if(_cSignIn->get_signed()) sprawdzająca czy użytkownik jest zalogowany nie przepuszcza dalej działania programu, mimo, iż w poprzednim okienku użytkownik zalogował się i zmienił wartość zmiennej _signed na true. Wskaźnik na obiekt klasy cSignIn ma cały czas wartości zadeklarowane przed konstruktor domyślny. Stąd pytanie, w jaki sposób powinienem przesłać do klasy cWorker dane klasy cSignIn, aby w razie zalogowania można obsłużyć użytkownika?
#c++ #QtCreator
C/C++
cSignIn
::
cSignIn
(
QWidget
*
parent
)
:
QDialog
(
parent
)
,
ui
(
new
Ui
::
cSignIn
)
{
ui
->
setupUi
(
this
)
;
_db
.
setHostName
(
"localhost"
)
;
_db
.
setDatabaseName
(
"biblioteka"
)
;
_db
.
setUserName
(
"root"
)
;
_db
.
setPassword
(
""
)
;
connect
(
this
->
ui
->
pushButton
,
SIGNAL
(
clicked
(
bool
)
)
,
this
,
SLOT
(
onOk
()
)
)
;
connect
(
this
->
ui
->
pushButton_cancel
,
SIGNAL
(
clicked
(
bool
)
)
,
this
,
SLOT
(
onCancel
()
)
)
;
_signed
=
0
;
idStudent
=
0
;
}
void
cSignIn
::
onOk
()
//po kliknieciu buttona "OK"
{
if
(
!
_db
.
open
()
)
{
QMessageBox msgBox
;
msgBox
.
setText
(
"Błąd: nie można się połączyć z bazą!"
)
;
msgBox
.
exec
()
;
}
else
{
QSqlQuery query
;
query
.
exec
(
"SELECT * FROM uzytkownicy"
)
;
while
(
query
.
next
()
)
{
if
(
ui
->
lineEdit_UserName
->
text
()
==
query
.
value
(
1
)
.
toString
()
&&
ui
->
lineEdit_Password
->
text
()
==
query
.
value
(
2
)
.
toString
()
)
{
_signed
=
1
;
idStudent
=
query
.
value
(
0
)
.
toInt
()
;
qDebug
()
<<
"idStudent: "
<<
idStudent
;
}
}
_db
.
close
()
;
if
(
_signed
==
0
)
{
QMessageBox msgBox
;
msgBox
.
setText
(
"Zły login lub hasło"
)
;
msgBox
.
exec
()
;
}
else
{
close
()
;
}
}
}
cWorker
::
cWorker
()
:
_cSignIn
(
new
cSignIn
)
{
db
.
setHostName
(
"localhost"
)
;
db
.
setDatabaseName
(
"biblioteka"
)
;
db
.
setUserName
(
"root"
)
;
db
.
setPassword
(
""
)
;
}
void
cWorker
::
rent
(
QString id
)
//wypozycz
{
if
(
_cSignIn
->
get_signed
()
)
{
if
(
!
db
.
open
()
)
{
QMessageBox msgBox
;
msgBox
.
setText
(
"Błąd: nie można się połączyć z bazą!"
)
;
msgBox
.
exec
()
;
}
else
{
QSqlQuery query
;
query
.
exec
(
"UPDATE ksiazki SET StatusWypozyczenia = 1 WHERE id ="
+
id
+
""
)
;
//QString::number(_id)
// pobieranie.prepare("DELETE FROM ksiazki WHERE id = "+QString::number(_id)+"");
// pobieranie.bindValue("id", 1);
// pobieranie.exec(); SLUZY DO USUWANIA KSIAZKI Z BAZY DANYCH
QSqlQuery query2
;
qDebug
()
<<
_cSignIn
->
idStudent
;
query2
.
exec
(
"INSERT INTO Wypozyczenia (idUcznia, idKsiazki) VALUES ("
+
QString
::
number
(
_cSignIn
->
idStudent
)
+
","
+
id
+
" )"
)
;
qDebug
()
<<
_cSignIn
->
idStudent
;
db
.
close
()
;
}
}
else
{
QMessageBox msgBox
;
msgBox
.
setText
(
"Zaloguj się!"
)
;
msgBox
.
exec
()
;
}
}
P-167979
darko202
» 2017-12-19 10:27:00
1.
Trudno jest zrozumieć problem, bo widać kawałek z kodu klasy
ale nie widać kodu programu, w którym występuje opisywany problem.
Opis odnosi się do kodu, którego nie widzimy
przydałby się przynajmniej nagłówek klas które używasz
tak to jest wiele możliwości
2.
Widząc metodę cSignIn::cSignIn
zastanawiam się gdzie ustawiasz, że połączyłeś się z bazą
poza tym patrząc na polecenie connect z
https://dev.mysql.com/doc/connector-cpp/en/connector-cpp-examples-connecting.html
spodziewałbym się czegoś do
sql::Connection::isValid() checks whether the connection is alive
i potem zapamiętania tego faktu w obiekcie
// ? nie wiem dlaczego wybrałem mySQL - może jest to inna baza i podobna funkconalność
3.
w
cSignIn::onOk()
sprawdzasz czy udało się połączyć z bazą
if( !_db.open() )
jestem przekonany, że po wykonaniu connect można już zadawać zapytania
? robisz to bo nie uwzględniasz (? chyba) czy wykonałeś connect
czyli co się faktycznie dzieje ? - ponownie łączysz się z bazą ?
3.
skoro chcesz sprawdzić czy użytkownik jest w bazie
chyba prościej byłoby wykonać
* query.exec( "SELECT * FROM użytkownicy WHERE user=... AND password = .... " );
* sprawdzić ile rekordów zwróciło powyższe zapytanie
* sprawdzenie QSqlQuery::isNull
http://doc.qt.io/qt-5/qsqlquery.html#QSqlQuery
4.
>> w jaki sposób powinienem przesłać do klasy cWorker dane klasy cSignIn
* możesz skorzystać z funkcji zaprzyjaźnionej
http://cpp0x.pl/kursy/Programowanie-obiektowe-C++/Podstawy/Przyjazn/501
https://www.google.pl/search?ei=3sM4WsjvEovWwAKe7qH4BQ&q=c%2B%2B+klasy+funkcje+zaprzyja%C5%BAnione&oq=c%2B%2B+class+funkcje+z&gs_l=psy-ab.3.0.0i22i30k1.5489035.5497966.0.5500845.17.16.1.0.0.0.231.1736.9j5j2.16.0....0...1.1.64.psy-ab..0.15.1607...0j0i67k1j0i22i10i30k1j0i13k1j0i13i30k1j33i22i29i30k1.0.Ns7vgxOSfb0
* możesz też napisać funkcję w klasie A biorącą za argument funkcję w klasie B
np.
C/C++
bool
KlasaA
::
PolaczonoZBaza
(
klasaB kb
)
{
if
(
...
)
return
true
;
else
return
false
;
}
[
cpp
]
P-167989
« 1 »
Strona 1 z 1
»
Forum
»
Programowanie
»
[C, C++] Szukam pomocy
Regulamin
© Wszelkie prawa zastrzeżone 2005-2025