PDA

View Full Version : [ C++ ] errore di compilazione nel costruttore


Frank Castle
28-12-2003, 10:29
Sono sicuro che sia una cavolata, ma di quelle che cavolate che detesto perchè fanno perdere un bel po' di tempo :rolleyes:
Vorrei sapere cosa significa questo errore: me lo dà nel costruttore, ma se commento il costruttore poi inizia a darmelo per tutte le funzioni in cascata praticamente :D

sly@sid:~/programming/C++/classi/10$ g++ -g -Wall polimorf.cc -o polimorf
polimorf.cc:7: ISO C++ forbids defining types within return type
polimorf.cc:7: return type specification for constructor invalid
Questo è il codice (la riga 7 è quella di dichiarazione del costruttore, per la precisione coincide con la graffa d'apertura):

File di intestazione
#ifndef LAVORATORE_H
#define LAVORATORE_H

// Classe base astratta
class Lavoratore{
public:
Lavoratore(const char *, const char *);
virtual ~Lavoratore(); //distruttore virtuale
const char* getNome() const;
const char* getCognome() const;
virtual int getPaga() const = 0; //virtuale pura
virtual void print() const; //virtuale

private:
char* nome;
char* cognome;
};
#endif
[...]


File polimorf.cc
#include <iostream>
using namespace std;
#include <cstring>
#include <cassert>
#include "polimorf.h"

Lavoratore::Lavoratore( const char *nm, const char *cgnm){
nome = new char[strlen(nm)+1];
assert(nome!=0);
strcpy(nome,nm);

cognome = new char[strlen(cgnm)+1];
assert(cognome!=0);
strcpy(cognome,cgnm);
}
[...]


Grazie ;)

cionci
28-12-2003, 11:56
Per caso non hai incluso lavoratore.h ?!?!!?

Frank Castle
28-12-2003, 15:42
Ho fatto un file di intestazione unico "polimorf.h" in cui è definito la classe Lavoratore :oink:

verloc
28-12-2003, 17:12
prova a togliere il primo const da questi e vedi se compila:


const char* getNome() const;
const char* getCognome() const;

Frank Castle
28-12-2003, 18:03
Originariamente inviato da verloc
prova a togliere il primo const da questi e vedi se compila:


const char* getNome() const;
const char* getCognome() const;
L'errore persiste, il const è lì per non permettere ai client di modificare i due dati private :\

Frank Castle
28-12-2003, 18:43
Ancora un errore identico :(
Questa volta vi posto il codice completo, visto che è abbastanza corto:

File di instestazione - shapes.h

#ifndef SHAPE
#define SHAPE

class Shape{
public:
Shape(int=0, int=0);
inline virtual ~Shape(){}
virtual void print() const = 0;

protected:
int x;
int y;
};
# endif

#ifndef PUNTO
#define PUNTO

class Punto : public Shape{
public:
Punto(int=0,int=0);
virtual void print() const;
};
#endif

#ifndef CERCHIO
#define CERCHIO

class Cerchio : public Punto{
public:
Cerchio(int=0, int=0, int=0);
virtual void print() const;
private:
int raggio;
}
#endif




File shapes.cc

#include <iostream>
using std::cout;
using std::endl;
#include "shapes.h"

Shape::Shape(int a, int b){
x=a; y=b;
}

Punto::Punto(int a, int b)
: Shape(a,b)
{
}

void Punto::print() const{
cout << "\n(" << x << "," << y << ")\n";
}

Cerchio::Cerchio(int a, int b, int r)
: Punto(a,b)
{
raggio = (r>=0 ? r : 0);
}

void Cerchio::print() const{
cout << "\nSono cerchio con centro ";
Punto::print();
cout << "\ne raggio " << raggio <<endl;
}

void dynamic_binding(Shape *);
int main(){
Shape *bcpArray[2]; //Array di puntatori alla classe base (base class pointer)
Punto p(2,5);
Cerchio c(0,0,9);

bcpArray[0]=&p; //punta a un oggetto di tipo Punto
bcpArray[1]=&c; //punta a un oggetto di tipo Cerchio

/* il ciclo for chiama la funzione di binding dinamico per tutti i puntatori bcp*/
for(int i=0; i<2; i++){
dynamic_binding(bcpArray[i]);
}

return 0;
}

//invoca la giusta funzione concreta a seconda dell'oggetto puntato da bcp
void dynamic_binding(Shape *bcp){
bcp->print();
}



Output del compilatore

sly@sid:~/programming/C++/classi/10$ g++ -g -Wall shapes.cc -o shapes
shapes.cc:6: ISO C++ forbids defining types within return type
shapes.cc:6: return type specification for constructor invalid
sly@sid:~/programming/C++/classi/10$

Frank Castle
28-12-2003, 18:44
Ecco, postandovi il codice completo mi sono accorto dell'errore :p
Lo sapevo che era una gadanata: non ho messo il punto e virgola alla fine dell'ultima classe ;)