Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > Heritage et attributs protected > Lecture du sujet

Heritage et attributs protected

Quelque chiose qui m'échappe ...

Vous devez être inscrit pour pouvoir poster des messages

RésoluLe problème de ce sujet a été résolu

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne Masado # Posté le 03/07/2008 à 11:24:51
I'm a noob =)
Groupe : Membres
Bonjour,

Je code une classe qui gere la SDL pour moi, et la classe CSDL_Image herite de CSDL, j'ai donc besoin de blitter mon image sur l'écran.

Le compilo me dit que ma variable m_ecran est protected mais j'essaye d'y acceder depuis la classe fille donc c'est censé marcher non ?

Puisque mon code vaut mieux que de long discours ...

main.cpp :

Code : C
1
2
3
4
5
CSDL fenetre(true, false); /** Creation de la fenetre
    Le second parametre est un booléen qui signale si le jeu se lance en plein ecran ou pas
    */
    CSDL_Image fond("images//fond.bmp");
    fenetre.miseEnPlaceSurface(fenetre, 0, 0); /* Les deux derniers parametres indique la position de l'image en x et y */


Le main est coupé mais le reste sert a rien ;)

la class CSDL :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
CSDL::CSDL(bool fenetre, bool fullscreen, long hauteur, long largeur)
{
    m_largeur = largeur;
    m_hauteur = hauteur;
    if(fenetre)
    {
        SDL_Init(SDL_INIT_VIDEO);
        if (fullscreen)
        {
            m_ecran = SDL_SetVideoMode(hauteur, largeur, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
            SDL_WM_SetCaption("MasaRPG", NULL);
        }
        else if (!fullscreen)
        {
            m_ecran = SDL_SetVideoMode(hauteur, largeur, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
            SDL_WM_SetCaption("MasaRPG", NULL);
        }
    }
    m_fenetre = true;
    m_surface = NULL;
}


Lui aussi est coupé, je vous met que les fonctions qui opere avec mon probleme

et dans CSDL_Image :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
void CSDL_Image::MAJSurface(CSDL &objet, int x, int y)
{
    m_position.x = x;
    m_position.y = y;
    if(m_position.x < 0 || m_position.x > 640)
    {
        m_position.x = 0;
    }
    if(m_position.y < 0 || m_position.y > 480)
    {
        m_position.y = 0;
    }
    SDL_BlitSurface(m_surface, NULL, objet.m_ecran, &m_position);
}


C'est a la derniere ligne de SDL_BlitSurface que le compilo me dit que m_ecran est "protected" mais m_ecran appartient pourtant a la classe mere ...

Alors est ce que c'est dut au fait que j'appelle l'instance depuis le main ?
Si oui je pourrais utiliser des accesseurs pour pallier le probleme mais est ce que SDL_BlitSurface ne modifie pas la valeur de m_ecran donc le getEcran() serait insufisant ?


Mon projet achevé : Alphator

Jeu réalisé en C++ a l'aide de la SDL. Version actuelle : 1.1.


 
Hors ligne raphamil # Posté le 03/07/2008 à 12:17:54
Avatar
Groupe : Membres
SI m_ecran est protected dans une classe CSDL, tu ne risques pas de pouvoir y accéder via une classe CSDL_Image (sauf si celle-ci hérite de la première) cf. dernier code.

(\__/)
(/¤.¤\) <= Lapinator ! ^^
('')|('')
Exécuter plusieurs fonctions au chargement d'une pageUne horloge temps réel grâce à Javascript (nouveau) • Séparer le comportement de la strucure (bientôt) • Chercher plus rapidement dans la doc Qt
72.73% apple-geek
 
Hors ligne Masado # Posté le 04/07/2008 à 11:11:28
I'm a noob =)
Groupe : Membres
Justement, CSDL_Image hérite de CSDL mais je ne peux pas acceder a m_ecran regarde mon CSDL_Image par toi même :

#ifndef DEF_CSDL_Image
#define DEF_CSDL_Image

#include <iostream>
#include <string>
#include <SDL/SDL.h>
#include <SDL/SDL_Image.h>
#include "CSDL.h"


Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class CSDL_Image : public CSDL
{
    public:
    ///CONSTRUCTEUR :
    CSDL_Image(char Str[], int x = 0, int y = 0);


    ///METHODE BLIT SURFACE :
    void MAJSurface(CSDL &objet, int x = -1, int y = -1);


    ///DESTRUCTEUR :

    ~CSDL_Image();


    ///ATTRIBUTS :
    private:

};

#endif

Mon projet achevé : Alphator

Jeu réalisé en C++ a l'aide de la SDL. Version actuelle : 1.1.


 
Hors ligne Hiura # Posté le 04/07/2008 à 12:09:49
Avatar
Groupe : Membres
c'est du c++, pas du c.

si par ~hasard~ dans la classe csdl tu as mis m_ecran private alors c'est normal que dans la classe fille tu ne puisses pas y accéder.

mais tu fais une erreur bien plus grave à mon avis :
tu as mal penser ton application. avec tes classes actuelles tu ne peux afficher qu'une seule surface dans ta fenêtre.

si tu veux une bibliothèque oo qui fasse mieux que la sdl, regarde du côté de la sfml. ;)
 
Hors ligne Masado # Posté le 04/07/2008 à 12:22:56
I'm a noob =)
Groupe : Membres
Bah m_ecran est en mode protected ^^

Euh oui c'est du c++ mais j'ai mis type="c" :p

Et pour la sfml ca m'interesse pas car je fais ca pour m'entraîner a manier le c++ donc aucun interêt mais merci quand même

voilà CSDL.h :

Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef DEF_CSDL
#define DEF_CSDL

#include <SDL/SDL.h>


class CSDL
{
    ///CONSTRUCTEUR
    public:
    CSDL(long hauteur, long largeur, int rouge = 0, int vert = 0, int bleu = 0, long x = 0, long y = 0);
    CSDL(bool fenetre, bool fullscreen, long hauteur = 640, long largeur = 480);
    CSDL(int x, int y); ///CONSTRUCTEUR QUI INDIQUE SEULEMENT DES POSITIONS !!!


    ///FONCTIONS SDL :

    void MAJEcran();
    void miseEnPlaceSurface(CSDL &objet1, CSDL &objet2, int x = -1, int y = -1);
    ///DESTRUCTEUR:

    ~CSDL();

    ///ATTRIBUTS :
    protected:
    SDL_Surface *m_ecran, *m_surface;
    SDL_Rect m_position;
    int m_rouge, m_vert, m_bleu;
    long m_hauteur, m_largeur;
    bool m_fenetre;
};

#endif


EDIT : J'ai une question, c'est quoi tout ces carrés rouge dans mon code ? =O
Édité le 04/07/2008 à 12:25:03 par Masado

Mon projet achevé : Alphator

Jeu réalisé en C++ a l'aide de la SDL. Version actuelle : 1.1.


 
Hors ligne Hiura # Posté le 04/07/2008 à 12:31:49
Avatar
Groupe : Membres
Les carrés rouges sont, je crois, un problème d'encodage/caractère inconnu. efface tes espaces et remets les "à la main" (sans copier collé).

Si tu ne peux pas accéder à m_ecran alors je sais pas.

Mais comme je l'ai dit, c'est pas terrible comme code. même si c'est pour s'entraîner. Si tu as 4 images à afficher, comment ferras-tu? (et sans rajouter trois surfaces dans ta classe, car c'est pas bien pensé).

Et je comprends pas ce que peux faire csdl_image par rapport à csdl...
 
Hors ligne Masado # Posté le 04/07/2008 à 12:42:25
I'm a noob =)
Groupe : Membres
J'ai pas fini de coder CSDL_Image et si jai plusieurs images a blit j'ai juste a créer un objet de type CSDL_Image avec le link de l'image et apres j'appelle ma methode qui blit/flip l'écran et ca prend deux lignes au lieu de trois et j'ai moins de parametres a indiquer.

Sinon j'avais mis dans CSDL_Image la méthode MAJEcran qui appellait une variable d'une instance CSDL donc le compilo aimait, j'ai delete cette fonction qui est plus étée inutile car elle se trouvait déjà dans CSDL ... lol

Donc maintenant le programme fonctionne bien =)


Merci a ceux qui ont éssayer de m'aider

Mon projet achevé : Alphator

Jeu réalisé en C++ a l'aide de la SDL. Version actuelle : 1.1.


 

Retour au forum "Langage C++" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 178 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0525s (0.0358s)