2013-07-19 81 views
0

我無法使用文件I/O爲我正在處理的遊戲創建類的實例。這可能是一個愚蠢的問題,但我無法理解爲什麼編譯器似乎成功地從存儲在文本文件中的數據創建對象,然後我無法訪問它們。 (我拿出了.display()函數調用來測試這個,並添加了一個簡單的「創建對象」對象;將其添加到構造函數中以檢查是否已創建了一些東西)。如何訪問從文件輸出創建的obect實例?

但是,試圖訪問個人對象給我錯誤:嘗試訪問對象成員函數時,「標識符」未定義。我可能正在做一些完全錯誤的事情,我希望推動正確的方向,我試圖改變while循環中的語法來創建對象,但我還沒有破解它。先謝謝你!下面的代碼...

的main.cpp

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

#include "Attributes.h" 

using std::cout; 
using std::endl; 
using std::cin; 
using std::ofstream; 
using std::ifstream; 
using std::getline; 
using std::cerr; 


int main() { 

    std::string line; 
    ifstream attdata; 
    attdata.open("data.txt"); 
    if (attdata.is_open()) 
    { 
     while (attdata.good()) 
     { 
      getline (attdata, line); 
      Attributes * line = new Attributes; 
     } 
     attdata.close(); 
    } 
    else cerr << "Unable to open file."; 

health.display(); 
fatigue.display(); 
attack.display(); 
skill.display(); 
defence.display(); 
skilldef.display(); 
speed.display(); 
luck.display(); 
}; 

的data.txt

health 
fatigue 
attack 
skill 
defence 
skilldef 
speed 
luck 

Atributes.h

#pragma once 
#include <string> 

class Attributes 
{ 
public: 
    Attributes(void); 
    Attributes(std::string name, std::string shortName, std::string desc, int min, int max); 
    ~Attributes(void); 
    void display(); 
private: 
    std::string m_nameLong; 
    std::string m_nameShort; 
    std::string m_desc; 
    int m_minValue; 
    int m_maxValue; 

}; 

回答

0

在C++中,所有變量都需要在代碼中按名稱聲明。你在你的循環中聲明瞭一堆名爲line的指針變量,然後嘗試使用其他命名變量,如health,fatigue等尚未創建的變量。

我不認爲你可以通過這樣的文件的名字直接創建變量,但你可以讀取文件並創建一個包含文件中數據的對象的數組或向量。您可以將getline()讀取的字符串傳遞到您的Attributes構造函數中,然後將創建的指針存儲在數組或地圖中,以便稍後訪問,以調用display()等方法。如果你真的想在你的代碼中使用一個叫做health的變量,它必須在代碼中的某個地方聲明。

另一個小問題是,您正在循環範圍內重用變量名line(您之前聲明爲std :: string)。這可能有用,但是很混亂,應該避免。調用你的指針變量,如attItem

例如:

Attributes * attItem = new Attributes(line); 
attList.push_back(attItem); 
0

您的arent發送任何您收到的信息創建新的對象。添加一個構造函數與信息的字符串,然後初始化Attributes像這樣:

Atrributes::Attributes(String data){ 
    //parse string and initialize data here 
} 

另外,我建議不要讓你的Attributes對象具有相同的名稱保存數據的變量。即使它是無害的(我不確定它是什麼),它只是不太乾淨。

+0

對不起,我應該可能進一步瞭解我的詳細信息...我已經添加了該類的頭文件,我只是試圖測試是否可以創建更乾淨的代碼通過使用數據文件創建對象,如果這是有道理的?那可能嗎? – Iskardes

+0

你的意思是,在程序運行之前創建對象? – taylorc93

+0

基本上......是的,我想! – Iskardes

0

C和C++不允許在運行時創建的變量的新名稱。因此health.display();中的health不能來自讀取文件。

你可以做的是收集Attributes(如:attList),並找到合適的屬性,爲你的函數:

Attribute health = attList.find("health"); 

(或者,如果你喜歡使用map,你可以這樣做:

Attribute health = attList["health"]; 

當然另一種方法是具有存儲屬性在每個對象,如

class PlayerBase 
{ 
    private: 
    Attribute health; 
    Attribute speed; 
    ... 
    public: 
    void SetAttribute(const string& name, const Attribute& attr); 
}; 

然後你通過比較string name找到合適的屬性:

void SetAttribute(const string& name, const Attribute& attr) 
{ 
    if (name == "health") health = attr; 
    if (name == "speed") speed = attr; 
    ... 
}