In Qt o C ++, come dovrei controllare se la mia variabile 'int' è stata definita?

2

Breve problema:

Come dovrei controllare se gli interi sono indefiniti, così come posso controllare QStrings per avere valori NULL?

Backstory:

Questo è il mio stile di codifica quando cerco di evitare di sovraccaricare le mie funzioni.

MyClass.h

public:
    QString string();          // Return private member variables
    int integer();

    void setString(QString s); // Set private member variables
    void setInteger(int i);

signals:
    void stringChanged();      // Signal that member variable has been changed
    void integerChanged();

protected:
    void myFunction();         // Internal functions
    void resetMemberVariables();

private:
    QString m_String;          // Private member variables
    int m_Integer;

MyClass.cpp

QString MyClass::string()
{
    return m_Integer;
}
int MyClass::integer()
{
    return m_Integer;
}

void MyClass::setString(QString s)
{
    m_String = s;
    emit stringChanged();
}
void MyClass::setInteger(int i)
{
    m_Integer = i;
    emit integerChanged();
}

void MyClass::myFunction() 
{
    if (!m_String.isNull()) {}
    if (!m_Int.isNull()) { /* This is obviously impossible */ }
    resetMemberVariables();
}
void MyClass::resetMemberVariables()
{
    if (!m_String.isNull()) { 
        m_String = QString::null;
        emit stringChanged();
    }
    if (!m_Integer.isNull()) {   // Impossible
        m_Integer = NULL;        // Pretty sure this is wrong
        emit integerChanged();
    }
}

TLDR:

Invece di usare i parametri nelle funzioni, lascio che l'utente imposti le variabili membro e faccia eseguire il codice a seconda che la variabile membro sia stata definita o meno. Alla fine, ho reimpostato tutte le variabili membro su un valore NULL.

Da quanto ho capito, int non può avere un valore NULL perché ogni spazio di memoria può essere interpretato come un numero intero. (Per favore correggimi se è sbagliato.)

Quindi, come dovrei controllare se sono state impostate le mie variabili int ?

  • Devo prenotare un numero fittizio?
  • Dovrei accoppiarlo con un bool?
  • Forse dovrei creare un QPair<int,bool> , il bool cambiando il suo stato definito o indefinito?
posta Akiva 09.08.2016 - 09:57
fonte

2 risposte

4

La soluzione migliore sarebbe evitare la possibilità di avere un intero non inizializzato, passando il valore con il costruttore. In questo modo l'utente della tua classe è costretto a passare un valore se vuole creare un'istanza della tua classe. Se si presuppone che l'utente non superi un int indefinito, il requisito per controllare questo scompare.

Ovviamente può essere così che il valore dell'int non può essere fornito fino a dopo l'instanciazione. Se questo è il caso, puoi ricorrere all'approccio del valore predefinito, ma dovresti assolutamente fare del tuo meglio per evitarlo, se possibile.

    
risposta data 03.09.2016 - 13:42
fonte
2

Posso pensare a tre possibili soluzioni:

Numero speciale: Assegna un numero speciale come -1 o il numero massimo consentito da qualcosa come std::numeric_limits<int>::max() o simili, che puoi garantire che il numero non debba mai essere impostato su ordinariamente.

Puntatore a int:
Non molto intuitivo, ma ha il compito. Usa NULL / nullptr proprio come faresti con una stringa. Non c'è motivo per cui non si possa usare un puntatore per l'int. Questo sposta anche la memoria dallo stack all'heap, il che potrebbe non essere desiderabile (anche se, di nuovo, la stringa che stai usando è già presente nell'heap, quindi è così?)

Variabile separata: Inoltre non è molto interessante, poiché significa che devi sempre modificare due variabili insieme. Ma potresti usare un booleano o simili per tracciare se il numero è stato impostato. Aggiunge anche alla memoria, che sarebbe davvero banale, ma potrebbe essere un problema. Se avessi un sacco di intere che volevi controllare in questo modo, potrebbe diventare un codice piuttosto gonfio.

Classe wrapper: Puoi racchiudere l'int nella sua classe e utilizzare uno dei tre metodi precedenti per verificare se è valido, con getter e setter e un metodo semplice per verificare se la variabile è attualmente valida.


La mia raccomandazione personale è di usare una classe wrapper che usi un puntatore. In questo modo ottieni solo i numeri interi, senza limiti e dovrebbe essere facile da leggere.

    
risposta data 09.08.2016 - 10:47
fonte

Leggi altre domande sui tag