A „traditionellen“ C++ Klasse (nur einige zufällige Erklärungen) könnte folgendermaßen aussehen:C++ Klasse Zugriffsbezeichner Ausführlichkeit
class Foo
{
public:
Foo();
explicit Foo(const std::string&);
~Foo();
enum FooState
{
Idle, Busy, Unknown
};
FooState GetState() const;
bool GetBar() const;
void SetBaz(int);
private:
struct FooPartialImpl;
void HelperFunction1();
void HelperFunction2();
void HelperFunction3();
FooPartialImpl* m_impl; // smart ptr
FooState m_state;
bool m_bar;
int m_baz;
};
Ich fand immer diese Art der Zugriffsebene Spezifikation hässlich und schwer zu folgen, wenn der ursprüngliche Programmierer hat seine "Zugangsbereiche" nicht ordentlich organisiert.
einen Blick auf die Schnipsel in einem Java/C# Stil machen, erhalten wir:
class Foo
{
public: Foo();
public: explicit Foo(const std::string&);
public: ~Foo();
public: enum FooState
{
Idle, Busy, Unknown
};
public: FooState GetState() const;
public: bool GetBar() const;
public: void SetBaz(int);
private: struct FooPartialImpl;
private: void HelperFunction1();
private: void HelperFunction2();
private: void HelperFunction3();
private: FooPartialImpl* m_impl; // smart ptr
private: FooState m_state;
private: bool m_bar;
private: int m_baz;
};
Meiner Meinung nach ist dies viel einfacher in einem Header zu lesen, weil die Zugriffsbezeichner richtig neben dem Ziel, und nicht ein paar Zeilen entfernt. Ich fand dies besonders zutreffend, wenn ich mit Header-only Template-Code arbeitete, der nicht in das übliche "* .hpp/* .inl" -Paar getrennt war. In diesem Szenario überwältigte die Größe der Funktionsimplementierungen diese kleine, aber wichtige Information.
Meine Frage ist einfach und rührt von der Tatsache her, dass ich noch nie jemanden gesehen habe, der dies aktiv in ihrem C++ Code macht.
Angenommen, ich habe keine "Class View" -fähige IDE, gibt es irgendwelche offensichtlichen Nachteile bei der Verwendung dieser Ausführlichkeitsstufe?
Alle anderen Stil Empfehlungen sind willkommen!
Wie für Vorlagenfunktionsdefinitionen direkt in der Klassendefinition ... das ist okay für Einzeiler, aber es macht es wirklich schwer, die Klassenschnittstelle zu verstehen, sobald sie wächst. Ich persönlich teile meinen Header nicht in .h/.i, sondern setze die Definitionen der * big * -Funktionen am Ende der Datei. –