0

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

但是尝试访问单个对象的代码给了我错误:尝试访问对象成员函数时未定义“标识符” 。我可能做错了什么,我希望能朝着正确的方向前进,我已经尝试更改 while 循环中的语法来创建对象,但我还没有破解它。先感谢您!下面的代码...

主文件

#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();
};

数据.txt

health
fatigue
attack
skill
defence
skilldef
speed
luck

属性.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;

};
4

3 回答 3

0

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

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

另外,我建议不要使您的Attributes对象与保存数据的变量具有相同的名称。即使它是无害的(我不确定它是否),它也不是很干净。

于 2013-07-19T13:13:12.037 回答
0

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

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

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

例如:

Attributes * attItem = new Attributes(line);
attList.push_back(attItem);
于 2013-07-19T13:13:38.047 回答
0

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

您可以做的是收集Attributes(例如attList)和一个为您找到适当属性的函数:

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

(或者,如果您更喜欢使用 a 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;
   ...
}
于 2013-07-19T13:38:58.590 回答