Définir une fonction comme friend

Class

a marqué ce sujet comme résolu.

bonjour la communauté

voici je teste un point du langage sur les classes

voilà le programme d’exemple

main.cpp

#include <iostream>

int main()
{
    std::cout << "Hello world!" << std::endl;
    
    return 0;
}

screen.hpp

#ifndef SCREEN_H
#define SCREEN_H

#include <iostream>
#include <string>


class screen
{
    friend  void ges_screens::clear(ScreenIndex i);

public:

    using pos = std::string::size_type;

    screen() = default;


private:

    mutable size_t access_ctr{ 0 };

    pos cursor = 0, longueur = 0, largeur = 0;

    std::string contenu;


};

ges_screens.hpp

#ifndef GES_SCREENS_H
#define GES_SCREENS_H

#include<vector>
#include "screen.h"

class ges_screens
{
public:
    // ID d'emplacement pour chaque écran de la fenêtre
    using ScreenIndex =std::vector<screen>::size_type;
    // Réinitialisez l'écran  à la position donnée sur tous les blancs.
    void clear(ScreenIndex i) ;

private :
    std::vector<screen> screens{};
};

#endif // GES_SCREENS_H

et ges_screens.cpp

#include "ges_screens.h"

void ges_screens::clear(ScreenIndex i)
{

    screen &s = screens[i];  // s  est une référence à l'écran  que nous voulons effacer

    s.contenu = std::string(s.longueur * s.largeur, ' ');   // Réinitialisez le contenu de l'écran à tous les espaces vides.
}

le problème se situe dans screen.hpp: le compilateur hurle::'ges_screens' n'as pas été déclaré

mais quand je remplace friend void ges_screens::clear(ScreenIndex i); par friend class ges_screens; le programme compile mais je voudrais que seul la fonction ges_screens::clear() soit ami et non toute la classe.

merci d’avance pour vos éclaircissements.

Edit ache: Titre plus claire

+0 -0

Pour faire un friend d’une fonction membre, il faut avoir la déclaration complète de la classe, ce qui n’est pas le cas de friend class ges_screens qui n’a besoin que de l’identifiant de la classe.

Ce qui veut dire que screen.hpp doit inclure ges_screens.hpp et ges_screens.cpp inclure screen.hpp. Et bien sûr, toutes les manipulations de screen dans le .h de ges_screens doivent être déplacées dans le .cpp, y comprit l’initialisation du std::vector.

Après, si cela est vraiment gênant, il est toujours possible d’ajouter une classe intermédiaire qui n’implémente que clear(), est amie de screen et a comme ami ges_screen.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte