2015-08-13 2 views
0

У меня проблема с моей текущей задачей. В принципе, мне предоставлен XML-файл и я пытаюсь разобрать его для получения ключевой информации. Например, некоторые строки будет выглядеть следующим образом:Определить переменные-члены в функциях вслепую

<IPAddress>123.45.67</IPAddress> 

И я, чтобы получить значение 123.45.67, ничего слишком плохо. Мне сказали не использовать XML-парсер и просто разобрать его вручную, что было довольно легко. Однако у меня возникают проблемы со второй частью задачи. В принципе, я должен создать класс с определенными переменными-членами и объявить их на основе значений, которые я анализирую. Итак, скажем, класс называется Something, и есть переменная-член, называемая IPAddress. Я должен обновить значение IPAddress до 123.45.67, поэтому, когда кто-то вызывает Something.IPAddress в основном методе, он возвращает 123.45.67. Это была моя первая попытка на него:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sys/stat.h> 

using namespace std; 

class Something 
{ 
    public: 
    string location; 
    string IPAddress; 
    string theName; 
    int aValue; 

    //loop through the array from the method below 
    void fillContent(string* array) 
    { 
     for(int i = 0; i < array->size(); i++) 
     { 
       string line = array[i]; 
       if((line.find("<") != std::string::npos) && (line.find(">")!= std::string::npos)) 
       { 
       unsigned first = line.find("<"); 
       unsigned last = line.find(">"); 
       string strNew = line.substr (first + 1, last - first - 1); //this line will get the key, in this case, "IPAddress" 
      unsigned newfirst = line.find(">"); 
       unsigned newlast = line.find_last_of("<"); 
      string strNew2 = line.substr(newfirst + 1, newlast - newfirst - 1); //this line will get the value, in this case, "123.45.67" 
       if(strNew == "IPAddress") 
       { 
        IPAddress = strNew2; //set the member variable to the IP Address 
       } 
       } 
     } 
    } 

    //this method will create an array where each element is a line from the xml 
     void fillVariables() 
    { 
     string line; 
     ifstream myfile ("content.xml"); 
     long num = //function that gets size that I didn't add to make code shorter!; 
     string *myArray; 
     myArray = new string[num]; 
     string str1 = ""; 
     string strNew2 = ""; 
     int counter = 0; 
     if (myfile.is_open()) 
     { 
      while (getline (myfile,line)) 
      { 
      myArray[counter] = line; 
       counter++; 
      } 
      myfile.close(); 
     } 
     fillContent(myArray); 
    } 

}; 


int main(int argc, char* argv[]) 
{ 
    Something local; 
    local.fillVariables(); 
    cout << local.IPAddress<< endl; // should return "123.45.67" 
    return 0; 
} 

Теперь это делать то, что я хочу, чтобы это сделать, однако, вы можете видеть, что я нужен, если заявление. Предполагая, что у меня есть по крайней мере 20 из этих переменных-членов, наличие 20 if-утверждений будет раздражать и просто нахмуриться. Можно ли каким-либо образом получить доступ к переменным-членам из класса? Извините, если мой вопрос был долгим, я просто хотел убедиться, что все, что необходимо для понимания вопроса, предоставляется! Пожалуйста, дайте мне знать, если что-то важное, что может не быть, должно быть добавлено.

Большое спасибо!

ответ

0

Это можно считать плохой стиль, но я обычно просто сделать:

// at the top of the 'fillContent' function 
std::map<string, string*> varmap{ 
    {"IPAddress", &IPAddress}, 
    {"AnotherField", &AnotherField} 
}; 
// If you're not using C++11, you can also try: 
// std::map<string, string*> varmap; 
// varmap["IPAddress"] = &IPAddress; 
// varmap["AnotherField"] = &AnotherField; 

// parsing code goes here 
*varmap[strNew] = strNew2; 
+0

Так бы я добавить 'зЬй :: Карта <строка, строка *> varmap { { "IPAddress", & IPAddress}, {"AnotherField", & AnotherField} }; 'на самом верху и просто добавить все переменные-члены на эту карту? Или это будет вставлено в функцию fillContent? Я вхожу в функцию, правильно? – user2397837

+0

@ user2397837 В верхней части функции 'fillContent'. – refi64

+0

Позвольте мне сделать снимок. Я дам вам знать, как все идет! Я думал использовать карты, но не использовал их в течение некоторого времени, так что немного не знаком с ними. – user2397837