Sont des fonctions get et set populaire avec les programmeurs en C++?

Je viens du monde de C# à l'origine, et je suis en train d'apprendre le C++. Je me demandais obtenir et de définir des fonctions en C++. En C# à l'usage de ceux-ci sont très populaires, et des outils comme Visual Studio promouvoir l'utilisation par les rendant très facile et rapide à mettre en œuvre. Cependant, cela ne semble pas être le cas dans le C++ monde.

Voici le C# 2.0 code:

public class Foo
{
    private string bar;

    public string Bar
    {
        get { return bar; }
        set { bar = value; }
    }
}

Ou, en C# 3.0:

public class Foo { get; set; }

Peut les gens vont dire, bien quel est le point dans tout cela? Pourquoi ne pas simplement créer un domaine public et d'en faire une propriété plus tard si vous avez besoin d'; honnêtement, je ne suis vraiment pas sûr. Je viens de le faire sortir de bonne pratique parce que je l'ai vu faire tant de fois.

Maintenant parce que je suis tellement habitué à le faire, je me sens comme je devrais porter plus l'habitude de mon code C++, mais est-ce vraiment nécessaire? Je ne vois pas qu'il fait aussi souvent que avec C#.

De toute façon, voici le C++ de ce que je comprends:

class Foo
{
public:
    std::string GetBar() const; //Thanks for the tip Earwicker.
    void SetBar(std::string bar);
private:
    std::string bar;
}

const std::string Foo::GetBar()
{
    return bar;
}

void Foo::SetBar(std::string bar)
{
    //Also, I always wonder if using 'this->' is good practice.
    this->bar = bar;
}

Maintenant, pour moi, cela ressemble à beaucoup de travail de jambe; considérant l'aide de Visual Studio tools le C# mise en œuvre prendra littéralement secondes pour mettre en œuvre, et le C++ m'a pris beaucoup plus de temps pour type - j'ai l'impression que sa n'en vaut pas la chandelle, surtout quand l'alternative est de 5 lignes:

class Foo
{
public:
    std::string Bar;
}

De ce que je comprends, ce sont les avantages:

  • Vous pouvez modifier les détails de mise en œuvre pour les fonctions get et set, donc au lieu de retourner un domaine privé, vous pouvez revenir à quelque chose de plus intéressant.
  • Vous pouvez supprimer un get/set plus tard et en lecture/écriture seule (mais pour un public en face de l'interface, ce semble, ne sont pas bonnes).

Et les inconvénients:

  • Prend une éternité pour type, est-ce vraiment en vaut la peine? Généralement parlant. Dans certains cas, les avantages de faire ça en vaut la peine, mais je veux dire, en parlant en termes de "bonnes pratiques", est-il?

Réponse:

Pourquoi ai-je choisi la réponse avec moins de votes? J'étais en fait très proche de choix veefu réponse; cependant mon opinion personnelle (qui, apparemment, est controversée), c'est que la réponse sur egged le pudding.

La réponse que j'ai choisi, d'autre part, semble plaider deux côtés; je pense que les getters et les setters sont mal si utilisé en excès (par ce que je veux dire, quand il n'est pas nécessaire et serait briser le modèle d'affaires), mais pourquoi ne devrions-nous pas avoir une fonction appelée GetBalance()?

Assurément, ce serait beaucoup plus polyvalent que PrintBalance(); que si je voulais le montrer à l'utilisateur d'une autre manière que comme la classe voulait me faire? Maintenant, dans un certain sens, GetBalance() peut ne pas être suffisamment pertinent de soutenir que "getters et les setters sont bonnes, parce qu'il n'est pas (ou peut-être, ne devrait pas) être accompagnée d'un setter, et en parlant de qui, une fonction appelée SetBalance(float f) pourrait être mauvais (à mon avis) parce qu'elle impliquerait pour le responsable de l'implémentation de la fonction que le compte doit être manipulé à côté de la classe, ce qui n'est pas une bonne chose.

  • Notez que lors du passage d'un std::string dans une méthode, vous devez utiliser <code>const std::string&</code> plutôt que de plaine <code>std::string</code>, pour éviter une inutile copie; c'est un peu un piège si vous êtes en provenance d'un C#/Java arrière-plan.
  • Je n'aime pas utiliser this-> pour accéder aux membres. Je préfère préfixe de tous les membres avec m_. Il a le même effet, que le lecteur sache où la variable est venu.
  • Caspin: Sauf que cette-> est garanti pour fonctionner n'importe convention de nommage. Il n'y a rien pour m'arrêter de créer une variable locale ou un paramètre de fonction avec m_ préfixe. 😉 Et le this-> préfixe a également l'avantage que je peux l'ignorer quand il n'est pas nécessaire. 🙂
InformationsquelleAutor Nick Bolton | 2009-04-10