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
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.
Sie sollten es als private Member-Funktion setzen. Dafür sind sie da.
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.
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
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.
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).
Warum überhaupt in Klassen einordnen? Siehe Frerichs Kommentar zu lhahns Antwort. – sbi
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;
}
Das wäre fast genau das, was ich geschrieben hätte, wenn das nicht schon geschrieben worden wäre. – sbi
- 1. Aufrufen einer Methode in einer Klasse C#
- 2. Aufruf einer Methode in einer Klasse
- 3. Aufruf einer Methode einer Klasse in einer anderen Methode in der gleichen Klasse in Python
- 4. Mit einer Methode aus einer anderen Klasse
- 5. Mit einer Methode einer abstrakten Klasse
- 6. unity3d, Rückgabewert von einer Klasse/Methode in einer anderen Klasse/Methode in Unity3D
- 7. Methode einer Klasse überschreibt alle Methoden einer anderen Klasse
- 8. Testen einer Klasse mit einer statischen Klasse/Methode Abhängigkeit
- 9. Repaint() Methode Aufruf in einer anderen Klasse
- 10. Methode in einer anderen Klasse aufrufen
- 11. moq nur eine Methode in einer Klasse
- 12. eine statische Methode in einer Klasse aufrufen?
- 13. Methode vs __init__ in einer Python-Klasse
- 14. Generische Methode in einer nicht-generischen Klasse?
- 15. abstrakte Methode in einer virtuellen Klasse
- 16. Eine statische Methode in einer Klasse deklarieren und als Methode einer anderen Klasse verwenden
- 17. Kann ich multiprocessing.Pool in einer Methode einer Klasse verwenden?
- 18. Problem beim Aufrufen einer Methode in einer eigenen Klasse
- 19. Java: Aufruf einer Methode in einer anderen Klasse
- 20. Verbieten des Überschreibens einer Methode in einer abgeleiteten Klasse
- 21. Aufruf einer Methode von einer Klasse in eine andere
- 22. Ist eine lokale Klasse in einer Methode einer Klasse ein Freund dieser Klasse?
- 23. Differenz von Variable bei der Platzierung von privatem Schlüsselwort in einer MFC-Klasse
- 24. Hinzufügen einer Methode zu einer untergeordneten Klasse mit dem Namen einer geerbten Methode
- 25. Aufruf einer Methode einer Klasse, die Thread aus einer anderen Klasse
- 26. Überprüfen Sie, ob eine Methode in einer erweiterten Klasse, aber nicht in einer übergeordneten Klasse existiert
- 27. Wie referenzieren Sie einen Wert einer Klasse innerhalb einer Methode in derselben Klasse in Objective-C?
- 28. reloadData Methode nicht von einer anderen Klasse
- 29. Klasse Reflexion von einer statischen Methode
- 30. Aufruf einer Methode aus einer anderen Methode in der gleichen Klasse in C++
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) . –
Ja. Das stimmt in einigen Fällen. – lhahne