2013-05-11 1 views
2

Je suis en train d'écrire un petit programme en Visual C++ 2010. Je vais avoir quelques problèmes mettre en œuvre des fonctions virtuelles pures héritées d'une certaine classe abstraite, lorsque les cours en question sont divisés en *.h et *.cpp fichiers .méthode virtuelle Redéfinition de la classe de base

Ce fichier est le Sir.h où je déclare mes classes et méthodes, Monsieur est une classe de base:

class Sir{ 
protected : Uint _count; 
      TVint _elemente; 

public : Sir(); 
     virtual ~Sir(){} 
     Uint operator[] (int index); 
     Sir& operator() (int index); 
     friend ostream& operator << (ostream &out, const Sir &sir); 

protected : virtual void CalculateValues(int index)=0; 
} 
class Fibonacci:public Sir{ 
enum { MAX_FIB = 47 }; 

using Sir::CalculateValues; 
void CalculateValues(int index); 
} 

C'est Sir.cpp:

#include "Sir.h" 

    Sir::Sir(){_count=0;} 

    Uint Sir::operator[](int index) 
       { 
         if(index<0) 
          ParameterOutOfBounds(); 
         else{_count=index+1;} 
         return _elemente[_count]; 
       } 
    Sir& Sir::operator()(int index){operator[] (index);} 

    void Fibonacci::CalculateValues(int index){ 

      if(index<Fibonacci::MAX_FIB) 
      {Fibonacci::_elemente.push_back(1); 
      Fibonacci::_elemente.push_back(1); 
      while(_elemente.size()<_count) 
      Fibonacci::_elemente.push_back(_elemente[_elemente.size()-1]+_elemente[_elemente.size()-2]); 
       } 
      else ParameterOutOfBounds(); 

     } 
ostream& operator << (ostream &out, const Sir &sir) 
     { 
      cout<<"Index Value"<<endl; 
      cout<<"--------------------"<<endl; 
      for(int i=0;i<_count;i++) 
      cout<<i<<" "<<_elemente[_count]<<endl; 
     } 

C'est le testSir. fichier cpp:

#include "Sir.h"; 
#include<iostream>; 
#include"Calc\Exceptions.h"; 
using namespace std; 

int main(){ 

    Sir * fib=new Fibonacci; 
    fib->CalculateValues(1); //Error : function is inaccessible 
    system("PAUSE"); 
    return 0; 
} 

Je reçois l'erreur: Erreur: la fonction "Sir :: CalculateValues" est inaccessible. Comment puis-je réparer cela ?

EDIT:

Le protégé était mon mauvais. Maintenant, j'ai un autre problème à Sir * fib=new Fibonacci; Je reçois "Erreur: objet de type de classe abstraite" Fibonacci "n'est pas autorisé".

+0

En ce qui concerne votre modification, je ne reçois pas cette erreur de votre code. Cependant, vous n'avez clairement pas publié le code que vous compilez, car il contient beaucoup d'erreurs de syntaxe. Il semble que soit vous n'avez pas correctement substitué 'CalculateValues' (que vous avez dans le code affiché), soit le code réel contient une autre fonction virtuelle pure que vous n'avez pas surchargée. –

Répondre

1

La méthode est inaccessible puisqu'elle est déclarée protected.

protected : virtual void CalculateValues(int index)=0; 

Ajouter sous public ::

public : Sir(); 
     virtual ~Sir(){} 
     Uint operator[] (int index); 
     Sir& operator() (int index); 
     friend ostream& operator << (ostream &out, const Sir &sir); 
     virtual void CalculateValues(int index)=0; 

Et même pour la classe Fibonacci (seule la méthode pertinente)

une méthode protected est accessible uniquement à la classe déclarant ou l'un des ses dérivés

+0

merci mais maintenant j'ai un autre problème avec -Sir * fib = new Fibonacci; - "erreur: l'objet du type de classe abstraite" Fibonacci "n'est pas autorisé – Dubioz

+0

Pourquoi utilisez-vous la ligne suivante:" using Sir :: CalculateValues; "?. Et aussi dans votre classe Fibonacci vous devez déclarer explicitement CalculateValues ​​comme publique comme dans la classe parente Si aucun spécificateur d'accès n'est utilisé, private est la valeur par défaut alors qu'elle devrait être publique pour cette méthode – giorashc

0

CalculateValues est déclaré protégé, il est donc accessible uniquement à partir de sous-classes. Sir classe.

Déclarer public si vous voulez qu'il soit appelable d'une autre classe.

Questions connexes