2016-05-29 12 views
-3

Ich möchte auf eine Variable einer Klasse in eine andere Klasse zugreifen und auf einen Wert festlegen, z. Wie im Code hier möchte ich die some_flag auf true in der secondClassFunction() setzen. Ist es möglich? Wenn ja, wie geht das?Zugriff auf eine Variable aus einer nicht verwandten Funktion in C++

Einschränkungen aufgrund Systemarchitektur:

  1. Die beiden Klassen sind nicht vererbbar.
  2. Die beiden Klassen sind auch nicht verwandt.
  3. Die Funktionssignaturen secondClassFunction() können nicht geändert werden.

Hier ist der Code-Schnipsel: -

#include <iostream> 
using namespace std; 

class FirstClass{ 
    bool some_flag; 
    public: 
     void setFlag(bool flag); 
     bool getFlag(); 
}; 

FirstClass::FirstClass(){ 
    some_flag(false); 
} 

class SecondClass{ 
    public: 
     void secondClassFunction(); 
} 

SecondClass::secondClassFunction(){ 
    // do something here. 

    // I want to access some_flag using SecondClass object. 
    // how to do this? 
} 

int main() { 
    SecondClass secObj; 
    secObj.secondClassFunction(); 
    return 0; 
} 

Wird Klassen-Wrapper helfen? Wenn ja, wie?

EDIT: -

Constraint 4. Kann nicht die Klassen friend-Funktionen machen.

Einschränkung 5. Die Flag-Variable kann nicht globalisiert werden.

Details: -

Die flag wird in einer Funktion gesetzt, die ein Mitglied von FirstClass ist. Ich möchte dieses flag in einer Funktion zurücksetzen, die Mitglied der SecondClass ist. Die beiden Klassen sind nicht vererbbar und ihre Zugriffsbezeichner können aufgrund von Einschränkungen der Systemarchitektur nicht geändert werden.

Die flag ist wie ein Semaphor, es wird von mehreren Aufgaben verwendet, um den Status einer Aktivität anzuzeigen, z. B. ob der Prozessor einen bestimmten Befehl von einer mobilen App erhalten hat oder nicht.

+1

'friend' Aufruf ist dein Freund. –

+3

@sleeptightpupper nein, 'Freund' ist dein * Feind *. Das richtige Design ist dein Freund. –

+1

Sie möchten auf 'some_flag' von welchem ​​Objekt zugreifen? –

Antwort

0

Es scheint, dass Sie keine Instanz der FirstClass interessiert. So funktioniert der folgende Ansatz für Sie:

void SecondClass::secondClassFunction() 
{ 
    // Create local instance of the object to change 
    FirstClass first; 
    first.setFlag(true); 
} 

Aber es macht überhaupt keinen Sinn. Sie müssen wissen, welches Objekt geändert werden soll.Ich würde drei Möglichkeiten vorschlagen:

  • Instanz FirstClass statischen, global oder Singleton machen und ändern Sie es
  • machen some_flag und seine Setter statische
  • Set Instanz der FirstClass zu Kontext vor SecondClass::secondClassFunction()
Aufruf

dritte Option erklärt:

class FirstClass; // Forward declaration 
class SecondClass 
{ 
... 
    FirstClass* firstClassInstance; 
... 
    void setFirstClassInstanceToModify(FirstClass* first) 
    { 
     firstClassInstance = first; 
    } 
... 
}; 

void SecondClass::secondClassFunction() 
{ 
    firstClassInstance->setFlag(true); 
} 

Und es ähnliche Aber

FirstClass first; 
... 
SecondClass second; 
... 
second.setFirstClassInstanceToModify(&first); 
second.secondClassFunction(); 

rufen stellen Sie sicher, die richtige und gültige Instanz haben, bevor secondClassFunction