In dem bestimmten Codierungsstandard, der an meinem Arbeitsplatz erzwungen wird, folgen Accessormethoden in einer Klasse einer bestimmten Namenskonvention. Für jede gegebene Elementvariable hat der Getter den gleichen Namen, und dem Setter wird das Präfix Set
vorangestellt. Siehe Beispiel unten.Enum & Klassenmitgliedsfunktion mit demselben Namen
class Foo
{
public:
int Number() const { return m_number; }
void SetNumber(int number) { m_number = number; }
private:
int m_number;
};
Diese schrulligen wird, wenn ich eine Enumeration mit dem gleichen Namen haben:
enum class Number
{
One, Two, Three
};
class Foo
{
public:
Number Number() const { return m_number; }
void SetNumber(Number number) { m_number = number; }
private:
Number m_number;
};
Das obige Beispiel wird an einigen Stellen nicht kompiliert, da bestimmen kann der Compiler nicht, wenn ich mit Bezug bin der enum-Name oder der Funktionsname. Also, dies zu beheben, ohne den Codierungsstandard zu verletzen, würde ich ::
an Orten der Mehrdeutigkeit verwenden und ich beziehe mich tatsächlich auf die Enum:
enum class Number
{
One, Two, Three
};
class Foo
{
public:
::Number Number() const { return m_number; }
void SetNumber(::Number number) { m_number = number; }
void DoStuffWithNumber()
{
if (m_number == ::Number::One)
{
// Do stuff
}
}
private:
Number m_number;
};
Dies ist ein wenig verwirrend für die Leser des Codes, sondern auch ein bisschen nervig, um den Enumerationsnamen in bestimmten Kontexten vollständig zu qualifizieren. Es ist nicht immer geradlinig.
Was ist eine vernünftige Problemumgehung hier? Natürlich könnte ich etwas wie den Accessor zu GetNumber()
umbenennen, aber ich bin neugierig zu sehen, welche anderen Lösungen die Leute haben können.
Nun, Sie können den Namen des Getter nicht ändern können Sie? es ist ein Standard für die Codierung am Arbeitsplatz. Also, was ist dann mit dem Namen Plural? –
Wie fühlen Sie sich, Rig des Getters zu bekommen und nur einen Umwandlungsoperator zu liefern ('operator Number() {return m_number;}')? – NathanOliver
@NathanOliver Das ist weniger intuitiv, IMHO. Meine persönliche Präferenz besteht darin, Operatoren zu vermeiden, es sei denn, ich implementiere etwas mit einer eindeutigen und wohldefinierten Semantik (Kopieren/Verschieben, Streams, arithmetische Typen usw.) –