如何访问从文件输出创建的对象实例?

时间:2013-07-19 13:04:08

标签: c++ file-io instantiation function-calls member-functions

我无法使用文件I / O为我正在处理的游戏创建我的类的实例。这可能是一个愚蠢的问题,但我无法理解为什么编译器似乎成功地从存储在文本文件中的数据创建对象然后我无法访问它们。 (我取出了.display()函数调用来测试它,并在构造函数中添加了一个简单的cout<<“Object created”;来检查是否创建了一些东西。)

但是试图访问单个对象的代码在尝试访问对象成员函数时给出了错误:“标识符”未定义。我可能正在做一些完全错误的事情,我希望在正确的方向上推进,我已经尝试在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;

};

3 个答案:

答案 0 :(得分:0)

您没有发送任何收到的信息来创建新对象。添加一个构造函数,该构造函数接收包含该信息的字符串,然后像这样初始化Attributes

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

另外,我建议不要让Attributes对象与保存数据的变量同名。即使它是无害的(并且我不确定它是什么),它只是不太干净。

答案 1 :(得分:0)

在C ++中,所有变量都需要在代码中按名称声明。您在循环中声明了一堆名为line的指针变量,然后尝试使用尚未创建的其他命名变量,如healthfatigue等。

我认为你不能直接从这样的文件中按名称创建变量,但是你可以读取文件并创建一个包含文件数据的对象的数组或向量。您可以将getline()读取的字符串传递到Attributes构造函数中,然后将创建的指针存储在稍后可以访问的数组或映射中,以调用display()之类的方法。如果您真的想在代码中使用名为health的变量,则必须在代码中的某处声明它。

另一个小问题是,您正在重用循环范围中的变量名line(您之前声明为std :: string)。这可能有效,但令人困惑,应该避免。将指针变量调用为其他内容,例如attItem

例如:

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

答案 2 :(得分:0)

C和C ++不允许在运行时创建新的变量名称。因此health中的health.display();不能来自读取文件。

您可以做的是拥有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;
   ...
}