Error - 'refresh' was not declared in this scope

di il
5 risposte

Error - 'refresh' was not declared in this scope

Per un test devo fare un programmino in C++ che vorrebbe simulare una libreria grafica (in realtà non fa nulla). Per farla breve, copiando un esempio (che so per certo dovrebbe funzionare) ho due classi: la superclasse Forma (che appunto descrive una generica forma) e la sottoclasse Cerchio.

La classe Forma ha un metodo (refresh) che mi sta facendo dannare perché, una volta create forme diverse (nel mio caso sono solo cerchi ma in mezzo ci possono essere quadrati, triangoli... insomma, altre classi che implementerò), dovrebbe semplicemente richiamare a sua volta il metodo disegna (attraverso chiamate polimorfiche) però continua ad uscirmi un errore del tipo error: 'refresh' was not declared in this scope. Qualcuno può aiutarmi?

Forma.h
#ifndef FORMA_H
#define FORMA_H
#include <iostream>
using namespace std;

class Forma
{
static Forma *list;
    Forma *next;
public:
    Forma();
    virtual ~Forma();
    virtual void disegna()=0;
    friend void refresh();
};

#endif
Forma.cpp
#include "Forma.h"

Forma * Forma::list=0;

Forma::Forma()
{
    cout<<"Forma() ";
    next=list;
    list = this;
}

Forma::~Forma()
{
    cout<<"~Forma()"<<endl;
}

void refresh()
{
    for(Forma *p=Forma::list; p; p = p->next)
    p->disegna();
}
Cerchio.h
#ifndef CERCHIO_H
#define CERCHIO_H
#include "Forma.h"

class Cerchio: public Forma
{
public:
    Cerchio();
    ~Cerchio();
    void disegna();
};

#endif
Cerchio.cpp
#include "Cerchio.h"

Cerchio::Cerchio()
{
    cout<<"Cerchio"<<endl;
}
Cerchio::~Cerchio()
{
    cout<<"Cerchio"<<endl;
}

void Cerchio::disegna()
{
    cout<<"Cerchio"<<endl;
}
Main.cpp
#include "Cerchio.h"
#include "Forma.h"
#include <iostream>
using namespace std;

int main()
{
    Cerchio c1();
    Cerchio c2();
    refresh();
    return 0;
}

5 Risposte

  • Re: Error - 'refresh' was not declared in this scope

    Friend non implica la dichiarazione della funzione, ma è solo indicativa per la classe.
    
    void refresh();
    
    class Forma
    {
    static Forma *list;
        Forma *next;
    public:
        Forma();
        virtual ~Forma();
        virtual void disegna()=0;
        friend void refresh();
    };
    
    
  • Re: Error - 'refresh' was not declared in this scope

    Cioè bisogna dichiarare la funzione refresh anche fuori dalla classe? Ci ho appena provato e il programma viene compilato ma la funzione non fa nulla di quello che ho scritto in Forma.cpp
  • Re: Error - 'refresh' was not declared in this scope

    El_Merendero ha scritto:


    cioè bisogna dichiarare la funzione refresh anche fuori dalla classe?
    Si. il friend è una dichiarazione d'intenti per la classe, ma la dichiarazione della funzione (essendo autonoma) dev'essere a parte e prima della classe di cui dev'essere friend.
    ...ma la funzione non fa nulla di quello che ho scritto in Forma.cpp
    Cioè? Ti aspetti due cerchi ma ne hai uno solo? Hai un crash? Che succede?
  • Re: Error - 'refresh' was not declared in this scope

    shodan ha scritto:


    El_Merendero ha scritto:


    cioè bisogna dichiarare la funzione refresh anche fuori dalla classe?
    Si. il friend è una dichiarazione d'intenti per la classe, ma la dichiarazione della funzione (essendo autonoma) dev'essere a parte e prima della classe di cui dev'essere friend.
    ...ma la funzione non fa nulla di quello che ho scritto in Forma.cpp
    Cioè? Ti aspetti due cerchi ma ne hai uno solo? Hai un crash? Che succede?
    Stavo giusto per scrivere, c'era un altro errore. Nel main dovevo togliere semplicemente le parentesi tonde durante la creazione degli oggetti c1 e c2 (era come chiamare una funzione c1 e c2 che ritornavano degli oggetti Cerchio).
    #include "Cerchio.h"
    #include "Forma.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
        Cerchio c1;
        Cerchio c2;
        refresh();
        return 0;
    }
    Posso però chiedere perché refresh() va dichiarato due volte all'interno di Forma.h? Chiedo scusa ma veramente non ho capito. Faccio un esempio: altre volte mi è capitato, durante l'overloading dell'operatore <<, di dichiararlo friend ma non doverlo scrivere anche prima della classe stessa
    friend std::ostream& operator<<(std::ostream& os, const MyClass &o);
    E' semplicemente un caso particolare trattandosi di overloading?
  • Re: Error - 'refresh' was not declared in this scope

    In effetti la doppia dichiarazione è rindondante. Nella documentazione e nelle FAQ è sufficiente il friend etc.. affinché la funzione sia dichiarata a livello globale. Mi sono un po' confuso con i friend che coinvolgono funzioni template definite fuori dal corpo della classe.
    Probabilmente l'unico errore erano i:
    Cerchio c1();
    che creavano problemi.
Devi accedere o registrarti per scrivere nel forum
5 risposte