6
votes

C ++ Spécificateur d'accès de classe Verbosité

une classe "traditionnelle" C ++ (juste quelques déclarations aléatoires) peut ressembler aux éléments suivants:

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;
};


1 commentaires

En ce qui concerne les définitions de la fonction de modèle directement dans la définition de la classe ... C'est bon pour des doublures, mais il est vraiment difficile de comprendre l'interface de la classe dès qu'elle grandit. Personnellement, je ne séparez pas mon en-tête dans .h / .i, mettez-moi-même mettre les définitions des fonctions gros au bas du fichier.


5 Réponses :


5
votes

Personnellement, je trouve cela très gênant de devoir spécifier le qualificateur d'accès pour chaque symbole. Cela rend les choses plus difficiles à lire, pas plus facilement et encourage la très mauvaise habitude de mélanger librement des choses privées et publiques tout au long de la définition de la classe. Je vois ce genre de désordre tout le temps. En C #, j'essaie d'atténuer cela avec #region privé , etc., qui encourage, espérons-le, encourage les futurs mainteneurs à garder les choses propres.


2 commentaires

Ha! Je gagne de 4 secondes. +1 :)


Re: régions; Lorsque je travaille dans VS et écrire un code spécifique à Windows, j'essaie d'utiliser également les directives de la région #pragma / EndRegion. C'est assez agréable que vs prend en charge cela pour C ++.



1
votes

Il n'y a rien de mal avec ça, bien que vous élevez des sourcils. L'avantage principal de la conservation des spécificateurs d'accès distincts est-il encourage à placer tous les membres privés et les méthodes au sommet de la classe - ensemble.

Si votre classe est trop grosse pour s'adapter à un screenfull, il ne devrait probablement pas être divisé en plusieurs catégories, et / ou toute fonctions implicitement en ligne doit être explicitement déclarée en ligne avec la mise en œuvre déployée par la classe. < / p>


4 commentaires

Je ne sais pas ce que c'est, mais la première version a l'air "off" à moi. Peut-être que c'est parce que je travaille principalement en C # depuis quelques semaines?


@Polytex: Peut-être, mais dans ce cas, je repère à Rahul G - Je déteste la réponse des licornes. (Je ne peux pas croire que je n'aime pas sérieusement typée que ...)


Vous n'avez pas besoin d'avoir inclus Je déteste les licornes en mon nom. J'ai édité mon nom le 1er avril et je suis bloqué avec elle pendant un mois. :(


@Rahul g: Avez-vous un défaut de méta ou de serveur ou un compte Super utilisateur? Si oui, vous pouvez "copier un profil" de ces comptes et cela corrigera votre nom. (Voir meta.stackexchange.com/questions/45208/... et meta.stackexchange.com/questions/45200/... )



0
votes

L'inconvénient de cette dernière approche est que c'est rarement fait, et ce n'est pas une bonne idée de surprendre d'autres développeurs de cette manière, et il faut que le modificateur d'accès soit dactylographié un million de fois. L'utilisation de l'approche traditionnelle permettra d'enregistrer avoir à saisir inutilement le modificateur de plus et encore et est également l'approche attendue.


0 commentaires

10
votes

"Quand à Rome, faites comme les Romains."

i, après avoir passé beaucoup de temps avec Java, comme le style de spécification de spécificateurs d'accès pour chaque champ et chaque méthode séparément. Cependant, lorsque je vais programmer en C ++, j'utilise toujours le style indiqué dans votre premier extrait de code.


3 commentaires

Bon de vous voir avoir votre nom corrigé: D


Y a-t-il un processus? Je suis allé m'ennuie après quelques grains ...


@Potatocorn: voir les commentaires ci-dessous la réponse de Billy.



0
votes

En effet, sémantiquement, cela ne fait aucune différence mais vous allez faire vous-même et vos collègues une excellente faveur si vous allez simplement suivre ce que vous êtes accepté.

Personnellement, j'aime ma classe comme si: P>

struct S {
    S(int m) : m(m) { }
    S(const S& o);
    S& operator=(const S& o);

    void f() const;
    std::string g();

private:
    void help();

private:
    int m;
};


0 commentaires