C++ 向量<;字符串>;使用单独的类时不起作用

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

我有一个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);
}
}
变量:

string _level;
vector<string> _level_instance;
为此:

    Level Lvl;
    Lvl.GetLevelData().pushback(_level);
我在“Level”类中创建了一个方法,它会像以前一样将它打印到屏幕上 它编译但不打印任何东西为什么

顺便说一句,在
int main()
中执行必要的方法,即
OpenLevel()
from
File
class和
Print()
from
Level
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);
}