Informacje po opuszczeniu pętli nie zachowują się

0

Witam,
potrzebuję podpowiedzi związanej z zachowywaniem wartości przez zmienne w klasach dziedziczących po QObject.
Sprawa przedstawia się następująco:

class GameSession : public QObject
{
    Q_OBJECT
public:
    explicit GameSession(QObject *parent = nullptr);

//...
    bool prepareSessionForFirstRound(int SID);
    bool prepareDeck(PlayerIndex i, bool escape_to_different_thread = false);

private:

//...

    ServerSQLQuery serverQuery;

    QList<Player *> players;
};

Kiedy client gry potwierdza gotowość, sesja za pomocą
bool prepareSessionForFirstRound(int SID);
odpytuje bazę i w klasie Player uzupełnia zawartość kart:

bool GameSession::prepareDeck(PlayerIndex i, bool escape_to_different_thread)
{
    unsigned int id_player = players[i]->getDatabaseID();
    qDebug() << players[i];
    Player *ptr = players[i];

    qDebug() << ptr << players[i];

    if(!serverQuery.getPlayerDeck(id_player))
    {
        qDebug() << __FUNCTION__ << "Load deck failed";
        qDebug() << "\n" << serverQuery.getDbHost() <<
                    "\n" << serverQuery.getDbUser() <<
                    "\n" << serverQuery.getDbPort();
        return false;
    }
    else
    {

        QSqlQuery *query = new QSqlQuery(*serverQuery.getQuery());

        int i = 0;

        while (serverQuery.getQuery()->next()) {

            QString _name           = query->value("Name").toString();
            QString _description    = query->value("Description").toString();
            QString _event_game_key = query->value("Event_game_key").toString();

            int _idCard         = query->value("ID_Card").toInt();
            int _fervor         = query->value("Fervor").toInt();
            int _productivity   = query->value("Productivity").toInt();

            int _id_character_desc = query->value("Id_character_desc").toInt();
            int _id_image_card = query->value("Id_image_card").toInt();

            ptr->getDeck().at(i)->setDataBaseID(_idCard);
            ptr->getDeck().at(i)->setName(_name);
            ptr->getDeck().at(i)->setDescription(_description);
            ptr->getDeck().at(i)->setProductivity(_productivity);
            ptr->getDeck().at(i)->setFervor(_fervor);

            qDebug() << ptr->getDeck().at(i)->getDataBaseID();

        }
    }
    // W tym momencie już zmienne znowu mają domyślne wartości klasy
    ptr->shuffleDeck();

    qDebug() << "======================="; 

    for(int i = 0; i < ptr->getDeck().count(); i++)
    {
        qDebug() << ptr->getDeck().at(i)->getDataBaseID();
    }


    return true;

}

Tak tworzę nowe elementy do vectora dla klasy Player

Player::Player(QObject *parent) : QObject(parent)
{
    for(int i = 0; i<15; i++)
    {
        deck.append(new  Card(this));
        deck.at(i)->setObjectName(QString("Card nr: "+QString::number(i)));
        qDebug() << deck.at(i)->objectName();
    }
}

Przypuszczam, że gdzieś zawodzi mój brak wiedzy (pewnie błąd jest oczywisty) ale nie mogę wychwycić gdzie leży błąd. Będę wdzięczny, jeżeli jeszcze jakieś błędy przy okazji zostałyby wytknięte.

0

A jak wygląda klasa Player?
Btw, tą pętlę zapisałbym ciut inaczej:

    for(int i = 0; i < 15; i++)
    {
        Card *card = new Card(this);
        card->setObjectName("Card nr: " + QString::number(i)));

        deck.append(card);

        qDebug() << deck.at(i)->objectName();
    }
0
class Player : public QObject
{
    Q_OBJECT
public:
    explicit Player(QObject *parent = nullptr);
    ~Player();

    void cleanCards();
    void cleanData();
    void shuffleDeck();
    void scoreUp(int i = 0);

    QVector<Card *> getDeck() const;
    void setDeck(const QVector<Card *> &value);

    QVector<Card *> getHand() const;
    void setHand(const QVector<Card *> &value);

    QVector<Card *> getTable() const;
    void setTable(const QVector<Card *> &value);

    Card *getCardFromTable(int index);
    Card *getCardFromHand(int index);

    void removeCardFromTable(int index);
    void setCardValueOnTable(int index, Card *card);

    bool getMove() const;
    void setMove(bool value);

