2009-08-07 16 views
0

Ich habe eine C++ - Klasse, in der viele der Member-Funktionen einen gemeinsamen Satz von Operationen haben. Es ist wichtig, diese allgemeinen Operationen in eine separate Funktion zu integrieren, um Redundanz zu vermeiden, aber wo sollte ich diese Funktion ideal platzieren? Es zu einer Member-Funktion der Klasse zu machen, ist keine gute Idee, da es keinen Sinn macht, eine Member-Funktion der Klasse zu sein und es als eine einzige Funktion in einer Header-Datei zu verwenden, scheint auch keine gute Option zu sein. Irgendwelche Vorschläge bezüglich dieser Designfrage?Platzierung einer Methode in einer Klasse

Antwort

4

Wenn die "Menge von Operationen" in einer Funktion eingekapselt werden kann, die nicht inhärent an die betreffende Klasse gebunden ist, sollte es wahrscheinlich eine freie Funktion sein (vielleicht in einem geeigneten Namespace).

Wenn es irgendwie an die Klasse gebunden ist nicht aber nicht eine Klasseninstanz erfordert es wahrscheinlich eine static Member-Funktion sein sollte, wahrscheinlich eine private Funktion, wenn sie nicht Teil der Klasse Schnittstelle bilden.

0

Sie sollten es als private Member-Funktion setzen. Dafür sind sie da.

+1

Dies ist eine schlechte Faustregel gilt: wie kann man mit viel, viel privaten Member-Funktionen am Ende machen (so haben Sie eine große Schnittstelle an zB Freunden ausgesetzt) . –

+0

Ja. Das stimmt in einigen Fällen. – lhahne

0

Ich bin mir nicht sicher, warum eine private Member-Funktion ist nicht die richtige Antwort, aber wenn es nicht ist, machen Sie es zu einer statischen Standalone-Funktion in der gleichen Datei als Mitglied Funktionen.

+0

Es ist in C++ unterlegen, es zu einem privaten zu machen, weil es dann Teil der sichtbaren (falls nicht zugänglich, d. H. Zum Freund) Schnittstelle der Klasse wird. Ein unbenannter Namespace ist auch die Möglichkeit, statische Funktionen heutzutage zu verwenden. – sbi

4

Machen Sie ihm eine freie Funktion in einem anonymen Namespace in der CPP-Datei, die die Funktionen definiert, die es verwenden:

namespace { 
    int myHelperFunction(int size, Bar &target) { 
     ... 
    } 
} 

int Foo::doTarget(Bar &target) { 
    return myHelperFunction(this->size, target); 
} 

template <typename IT> 
int Foo::doTargets(IT first, IT last, int size) { 
    size += this->size; 
    int total = 0; 
    while (first != last) { 
     total += myHelperFunction(size, *first); 
     ++first; 
    } 
    return total; 
} 

oder was auch immer.

Hierbei wird von einer einfachen Konfiguration ausgegangen, bei der die Elementfunktionen in einer Header-Datei deklariert und in einer Übersetzungseinheit definiert sind. Wenn es komplizierter ist, könnten Sie es entweder zu einer privaten statischen Elementfunktion der Klasse machen und es in einer der Übersetzungseinheiten definieren, die Elementfunktionsdefinitionen enthält (oder eine neue hinzufügen), oder geben Sie ihm einfach eine eigene Überschrift zerlegen die Dinge schon lange in Dateien.

0

Wenn Ihre C++ - Klasse die einzige Klasse ist, deren Member diese allgemeine Funktionalität verwenden, lege ich die Methode in die Klasse, die die Funktionalität verwendet. Wenn es jedoch eine Chance gibt, dass eine andere Klasse dieselbe Arbeit ausführen muss, sollten Sie sie in eine Hilfsklasse oder Bibliothek verschieben (etwas von dieser Art).

+0

Warum überhaupt in Klassen einordnen? Siehe Frerichs Kommentar zu lhahns Antwort. – sbi

3

Wenn mehrere Member-Funktionen Ihrer Klasse einen gemeinsamen Code verwenden, müssen Sie sich den freigegebenen Code ansehen, um zu entscheiden, wohin er geht.

Wenn der gemeinsame Code nur die öffentliche Schnittstelle der Klasse verwenden kann (also nicht auf private Membervariablen, geschützte Funktionen usw. zugreift), sollten Sie überlegen, ob andere Klassen denselben Code verwenden möchten. Wenn keine andere Klasse Verwendung der Funktion machen können, setzen Sie den gemeinsamen Code in eine globale (frei) Funktion in einem anonymen Namespace in der CPP-Datei, wie folgt aus:

namespace { 
    void mySharedCode() { 
    // ... 
    } 
} 

void MyClass::f() { 
    doThis(); 
    mySharedCode(); 
} 

void MyClass::g() { 
    doThat(); 
    mySharedCode(); 
} 

Wenn der gemeinsame Code nicht implementiert werden kann unter Verwendung von nur die öffentliche Schnittstelle (vielleicht verwendet der Code private Member-Variablen oder etwas), machen Sie es zu einer privaten Member-Funktion der Klasse. Wenn der gemeinsam genutzte Code jedoch nur einige (z. B. ein oder zwei oder drei) Mitgliedsvariablen Ihrer Klasse verwendet, können Sie dies ändern, damit die gemeinsam genutzte Funktion diese Werte als Variablen erhält. I.e.verwenden

// GOOD: free function in .cpp file used 
namespace { 
    int multiply(int a, int b) { 
    return a * b; 
    } 
} 
void MyClass::f() { 
    return multiply(m_a, m_b) + 3; 
} 

statt

// BAD: private member function used 
void MyClass::multiply() { 
    return m_a * m_b ; 
} 
void MyClass::f() { 
    return multiply() + 3; 
} 
+0

Das wäre fast genau das, was ich geschrieben hätte, wenn das nicht schon geschrieben worden wäre. – sbi

Verwandte Themen