C++ : Méthode amie privée

Répondre
Partager Rechercher
Salut à tous,

J'ai un léger soucis de code design. Voici l'histoire: je possède une classe A qui contient un certain type de contenu, et une autre classe B qui décide quel type de contenu la première va afficher.

Jusqu'à présent les setters de la classe A étaient publics. Mais je veux les passer privés car n'importe qui peut venir la modifier (et ça s'est produit).

Du coup, l'idée est de rendre la classe B amie de la classe A, mais là encore c'est trop permissif. Seule UNE méthode de la classe B devrait pouvoir communiquer avec A. Ainsi les utilisateurs qui feront des requêtes à B, devront passer par tous les filtres avant de voir leur requête satisfaite.

Donc en gros ce que je veux c'est:

class B{

private:

virtual void setAContent( ... );

}

class A{

private:

virtual void setContent( ... );

friend virtual void B::setAContent( ... );
}

Lorsque je compile je reçois l'erreur suivante:

Citation :
Error 1 error C2248:
DisplaysReconfigurationService::setDisplay' : cannot access private member declared in class
DisplaysReconfigurationService'
L'erreur apparaît à la compilation de chacune des classes séparément, et avec le même texte.


Seule solution à date ... passer la méthode B::setAContent ( ... ) ... publique.

Ce qui évidement détruit tout l’intérêt du système.

Avez vous une solution ?

Merci !
Quand on pose ce genre de questions, on devrait toujours fournir une copie exacte du code qui ne compile pas, pas juste une simplification du problème... Et le compilateur et sa version.

Clang 4.1 sur Mac OS X Lion compile le code ci-dessous sans warnings. C'est ce que tu cherches à faire, non ?

Code:
class A;

class B
{
    A* a;
    virtual void setAContent(int content);
};

class A
{
    int aContent;
    
    virtual void setContent(int content)
    {
        aContent = content;
    }
    
    friend virtual void B::setAContent(int content);
};

void B::setAContent(int content)
{
    a->setContent(content);
}
J'ai l'impression que ton problème est plutôt lié à l'ordre des déclarations et du coup ta déclaration amie n'est pas prise en compte. L'erreur que tu cites est la seule relevée par le compilateur ? Commence par confirmer que ton compilateur est content avec mon code et ensuite copie-colle un exemple qui compile pas.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés