IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

CMyView::GetDocument() ayant en type de retour int* au lieu de CMyDoc*


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut CMyView::GetDocument() ayant en type de retour int* au lieu de CMyDoc*
    Bonjour,

    Je travaille avec Visual C++ 2008, sur un SDI avec un splitter partageant 2 vues : splitter4View(CFormView) et MyView(CView) avec comme 'vue principale' splitter4View.

    Dans splitter4View, l'initialisation de GetDocument() se passe bien, mais pas pour MyView :

    Dans CMyView.cpp, je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Csplitter4Doc* CMyView::GetDocument() const // la version non déboguée est en ligne
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Csplitter4Doc)));
    	return (Csplitter4Doc*)m_pDocument;
    }
    et dans CMyView.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public:
    	Csplitter4Doc* GetDocument() const;
    Et le compilateur me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    myview.cpp(233) : error C2556: 'Csplitter4Doc *CMyView::GetDocument(void) const'*: la fonction surchargée ne diffère que par le type de retour de 'int *CMyView::GetDocument(void) const'
    myview.cpp(233) : error C2371: 'CMyView::GetDocument'*: redéfinition*; types de base différents
    myview.h(11) : error C2143: erreur de syntaxe*: absence de ';' avant '*'
    (la ligne 233 est la 2ème ligne de l'extrait du code .cpp
    la ligne 11 est la 2ème de l'extrait de code .h)

    Je ne vois absolument pas d'où vient cette fonction avec comme type de retour "int *" alors que Csplitter4Doc existe.

    Je n'ai pas mis tout le code pour ne pas charger le sujet...

    Si quelqu'un pourrait m'aider, je l'en remercie d'avance.

    Christophe

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    tu dois avoir une autre méthode GetDocument() dans ta classe, d'où l'erreur signalée.
    il faudrait voir la définition de classe.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Une autre possibilité est qu'il ne connait pas Csplitter4Doc (et donc une autre erreur ailleurs) ?
    'class Csplitter4Doc;' dans CMyView.h ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    Le problème, c'est qu'il n'y a pas de deuxième 'GetDocument()', il n'y en a qu'un. Qui plus est, lorsque je demande "d'atteindre la déclaration" de GetDocument(), je tombe sur la fonction énoncée en haut qui a le bon type de retour.

    MyView.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    // MyView.cpp*: fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "splitter4.h"
    #include "MyView.h"
    #include "Mesure.h"
    #include "splitter4Doc.h"
     
    #define border 10;
     
    // CMyView
     
    IMPLEMENT_DYNCREATE(CMyView, CView)
     
    CMyView::CMyView()
    {
     
    }
     
    CMyView::~CMyView()
    {
    }
     
    BEGIN_MESSAGE_MAP(CMyView, CView)
    END_MESSAGE_MAP()
     
     
    // Dessin CMyView
     
    double f1(double r)
    {
    	//return sin(r);
    	return r-5;
    }
     
    void CMyView::OnDraw(CDC* pDC)
    {
    	//CDocument* pDoc = GetDocument();
    	Csplitter4Doc* pDoc = GetDocument();
    	// TODO*: ajoutez ici le code de dessin
    	ASSERT_VALID(pDoc);
    	CRect rect,PlotRect;
    	GetClientRect(rect);
     
            /* Calculs et écriture d'un graphe */
            [...]
     
    }
     
    Csplitter4Doc* CMyView::GetDocument() const // la version non déboguée est en ligne
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Csplitter4Doc)));
    	return (Csplitter4Doc*)m_pDocument;
    }
     
    // Diagnostics de CMyView
     
    #ifdef _DEBUG
    void CMyView::AssertValid() const
    {
    	CView::AssertValid();
    }
     
    #ifndef _WIN32_WCE
    void CMyView::Dump(CDumpContext& dc) const
    {
    	CView::Dump(dc);
    }
    #endif
     
    //Rajout
    /*
    Csplitter4Doc* CMyView::GetDocument() const // la version non déboguée est en ligne
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Csplitter4Doc)));
    	return (Csplitter4Doc*)m_pDocument;
    }
    */
    #endif //_DEBUG
     
     
    // Gestionnaires de messages de CMyView
    MyView.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #pragma once
     
     
    // Vue CMyView
     
    class CMyView : public CView
    {
    	DECLARE_DYNCREATE(CMyView)
     
    public:
    	Csplitter4Doc* GetDocument() const;
     
    protected:
    	CMyView();           // constructeur protégé utilisé par la création dynamique
    	virtual ~CMyView();
     
    public:
    	virtual void OnDraw(CDC* pDC);      // substitué pour dessiner cette vue
     
    /*public:
    	Csplitter4Doc* GetDocument() const;*/
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    #ifndef _WIN32_WCE
    	virtual void Dump(CDumpContext& dc) const;
    #endif
     
    #endif
     
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    J'ai déplacé GetDocument() dans le .cpp et dans le .h et je ne vois toujours pas pourquoi j'ai ce problème...

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    C'est bien ce qu'il me semble il manque la déclaration de Csplitter4Doc dans CMyView.h.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #pragma once
     
     class Csplitter4Doc;
    // Vue CMyView
     
    class CMyView : public CView
    {
    	DECLARE_DYNCREATE(CMyView)
     
    public:
    	Csplitter4Doc* GetDocument() const;
     
    protected:
    	CMyView();           // constructeur protégé utilisé par la création dynamique
    	virtual ~CMyView();
     
    public:
    	virtual void OnDraw(CDC* pDC);      // substitué pour dessiner cette vue
     
    /*public:
    	Csplitter4Doc* GetDocument() const;*/
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    #ifndef _WIN32_WCE
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    	
    #endif
     
    protected:
    	DECLARE_MESSAGE_MAP()
    };

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    Effectivement, en rajoutant #include "splitter4Doc.h" (ou class Csplitter4Doc; ) dans MyView.h, ça marche peut-être (dans le sens, j'ai compilé, et j'ai une autre erreur qui semble être indépendant de "GetDocument()")

    Mais comment ça se fait que ça ne marche pas en ne mettant #include "splitter4Doc.h" alors que cette ligne n'apparait pas dans "splitter4View.h" ?

    Comment splitter4View reconnait donc splitter4Doc ? (et ou ?)

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par cricri-larson Voir le message
    Mais comment ça se fait que ça ne marche pas en ne mettant #include "splitter4Doc.h" alors que cette ligne n'apparait pas dans "splitter4View.h" ?
    Je ne comprends pas le sens de ta phrase ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    Dans splitter4View.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    // splitter4View.h : interface de la classe Csplitter4View
    //
     
     
    #pragma once
     
    #include "Mesure.h"
     
    class Csplitter4View : public CFormView
    {
    protected: // création à partir de la sérialisation uniquement
    	Csplitter4View();
    	DECLARE_DYNCREATE(Csplitter4View)
     
    public:
    	enum{ IDD = IDD_SPLITTER4_FORM };
     
    // Attributs
    public:
    	Csplitter4Doc* GetDocument() const;
     
    // Opérations
    public:
     
    // Substitutions
    public:
    	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // Prise en charge de DDX/DDV
    	virtual void OnInitialUpdate(); // premier appel après la construction
     
    // Implémentation
    public:
    	virtual ~Csplitter4View();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
     
    protected:
     
    // Fonctions générées de la table des messages
    protected:
    	DECLARE_MESSAGE_MAP()
    };
     
    #ifndef _DEBUG  // version de débogage dans splitter4View.cpp
    inline Csplitter4Doc* Csplitter4View::GetDocument() const
       { return reinterpret_cast<Csplitter4Doc*>(m_pDocument); }
    #endif
    Il n'y a pas "class splitter4View;" et je voulais savoir où, (et par quelle fonction ou ligne de code) cette classe est référencée dans splitter4View.h

    Et merci pour ta réponse, c'était bien ça

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    Résumé de la solution (pour les autres internautes, on ne sait jamais)

    Lorsque vous avez :
    error C2556: 'CMyDoc *CMyView::GetDocument(void) const'*: la fonction surchargée ne diffère que par le type de retour de 'int *CMyView::GetDocument(void) const'
    myview.cpp(233) : error C2371: 'CMyView::GetDocument'*: redéfinition*; types de base différents
    (version code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error C2556: 'CMyDoc *CMyView::GetDocument(void) const'*: la fonction surchargée ne diffère que par le type de retour de 'int *CMyView::GetDocument(void) const'
    error C2371: 'CMyView::GetDocument'*: redéfinition*; types de base différents
    avec une fonction GetDocument bien défini et un type de retour différent de int* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CMyDoc* CMyView::GetDocument() const // la version non déboguée est en ligne
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
    	return (CMyDoc*)m_pDocument;
    }
    Vérifiez si vous avez bien mis "class CMyDoc;" dans votre CMyView.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #pragma once
     
     class Csplitter4Doc;
    // Vue CMyView
     
    class CMyView : public CView
    {
    	DECLARE_DYNCREATE(CMyView)
     
            ...
    }
    Et encore merci à ceux qui m'ont aidés

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Cela s'appelle la déclaration anticipé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class A;
    class B
    {
       A* UneMethode();
    //  ou
       A& UneAutreMethode();
    // idem pour les arguments :
       void UneTroisiemeMethode(A& // ou A*);
    // et les membre :
    private:
       A*m_pA;
    // ou
       A &m_rA;
    };
    Tant que tu n'utilises pas une propriétés de A, alors il suffit d'indiquer au compilateur que A est une classe qui existe. Il n'a pas besoin de plus d'information.
    En revanche, dès que tu voudras utiliser A, alors il faudra faire l'inclusion de "A.h". En général, cela ne se fait que dans le .cpp, car c'est là qu'on accède à A.
    Ceci bien sur ne marche pas si B dérive de A ou si B contient un A par valeur. Dans ce cas, B doit inclure A.h.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Travailler avec une méthode ayant plusieurs types de retour
    Par fafoula dans le forum Général Java
    Réponses: 4
    Dernier message: 27/07/2012, 10h23
  2. Réponses: 1
    Dernier message: 02/12/2008, 10h29
  3. Web Methode ayant tab à 2 dimensions comme type de retour
    Par elouertassi dans le forum Services Web
    Réponses: 2
    Dernier message: 29/01/2007, 11h32
  4. [type de retour pour un update]
    Par viny dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 21/03/2005, 21h08
  5. [type de retour dans une proc]
    Par viny dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 19/03/2005, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo