2017-10-08 14 views
-2

Comme le titre l'indique, j'apprends à utiliser des pointeurs en C++. J'ai été chargé d'écrire un programme qui obtient des données sur des pays à partir d'un fichier texte, les charge dans un tableau d'objets de classe, puis laisse l'utilisateur voir les données, supprimer une entrée ou quitter.Apprentissage de l'utilisation de pointeurs en C++ dans Error 'variable non déclarée dans la portée'

Je rencontre un problème avec les fonctions d'accesseur de classe. Je reçois la variable d'erreur "non déclarée dans la portée". Je comprends ce que cette erreur essaie de me dire, mais je n'arrive pas à comprendre comment faire fonctionner correctement les accesseurs.

Les exigences pour l'affectation sont d'utiliser des pointeurs char pour stocker les chaînes, donc je pense que cela ajoute un niveau de complexité supplémentaire. Je veux que la fonction d'accesseur renvoie juste une seule variable, par ex. nom du pays, capital et superficie. J'utilise CodeBlocks et fonctionne sur Ubunutu. J'ai le compilateur mis à C++ 11.

Quoi qu'il en soit, voici le code:

//This is the main.cpp file 

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 

#include "Country.h" 


const int FILE_PATH_SZ = 512; 
Country** g_countryArray; 
int g_arrsz = 0; 

using namespace std; 

void openFile(ifstream& inFile, string pathName); 
void getArrSize(ifstream& inFile, string pathName, string& countriesData); 
void fillCountryArr(ifstream& inFile, string pathName, string& countryName, string& capitalName, string& tempSurfaceArea); 

void printCountryData(Country** g_countryArray, int g_arrsz); 


int main() { 

    char menuChoice, startingLetter; 
    string pathName, countriesData, countryName, capitalName, tempSurfaceArea; 
    ifstream inFile; 


    do { 
     cout << "Choose one of the following:" << endl << endl; 
     cout << "Menu options" << endl << endl; 
     cout << "a) Read a text file:" << endl; 
     cout << "b) Remove countries starting with given letter" << endl; 
     cout << "c) Print all data to console" << endl; 
     cout << "d) Quit" << endl; 
     cin >> menuChoice; 

     switch (menuChoice) 
     { 
      case 'a': 
      { 

       cout << "Please enter the full path name of the file you wish to open: " << endl; 
       cin >> pathName; 

       openFile(inFile, pathName); 
       getArrSize(inFile, pathName, countriesData); 
       fillCountryArr(inFile, pathName, countryName, capitalName, tempSurfaceArea); 

      } 

      case 'b': 
      { 
       cout << "Enter the starting letter: " << endl; 
       cin >> startingLetter; 
       toupper(startingLetter); 
      } 
      case 'c': 
      { 
       printCountryData(g_countryArray, g_arrsz); 
      } 
     } 
    }while (menuChoice != 'd'); 

    return 0; 
} 

void openFile(ifstream& inFile, string pathName) 
{ 
    inFile.open(pathName.c_str()); 

    if (!inFile) 
     { 
      cout << "Cannot open file." << endl; 
     } 

    inFile.close(); 
    inFile.clear(std::ios_base::goodbit); 
} 

void getArrSize(ifstream& inFile, string pathName, string& countriesData) 
{ 

    inFile.open(pathName.c_str()); 

    while (getline(inFile, countriesData)) 
     { 
      ++g_arrsz; 
     } 

    g_countryArray = new Country* [g_arrsz]; //declares g_countryArray to be an array of pointers of size [g_arrsz]. The array holds pointers to Country class objects 
} 

void fillCountryArr(ifstream& inFile, string pathName, string& countryName, string& capitalName, string& tempSurfaceArea) 
{ 
    long int surfaceArea; 

    //closes and reopens the file cleanly 
    inFile.close(); 
    inFile.clear(std::ios_base::goodbit); 
    inFile.open(pathName.c_str()); 

    for (int i = 0; i < g_arrsz; i++) 
    { 
     getline(inFile, countryName, ','); //gets the name of the country from the input file 
     getline(inFile, capitalName, ','); //gets the name of the capital of the country from the input file 
     getline(inFile, tempSurfaceArea); //gets the surface area of the country in the form of a string 
     surfaceArea = stol(tempSurfaceArea); //converts the string version of surface area to an integer 
     g_countryArray[i] = new Country(countryName.c_str(), capitalName.c_str(), surfaceArea); //creates new Country class and stores address in the i'th element of g_countryArray 
    }                       //passes the name of the country and capital of the country in to the constructor as 
                           //c-strings and passes surfaceArea as an int 
} 

void printCountryData(Country** g_countryArray, int g_arrsz) 
{ 
    for (int i = 0; i < g_arrsz; ++i) 
    { 
     cout << g_countryArray[i]->GetCountryName() << ", "; 
     cout << g_countryArray[i]->GetCapital() << ", "; 
     cout << g_countryArray[i]->GetSurfaceArea() << endl; 
    } 
} 

La fonction juste au-dessus ici printCountryData est là où je veux passer le tableau d'objets de classe et les variables de taille de tableau, puis appeler les fonctions accesseurs.

//here is the Country.h file 
#include <iostream> 
#include <string> 
#include <cstring> 

using namespace std; 



class Country 
{ 
private: 
    char* name_; 
    char* capital_; 
    long surfaceArea_; 
public: 
    Country (const char* country, const char* capital, long surfaceArea); 
    ~Country(); 
    char* GetCountryName(); 
    char* GetCapital(); 
    long GetSurfaceArea(); 
}; 

Country::Country(const char* country, const char* capital, long surfaceArea) 
{ 
    int countryLen, capitalLen; //variables to store length of c-strings country and capital for dynamically allocating arrays of the right length 
    countryLen = strlen(country); //gets length of country name 
    capitalLen = strlen(capital); //gets length of capital name 

    name_ = new char[countryLen + 1]; //dyanmically creates a new character array of size countryLen and stores base address of array in name_ pointer 
    for (int i = 0; i < countryLen; i++)//transfers storage of country name to the name_ array 
    { 
     name_[i] = country[i]; 
    } 

    capital_ = new char[capitalLen + 1]; //creates a new character array of size capitalLen and stores base address of array in capital_ pointer 
    for (int i = 0; i < countryLen; i++) 
    { 
     capital_[i] = capital[i]; 
    } 

    surfaceArea_ = surfaceArea; 

} 

char* GetCountryName() 
{ 
    return name_; 
} 

char* GetCapital() 
{ 
    return capital_; 
} 

long GetSurfaceArea() 
{ 
    return surfaceArea_; 
} 

Ce sont ces 3 fonctions accesseurs en bas qui génèrent l'erreur « name_ n'a pas été déclarée dans ce cadre, etc. »

+0

Ahh ... la grande décharge de code ... – bolov

+2

s'il vous plaît créer un [mcve] – bolov

Répondre

1

La signature de votre fonction sur eux est incorrecte. Vous devriez les faire appartenir à la classe Country.

char* Country::GetCountryName() 
{ 
    return name_; 
} 

char* Country::GetCapital() 
{ 
    return capital_; 
} 

long Country::GetSurfaceArea() 
{ 
    return surfaceArea_; 
} 
+0

Merci. C'est étrange, j'ai essayé ça plus tôt aujourd'hui et je produisais des messages sur les prototypes de fonctions qui ne correspondaient pas, mais tout à l'heure ça a marché! –