【问题标题】:vector<string> doesnt work when using seperate classes使用单独的类时,vector<string> 不起作用
【发布时间】:2016-08-20 18:00:15
【问题描述】:

我有一个 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;

我这样打印出来:

for (int i = 0; i < _level_instance.size(); i++)
{
    cout << _level_instance[i] << endl;
}

效果很好。

但是我在另一个类中也有一个向量,我使用这样的 getter:

vector<string>GetlevelData(){ return _level_data; }

我从这里更改了 LoadLevel():

_level_instance.push_back(_level);

到这里:

    Level Lvl;
    Lvl.GetLevelData().pushback(_level);

我在“Level”类中创建了一个方法,将其打印到与以前相同的屏幕上 它编译但它没有打印出任何东西,为什么?

顺便说一句,在int main() 中执行了必要的方法,即来自File 类的OpenLevel() 和来自Level 类的Print()

编辑:

通过引用传递它并不起作用 这是 Level.h 中的两种方法:

void SetLevelData(const std::string &string) {
    _level_data.push_back(string);
}
//Getters
vector<string>& GetlevelData(){ return _level_data; }

在 File.cpp 中:

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


}

它不起作用,它什么也不打印,即使我添加了“&” 当我在 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;
}
}

【问题讨论】:

  • 你打电话给f.LoadLevel();,但fmain()中定义的lvl一无所知,那么为什么_level_data里面应该有任何东西在那个@里面987654341@? File 中明显不同的实例 lvl 定义在哪里?
  • @t.niese 因为我使用 GetLevelData().pushback(_level) 在 OpenLevel() 中设置了 '_level_data' 的值
  • 在您的main() 中,您在此处显示lvlLevel 的一个新实例,它不会在任何地方使用,因此主要调用lvl.PrintLevel 不会显示任何内容,因为它的_level_data是空的。
  • @belkipAndroidness -- what should i do ? -- 你为什么选择以这种方式做事,你有两个不同的类,FileLevel? (如果一个类“看起来像”另一个类并不重要,它们是不同的)。什么是目标/目的?这是你的设计,你需要弄清楚你真正想要做什么。
  • @belkipAndroidness 投票以“过于宽泛”而结束。

标签: c++ string class vector ifstream


【解决方案1】:

GetlevelData 函数返回其向量按值,这意味着创建了一个全新的副本。当副本超出范围时(当表达式 Lvl.GetLevelData().pushback(_level) 完成时会发生这种情况),您推入该向量的任何内容都将丢失。

您应该通过引用返回它

vector<string>& GetlevelData(){ return _level_data; }
//            ^
//            |
// Return by reference

【讨论】:

【解决方案2】:

vector&lt;string&gt;GetlevelData() 返回向量的副本,而不是对它的引用。

因此,您的 Lvl.GetLevelData().push_back(_level); 返回一个副本,将数据添加到向量中,然后再次删除该副本。因此,您将其添加到将立即再次删除的向量中。

您需要通过引用返回它:

vector<string>& GetlevelData(){ return _level_data; }

或者写一个方法来推回数据:

void push_back( const std::string &string) { 
   _level_data.push_back(string);
}

【讨论】:

  • 为什么必须是 const?
  • @belkipAndroidness 传递string 作为参考可以避免额外的副本,但这将允许您修改push_back 内部的字符串。但是因为您不想在其中修改 string,所以您添加了 const,这样您或其他地方使用您的代码,可以确保 string 在传递给 @ 时不会被修改987654331@,无需查看方法定义的内部。
  • 感谢您的解释,但这两种方法似乎都不起作用:/
  • @belkipAndroidness - 但这两种方法似乎都不起作用:/ -- 请解释“似乎不起作用”的含义。很明显,您要返回一个副本,解决该问题的方法是返回一个引用。
  • @belkipAndroidness 那么错误在您的代码中的其他地方,您需要更具体,因为这个简单的示例适用于ideone
猜你喜欢
  • 2016-08-03
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
相关资源
最近更新 更多