4 Réponses :
Déclarez simplement le principal en dehors du myNamespace CODE> et spécifier global espace
:: code> dans une déclaration d'ami
Je ne vois pas pourquoi le compilateur ne verrait pas le principal de pfmain.cpp dans mon cas, mais cela fonctionne. Merci!
Les tentatives précédentes montreraient l'erreur "Erreur:" Int Main (Int, Char **) "aurait dû être déclarée à l'intérieur" :: "" qui aurait dû dire assez, mais je n'aurais jamais pu m'attendre à ce que le compilateur ne vérifie pas l'autre. .O Les fichiers pour le symbole envisagent comment les en-têtes sont configurés.
@Jaime in C ++ Main () doit être déclaré dans l'espace de noms global. Cependant, le nom n'est pas réservé et peut être utilisé pour les fonctions des membres et dans des espaces de noms entre autres lieux.
Une réponse courante peut être de fournir une classe "application" singleton, comme par exemple. qapplication dans qt, une réduction de votre alors vous réduisez votre préoccupation d'amitié à principal code> à quelque chose comme
Classe de classe code> vs vos autres classes, et vous savez comment faire cela. P> < / p>
La classe est déjà déjà un singleton, je n'ai tout simplement pas montré cette partie. Avoir un singleton ne résout pas le problème ..
Je ne pense pas que vous vouliez réellement faire ce que vous faites. Cela semble vraiment comme un hack et un problème de conception. Si vous souhaitez vraiment exposer les internes de votre classe dans certaines circonstances spécialisées, vous pouvez créer une classe d'accesseur qui est également définie dans votre bibliothèque.
Quelque chose comme cela pourrait fonctionner (peut avoir besoin de déclarations appropriées, etc. - ceci est juste un point de départ): p>
"En général, vous ne voulez pas casser aucune encapsulation pour des tests (ou comme maman disait," n'expose pas vos particuliers! "). La plupart du temps, vous devriez être capable de tester une classe En exerçant ses méthodes publiques. S'il y a des fonctionnalités importantes cachées derrière un accès privé ou protégé, cela pourrait être un signe d'avertissement qu'il y a une autre classe dans des difficultés à sortir pour sortir. "
Je ne vois pas cela différent de donner accès principal. Le problème est que ma classe est un singleton, instancié sans paramètres, mais j'ai besoin de définir un État à l'état principal avant de donner un contrôle à la classe dérivée de ProcessManager. Je ne veux pas que ces méthodes soient accessibles par la classe dérivée.
La méthode "test" n'est qu'un exemple ... sa non réellement utilisée pour tester
Donner Main code> Accès sonne comme une solution Sledgehammer - cela signifie pour toute fonction principale que tous vos privés deviennent publics. Il y a beaucoup de problèmes de conception (auto-imposé?) Ici. Si vous avez un code incontrôlable, la meilleure solution consiste à simplement le rendre testable par la conception. Une discussion complète de cela est probablement au-delà de la portée de cette question Stackoverflow, mais il conviendrait de bien vouloir explorer les techniques standard pour obtenir une certaine testabilité en place. Plumes a écrit un livre entier à ce sujet - un petit résumé est ici: Objectmentor.com/Resources / Articles / ...
Le principal est créé par moi et contrôlé par moi dans la bibliothèque, non par le dériver de ProcessManager, qui est l'endroit où le processus est situé. Certes que vous pouvez tromper le compilateur à choisir votre propre principal et que vous pourrez peut-être l'obtenir pour donner vos principaux privilèges escaladés, mais je ne vais pas pour ce niveau d'intégrité en ce moment.
Croyez-moi que je préférerais dire que le principal, ou même l'accesseur n'a accès qu'à ces 3 ou 4 membres protégés. Mais autant que je sache, il n'y a aucun moyen de le faire en C ++.
Ce que vous pouvez faire, c'est avoir une interface publiquement définie pour la partie "interne" de votre classe et créer une classe de mise en œuvre privée interne pour la mise en œuvre par défaut (personne à l'extérieur de la classe ne pourrait le voir). Vous pouvez ensuite permettre de remplacer cette implémentation par défaut avec une autre interface en permettant à l'appelant de le transmettre (et le constructeur par défaut pourrait simplement transmettre le fichier privé par défaut). Cela permet de rédiger un code qui peut remplacer la fonctionnalité si nécessaire sans une exposition excessive (par exemple, des tests d'unités pourraient «détecter» les appels de fonction internes dans la classe).
Laissez-nous Continuer cette discussion en chat
Je suis d'accord avec Bobbymcr ici; Le principal semble être une force trop forte sur la classe; Il est trop spécifiquement placé dans l'écosystème d'une application et, par conséquent, une présence aussi incertaine à un ami directement. Meilleur à un ami quelque chose d'un tampon autour des limites.
@parapura a fourni une solution, mais n'explique pas pourquoi em> vous devez d'abord déclarer [...] Si un Ainsi, à l'esprit, votre code ressemblerait à ceci: P> principal code> dans la portée globale.
§7.3. 1.2 [NAMESPACE.MEMDEF] P3 CODE> P>
DÉCLARATION CODE> DÉCLARATION D'UNE NON LOCALE DÉCLARRE UNE CLASSE OU FONCTION La classe ou la fonction d'ami est membre de l'espace de noms entourant la plus interne. [...] p>
blockQuote>
namespace MyNamespace
{ // MyNamespace is the innermost enclosing namespace
// 'main' from the friend declaration is treated
// as if it was a member of 'MyNamespace'
int main(int argc, char** argv);
class ProcessManager
{
public:
friend int main(int argc, char** argv);
private:
void test();
};
};
C'est un peu hors sujet, mais beaucoup de gens diraient que le mot clé
ami code> n'est jamais une bonne solution.
Ce n'est pas idéal je suis d'accord, mais parfois vous n'avez aucune autre bonne alternative
Pourrait vouloir envisager d'amener d'autres variantes de
principal () code>. Pas sûr s'ils sont sur Facebook cependant.