    void getStartHand();

    void getCardToHand();
    void putCardOnTable(int position_on_table, int position_on_hand);

    QString getName() const;
    void setName(const QString &value);

    unsigned int getDatabaseID() const;
    void setDatabaseID(unsigned int value);

    unsigned int getSocketDescription() const;
    void setSocketDescription(unsigned int value);

    unsigned int getScore() const;
    void setScore(unsigned int value);

    bool getReadiness() const;
    void setReadiness(bool value);

    bool getClientAppReadiness() const;
    void setClientAppReadiness(bool value);

    unsigned int getStackTimeout() const;
    void setStackTimeout(unsigned int value);

    QJsonDocument getMessage() const;
    void setMessage(const QJsonDocument &value);

signals:

public slots:

private:

    QString name;
    unsigned int databaseID{0};
    unsigned int socketDescription{0};
    unsigned int score{0};

    bool readiness{false};
    bool clientAppReadiness{false};

    unsigned int stackTimeout{0};

    QJsonDocument message;

    bool move{false};

    void fillDeckAndHand();

    QVector<Card *> deck;
    QVector<Card *> hand;
    QVector<Card *> table;

};
0

Ok, wiem na 90% co jest źle.
Bracie @BartoSAS, te twoje funkcje zwracające wektory z kartami zwracają ich kopie, a oryginalne wersje w obiekcie gracza nie są dotykane. Przerób według schematu:

 QVector<Card *>& getDeck();

i powinno śmigać

0

Niestety nie zaszły zmiany. :/

2

Ok - to trzeba wykluczyć, że query nic nie zwraca.
Daj jakieś z palca wpisywane wartości do pól typu QString, np. nieśmiertelne "DUPA", a do pól typu int 12345.

0

To już wykluczyłem. Query zwraca wartość.

Czy może być jeszcze problem w tym miejscu może:

class ServerInstance : public QTcpServer
{
    Q_OBJECT

public:
    ServerInstance();
    ~ServerInstance();

    bool startServer();

    // ...

private:

    QString getInstanceName() const;
    void setInstanceName(const QString &value);

    QString instanceName{"Server"};

    // ==== Game Session

    static QVector<GameSession *> rooms;

    void interpreter(int SID);

   

    // ==== Clients

    QVector<Client *> clients;

    Client *getClientBySID(int SID);
    ServerSQLQuery serverQuery;

};

Używam tego w ten sposób. Przychodzi JSON, a w nim informacja, następnie takim schematem działam:

void ServerInstance::interpreter(int SID)
{

GameSession *session = getRoomBySID(SID);

// ...

session->prepareSessionForFirstRound(SID);
                sendAnswerToPlayers(session->getPlayers().first()->getMessage(),
                                    session->getPlayers().last()->getMessage(),SID);
}

ale gdyby to nie działało, to bym nawet nie przeszedł pierwszego kroku (sparowania Player'ów).

1

Cóż, po kolei szukajmy.

//-> tu daj qDebuga albo QMessageBoxa listującego wartości jakie przesyłasz do setterów
            ptr->getDeck().at(i)->setDataBaseID(_idCard);
            ptr->getDeck().at(i)->setName(_name);
            ptr->getDeck().at(i)->setDescription(_description);
            ptr->getDeck().at(i)->setProductivity(_productivity);
            ptr->getDeck().at(i)->setFervor(_fervor);

poza tym pokaż kod od setCośTam, starczy po jednym od stringa i od inta.

0

Faktycznie - już w wewnątrz pętli nie zmienia danych...

WEJSCIE: 10 "HR" "" 2 2

-1
"Card"
"Description"
3
3

void Card::setProductivity(int value)
{
productivity = value;
}

void Card::setDescription(const QString &value)
{
description = value;
}

1

Cóż, chyba jednak te query cię Bracie kantuje :] Sugeruję zrobić test z DUPA i 12345 pisanymi z palca aby się upewnić, że jeśli coś do setterów faktycznie będzie wysłane to się zapisze w wektorze.

0

A czy tam po prostu w pętli nie brakuje ++i?
Dlatego ptr->getDeck().at(i)->setFervor(_fervor); cały czas ustawia wartość dla zerowego elementu

0

Właśnie też zauważyłem, jak przerabiałem kod na tę "Test-dupe" :D

Dzięki wielkie. Brakowało tego i w pętli

1 użytkowników online, w tym zalogowanych: 0, gości: 1