2010-02-19 18 views
13

Ich Refactoring eine große Menge an Code, wo ich einen zusätzlichen Parameter zu einer Reihe von Funktionen hinzufügen müssen, die immer einen Wert eines Mitglieds dieses Objekts haben wird. So etwas wieNicht statische Mitglieder als Standardparameter in C++

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(CMyObject &Object); 
    // used to be void MyFunc(); 
}; 

Jetzt würde, wie ich es eigentlich

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(CMyObject &Object = A); 
}; 

Aber ich bin nicht erlaubt zu lesen einen Standardparameter zu haben, die ein nicht-statisches Element ist. Ich habe gelesen this similar question, die vorschlagen, dass dies nicht möglich ist, aber ich frage mich, ob es eine sinnvolle Problemumgehung gibt. Der Grund dafür ist, dass 95% der Zeit der Standardparameter verwendet wird und somit die Verwendung eines Standardparameters die Menge an Code, die ich ändern muss, stark reduziert. Meine beste Lösung ist bisher so etwas;

Das ist weniger als elgant, aber gibt es eine bessere Möglichkeit, dies zu tun, die ich vermisse?

Bearbeiten: FWIW, der Grund für den zusätzlichen Parameter besteht darin, einige zustandsbezogene Elemente aus dem betreffenden Objekt zu externalisieren, um Multithreading zu unterstützen.

+0

Wenn es ein Datenelement hat, ist es per Definition nicht zustandslos. –

+0

Messepunkt Neil, Text bearbeitet. –

Antwort

18

Wie wäre:

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc() 
    { 
    MyFunc(A); 
    } 
    void MyFunc(CMyObject &Object); 
}; 

?

+0

Dank Benoit, ich wusste, dass es einen besseren Weg geben musste. Lange auf den Bildschirm starren. –

+0

Gern geschehen. Beachten Sie, dass Überladungen in C# und Java nicht zulässig sind, und dies ist der Ausgleich. Ich denke, ich habe nichts erfunden :-) –

+0

Ich denke, du meinst Standard-Parameter sind nicht erlaubt in C# und Java - sie erlauben sicherlich Überladungen (und Standard-Parameter sind offenbar in C# 4.0) –

4

Ein anderer Weg:

class MyClass 
{ 
public: 
    MyObject A,B; 

    void MyFunc(MyObject MyClass::*myObject = &MyClass::A) { 
     MyObject& obj = *(this->*myObject); 
    } 
}; 

Dies macht es auch unmöglich, von einer anderen MyClass Instanz in einem MyObject Mitglied passieren. Ihre drei gültigen Optionen zum Aufrufen von MyFunc sind .MyFunc(), .MyFunc(&MyClass::A) und .MyFunc(&MyClass::B)

Verwandte Themen