Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: Pietro Martello on 31-01-2014, 15:24:12



Title: Problema con oggetti e string
Post by: Pietro Martello on 31-01-2014, 15:24:12
Mentre mi esercitavo con gli oggetti ho incontrato questo problema:
Stavo creando una classe Nome, non particolarmente complicata, che incollo qui:

L'Header
Quote
#ifndef NOME_H
#define NOME_H

#include<string>

class Nome
{
      private:
              string primonome;
              string secondonome;
              string cognome;
      public:
             Nome(string, string);
             Nome(string, string, string);
             string GetPrimoNome();
             string GetSecondoNome();
             string Get Cognome();
             friend ostream & operator << (ostream & sx, const Nome & dx);
};

#endif

Il .CPP
Quote
#include<iostream>
#include"Nome.h"

using namespace std;

Nome::Nome(string nom, string cogn)
{
      primonome = nom;
      secondonome = "";
      cognome = cogn;
}

Nome::Nome(string nom, string nom2, string cogn)
{
      primonome = nom;
      secondonome = nom2;
      cognome = cogn;
}

string Nome::GetPrimoNome()
{
      return primonome;
}

string Nome::GetSecondoNome()
{
      return secondonome;
}

string Nome::Get Cognome()
{
      return cognome;
}

ostream &  operator << (ostream & sx, const Nome & dx)
{
    return sx << dx.PrimoNome << " " << dx.Cognome << ".";
}

e il main:
Quote
#include<iostream>
#include "Nome.h"
using namespace std;

int main ()
{
    Nome nom("Joe", "R.", "Balooka");
   
    string s = nom.GetPrimoNome();
   
    cout<<s<<endl;
   
    system("pause");
    return 0;
}

Come potete vedere è abbastanza semplice, giusto per provare a definire il cout, il mio problema è che ogni volta che tento di compilarlo mi dà errore, e dice:

"in file included from Name.cpp"
Poi ripete "string does not name a type" più o meno ogni volta che dichiaro una variabile di quel tipo, più una valanga di altri errori perché non riconosce i membri...
Qualsiasi cosa faccia non riesco a risolvere il problema, perché sono sicuro di aver inserito la libreria corretta e non vedo differenze con altri oggetti di Cincotti che utilizzano stringhe... e a questo punto ho finito le idee.

Qualcuno mi sa dire cosa succede? Grazie in anticipo.


Title: Re:Problema con oggetti e string
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 01-02-2014, 03:37:41
Sì, l'output del tuo compilatore è corretto  :-OK!

Ci sono un po' di errori di inclusione e di namespace.

Devi assicurarti che ogni blocco che viene compilato (soprattutto le parti incluse in file .h !!!) abbia risolti tutti i collegamenti con le rispettive librerie.

Dunque, inserirei un
using namespace std
all'inizio (primo rigo) di ognuno dei file .cpp, prima ancora degli #include.

Dopodiché, mi concentrerei nel tentare di capire come mai hai un metodo che si chiama
Get Cognome
sì, proprio così, con uno spazio nel mezzo :-)|. Ed è proprio ripetuto con lo stesso errore anche nel file .cpp che definisce il corpo del metodo!

Poi, correggerei l'errore di aver usato nomi di variabili membro interne alla classe, che nella definizione sono scritte tutte in minuscolo, mentre quando vengono usate dal codice che esegue funzioni membro, magicamente hanno le lettere iniziali maiuscole, di fatto configurandosi come nuovi identificatori, ovviamente inesistenti :-)L...

Poi quel "system" è così ostico, che richiede una libreria apposita tutta per lui.
Leggo su Internet che questa è <cstdlib>, ma quasi sicuramente andrebbe bene anche il corrispettivo C <stdlib.h>... .penso ma su quest'ultima cosa non ci metto la mano sul fuoco, magari puoi provare e ci dici tu... |-O


Title: Re:Problema con oggetti e string
Post by: Pietro Martello on 01-02-2014, 10:56:33

Poi, correggerei l'errore di aver usato nomi di variabili membro interne alla classe, che nella definizione sono scritte tutte in minuscolo, mentre quando vengono usate dal codice che esegue funzioni membro, magicamente hanno le lettere iniziali maiuscole, di fatto configurandosi come nuovi identificatori, ovviamente inesistenti :-)L...

Poi quel "system" è così ostico, che richiede una libreria apposita tutta per lui.
Leggo su Internet che questa è <cstdlib>, ma quasi sicuramente andrebbe bene anche il corrispettivo C <stdlib.h>... .penso ma su quest'ultima cosa non ci metto la mano sul fuoco, magari puoi provare e ci dici tu... |-O

Grazie, correggerò gli errori appena posso. Però non ho capito bene queste ultime correzioni.
Riguardo alla prima è volontario (al contrario di Get Cognome  :-)|) che io abbia nominato le variabili con caratteri tutti minuscoli mentre i metodi che le richiamano hanno le iniziali maiuscole, in modo da non confondermi tra metodo e variabile.
Sinceramente non mi sembra un'errore, anche se C++ considera la differenza tra maiuscolo e minuscolo. Nel primo caso parliamo di variabili e nel secondo di metodi. Dove sbaglio col mio ragionamento?

Poi system("pause") non mi ha mai richieto una libreria. L'ho usato in tonnellate di file sin dall'inizio dell'anno usando solamente #include<iostream> e mi ha sempre funzionato. Poi io uso DEV C++, quindi forse ci sono delle differenze di compilatore.

EDIT
Perdonami, vedo ora che avevo usato le variabili con le maiuscole nella definizione dell'operatore. Mi devo essere confuso con i metodi dato che era la prima volta che lo facevo.
Ora funziona. Il system("pause") non mi richiede alcuna libreria.

Non riesco comunque a capire perché richieda il namespace all'inizio dei file cpp. Negli oggetti che ci ha passato il professore non è così.