Modifica la variabile da diverse librerie

0

Sto lavorando su un codice C ++ legacy con due librerie. Library1 è la principale e Library2 utilizza le classi dalla Library1 (quindi ci sono alcune #include "HeaderFromLibrary1" nella Library2).

Nel profondo del codice di Library1, c'è un lavoro fatto e quando succede qualcosa devo impostare una variabile booleana. Library2 deve essere in grado di ottenere questo valore e resettarlo.

Tutto il codice è orientato agli oggetti, quindi non ci sono variabili globali né funzioni C, ma solo oggetti classi.

Quale sarebbe il modo migliore per essere in grado di modificare questa variabile booleana da queste librerie?

Quello che ho fatto è che ho creato due nuovi file in Library1: SharedData.cpp e SharedData.h.

SharedData.h

#ifndef SHARED_DATA_H_
#define SHARED_DATA_H_

namespace MyNameSpace
{
    /*
    * Get the Boolean and reset it to FALSE.
    */
    boolean GetAndResetBoolean(void);

    /*
    * Set the Boolean.
    */
    void SetBoolean(void);
}

#endif

SharedData.cpp

#include "util/SharedData.h"
#include "Mutex.h"

namespace MyNameSpace
{
    static Mutex mutexBoolean;
    static boolean myBoolean;

    /**
    * Method used to set the boolean.
    */
    void SetBoolean(void)
    {
        ScopedLock lock(mutexBoolean);
        myBoolean= TRUE;
    }

    /**
    * Method used to get and reset the Boolean.
    */
    boolean GetAndResetBoolean(void)
    {
        ScopedLock lock(mutexBoolean);
        boolean currentBoolean = myBoolean;
        myBoolean = FALSE;
        return currentBoolean;
    }
}

Quindi includo SharedData.h nel file che ho bisogno di impostare il valore booleano (Library1) e anche nel file ho bisogno di ottenere il valore e resettarlo.

Non mi piace che devo creare 2 variabili "globali". Preferirei memorizzare il valore booleano in un oggetto, ma la durata dell'oggetto che imposta il valore booleano non è molto lunga. E non voglio includere alcuna HeaderFromLibrary2.h in Library1 perché Library2 utilizza Library1 e non il contrario.

Hai qualche consiglio?

    
posta J.PG 21.09.2017 - 10:03
fonte

1 risposta

4

Deep in the code of Library1, there is some work done and when something happens I need to set a boolean variable. Library2 has to be able to get this value and reset it.

Le librerie non sono più indipendenti l'una dall'altra. Per tutti gli scopi pratici, non sono più librerie separate. Perché library1 ora dipende da library2 per la cancellazione del flag thea.

All code is object-oriented, so there are no global variables

Sì, ci sono! La variabile di cui parli è globale. E no, avvolgendolo in getter un setter non lo cambierà, né lo avvolgerà in un Singleton . È uno stato globale ed è uno stato globale, non importa come lo acceda.

I would prefer to store the boolean in an object, but the lifetime of the object that sets the boolean is not very long.

Il booleano significa qualcosa. Forse hai bisogno di un oggetto che rappresenti quel qualcosa.

Do you have any recommendation?

Senza ulteriori informazioni sul problema e sul design, non è davvero possibile. Perché è il fatto che "devi modificare la variabile da librerie diverse" è questo il problema, non tutti i dettagli tecnici su come farlo.

A seconda di questi dettagli, potrebbe essere necessario ottenere un oggetto handle dalla prima libreria che ripristinerà il valore booleano al momento del rilascio o un callback per notificare il completamento di alcuni processi. Ma ciò che è appropriato non può essere veramente detto senza sapere cosa rappresenta il booleano.

    
risposta data 21.09.2017 - 10:53
fonte

Leggi altre domande sui tag