我在运行时遇到了矢量迭代器不兼容的错误。发生的行是在代码部分的最后,在for循环内(humans.push_back(Human(& deck,(* iter)));) 当我第一次遇到错误时,我错误地使用了与'iter'不同的迭代器,因此运行时错误完全有意义。但是现在我改变了它并重新编译了所有内容(我仔细检查过),我仍然会收到此错误。
void BlackjackGame::getHumansAndHouse()
{
// asks how many players, pushes_back vector accordingly, initializes house, checking for valid input throughout
string input;
vector<string> names;
while(true)
{
cout << "How many humans? (1 - 7)" << endl;
cin >> input;
if(!isdigit(input[0]))
cout << "Invalid input. ";
else
{
input.erase(1);
int j = atoi(input.c_str());
for(int i = 1; i <= j; i++)
{
while(true)
{
cout << "Enter player " << i << " name: ";
cin >> input;
if(strcmp(input.c_str(), "House") == 0)
cout << "Player name has to be different than 'House'." << endl;
else
{
names.push_back(input);
break;
}
}
}
break;
}
}
vector<string>::iterator iter;
for(iter = names.begin(); iter != names.end(); iter++)
humans.push_back( Human(&deck, (*iter)) );
house = House(&deck);
}
人类是一个载体:
vector<Human> humans;
其中Human是一个类,其构造函数如下:
Human(Deck *d, string n) : Player(d), name(n) { printNameCardsAndTotal(); }
(人类是玩家的派生类)
因为iter是字符串向量的迭代器,所以我不明白为什么我在for循环中得到的向量迭代器与该行不兼容。这并不像我试图直接与人类一起使用它。
错误在这里:
humans.push_back( Human(&deck, (*iter)) );
答案 0 :(得分:3)
错误出现在您未显示的代码中。我根据您的代码和您的描述编写的以下代码不会产生任何错误:
#include <vector>
#include <string>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cctype>
using namespace std;
class Deck
{
};
class Player()
{
public:
Player(Deck *d) {}
};
class Human : public Player
{
public:
Human(Deck *d, string n) : Player(d), name(n) {}
private:
string name;
};
class House
{
public:
House(Deck *d) {}
};
int main()
{
Deck deck;
vector<Human> humans;
string input;
vector<string> names;
while(true)
{
cout << "How many humans? (1 - 7)" << endl;
cin >> input;
if(!isdigit(input[0]))
cout << "Invalid input. ";
else
{
input.erase(1);
int j = atoi(input.c_str());
for(int i = 1; i <= j; i++)
{
while(true)
{
cout << "Enter player " << i << " name: ";
cin >> input;
if(strcmp(input.c_str(), "House") == 0)
cout << "Player name has to be different than 'House'." << endl;
else
{
names.push_back(input);
break;
}
}
}
break;
}
}
vector<string>::iterator iter;
for(iter = names.begin(); iter != names.end(); iter++)
humans.push_back( Human(&deck, (*iter)) );
House house = House(&deck);
return 0;
}
答案 1 :(得分:1)
相反,请尝试
iter != names.end()
答案 2 :(得分:0)
始终在for循环中预先增加迭代器,并使用it != end
作为C ++中的标记(这也适用于int
s。
for(iter = names.begin(); iter **!=** names.end(); **++iter**)
答案 3 :(得分:0)
Microsoft <vector>
标头实现在您的构建中启用了一些调试检查,使迭代器比仅仅指针更丰富的对象 - 它们跟踪它们正在迭代的容器及其“邻居”迭代器以及他们指向的对象。您遇到的断言是检查应该指向同一容器的2个迭代器,但它发现它们没有(根据迭代器的状态)。
因此,您要么在某处破坏迭代器对象/列表,要么正在执行代码片段中未显示的内容。