我无法使用文件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;
};
答案 0 :(得分:0)
您没有发送任何收到的信息来创建新对象。添加一个构造函数,该构造函数接收包含该信息的字符串,然后像这样初始化Attributes
:
Atrributes::Attributes(String data){
//parse string and initialize data here
}
另外,我建议不要让Attributes
对象与保存数据的变量同名。即使它是无害的(并且我不确定它是什么),它只是不太干净。
答案 1 :(得分:0)
在C ++中,所有变量都需要在代码中按名称声明。您在循环中声明了一堆名为line
的指针变量,然后尝试使用尚未创建的其他命名变量,如health
,fatigue
等。
我认为你不能直接从这样的文件中按名称创建变量,但是你可以读取文件并创建一个包含文件数据的对象的数组或向量。您可以将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;
...
}