C++ 向量<;字符串>;使用单独的类时不起作用
我有一个txt文件,它有一个类似流氓的级别 我这样加载它:C++ 向量<;字符串>;使用单独的类时不起作用,c++,string,class,vector,ifstream,C++,String,Class,Vector,Ifstream,我有一个txt文件,它有一个类似流氓的级别 我这样加载它: void File::LoadLevel() { ifstream input_file; input_file.open("Level_1.txt"); if (input_file.fail()) { perror("Level_1.txt"); } while (input_file >> _level) { _level_instance.push_back(_level); } } 变量: st
void File::LoadLevel()
{
ifstream input_file;
input_file.open("Level_1.txt");
if (input_file.fail())
{
perror("Level_1.txt");
}
while (input_file >> _level)
{
_level_instance.push_back(_level);
}
}
变量:
string _level;
vector<string> _level_instance;
为此:
Level Lvl;
Lvl.GetLevelData().pushback(_level);
我在“Level”类中创建了一个方法,它会像以前一样将它打印到屏幕上
它编译但不打印任何东西为什么
顺便说一句,在int main()
中执行必要的方法,即OpenLevel()
fromFile
class和Print()
fromLevel
class
编辑:
通过引用传递它是行不通的
以下是级别h中的两种方法:
void SetLevelData(const std::string &string) {
_level_data.push_back(string);
}
//Getters
vector<string>& GetlevelData(){ return _level_data; }
它不工作它什么也不打印,即使我加了“&”
当我在Level.h中尝试使用“push_back”方法时,结果是一样的
下面是int main(),以防万一:
int main()
{
File f;
Level lvl;
f.LoadLevel();
lvl.PrintLevel();
system("PAUSE");
return 0;
}
和Level.cpp中的PrintLevel()
void Level::PrintLevel()
{
for (int i = 0; i < _level_data.size(); i++)
{
cout << _level_data[i] << endl;
}
}
void级别::PrintLevel()
{
对于(int i=0;i<_level_data.size();i++)
{
cout函数GetlevelData
通过值返回其向量,这意味着将创建一个全新的向量副本。当副本超出范围时(当表达式Lvl.GetlevelData().pushback(_level)
完成时),您推入该向量的任何内容都将丢失
您应该通过引用返回它:
vector&GetlevelData(){return\u level\u data;}
// ^
// |
//通过引用返回
vectorGetlevelData()
返回向量的副本,而不是对它的引用
因此,您的Lvl.GetLevelData().push_back(_level);
返回一个副本,将数据添加到向量,然后再次删除该副本。因此,您将其添加到向量,该向量将立即再次被删除
您需要通过引用返回它:
vector<string>& GetlevelData(){ return _level_data; }
为什么它必须是常量?@belkipandroidity将字符串
作为引用传递可以避免额外的副本,但这将允许您修改内部的字符串推回
。但是因为您不想在其中修改该字符串
,所以您可以添加一个常量
,这样您或其他地方就可以使用您的代码,可以确保字符串
在传递到push_back
时未被修改,而无需查看方法的内部定义。感谢您的解释,但这两种方法似乎都不起作用:/@Belkipandroyness-但这两种方法似乎都不起作用:/--请解释“好像不行“。很明显,您正在返回一个副本,解决该问题的方法是返回一个引用。@belkipAndroidness那么错误在代码中的其他地方,您需要更具体一些,因为这个简单的示例适用于@belkipAndroidness,您需要创建一个并向我们展示。请编辑您的问题。您调用f.LoadLevel();
但是f
对main()中定义的lvl
一无所知
,那么为什么在\u level\u data
中有任何东西在lvl
中呢?在文件中lvl
明显不同的实例在哪里定义了?@t.niese,因为我使用GetLevelData()在OpenLevel()中设置了“\u level\u data”的值
此处显示的lvl
是级别
的一个新实例,没有在任何地方使用,因此主要调用lvl.PrintLevel
将不会显示任何内容,因为它的\u Level\u data
为空。@Belkipandroyness--我该怎么办?
--为什么选择以这种方式进行操作,因为您有两个不同的类,File
和Level
?(一个类“看起来”和另一个类“看起来”并不重要,它们是不同的)。目标/目的是什么?这是你的设计,你需要弄清楚你真正想要做什么。@Belkipandroyness投票以“太宽”结束。
void File::LoadLevel()
{
ifstream input_file;
Level lvl;
input_file.open("Level_1.txt");
if (input_file.fail())
{
perror("Level_1.txt");
}
while (input_file >> _level)
{
lvl.GetlevelData().push_back(_level);
}
}
int main()
{
File f;
Level lvl;
f.LoadLevel();
lvl.PrintLevel();
system("PAUSE");
return 0;
}
void Level::PrintLevel()
{
for (int i = 0; i < _level_data.size(); i++)
{
cout << _level_data[i] << endl;
}
}
vector<string>& GetlevelData(){ return _level_data; }
// ^
// |
// Return by reference
vector<string>& GetlevelData(){ return _level_data; }
void push_back( const std::string &string) {
_level_data.push_back(string);
}