Les alternatives aux fonctions amies sont : Méthodes de classe d'encapsulation : définissez des méthodes dans la partie privée de la classe et exposez-les en tant que fonctions amies pour maintenir l'encapsulation et autoriser l'accès externe aux membres privés. Mode pont : utilisez la classe pont pour contenir un pointeur vers la classe cible et ajoutez-y une fonction ami pour déléguer la méthode de la classe cible. Métaprogrammation de modèles : utilisez la métaprogrammation de modèles pour manipuler les membres de la classe au moment de la compilation afin de permettre l'accès aux membres privés.
Une fonction ami est un type spécial de fonction qui peut accéder aux membres privés d'autres classes. Bien que les fonctions amies soient pratiques, elles brisent également l’encapsulation. Par conséquent, lors de la conception d’une classe, il est préférable d’éviter autant que possible d’utiliser les fonctions amies.
Voici quelques alternatives aux fonctions amies :
Encapsuler les méthodes de classe :
Définissez une méthode dans la partie privée de la classe et exposez-la en tant que fonction amie. Cela maintient l'encapsulation tout en permettant aux fonctions externes d'accéder aux membres privés.
Utiliser le modèle de pont :
Créez une classe de pont qui contient un pointeur vers la classe de destination. Ajoutez la fonction ami à la classe pont, puis déléguez les méthodes de la classe cible à la fonction ami.
Utilisation de la métaprogrammation de modèles :
Utilisez la métaprogrammation de modèles au moment de la compilation pour manipuler les membres de la classe. Cette méthode est plus complexe, mais permet d'accéder aux membres privés au moment de l'exécution.
Cas pratique :
Supposons que nous ayons une Person
类,其私有成员为 name
和 age
。我们要定义一个 printInfo
函数来打印 Person
information.
// 使用封装类方法 class Person { private: std::string name; int age; friend void printInfo(const Person& p) { std::cout << "Name: " << p.name << std::endl; std::cout << "Age: " << p.age << std::endl; } }; // 使用桥接模式 class PersonBridge { private: Person* person; public: PersonBridge(Person* p) : person(p) {} void printInfo() { std::cout << "Name: " << person->name << std::endl; std::cout << "Age: " << person->age << std::endl; } }; // 使用模板元编程 template <typename T> void printInfo(const T& p) { std::cout << "Name: " << p.name << std::endl; std::cout << "Age: " << p.age << std::endl; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!