Создайте лабиринт узлов из строкового файла C++
У меня есть класс Node, как определено:
class Node
{
public:
Node(string newName);
Node();
void setNodeName(string newName);
string getNodeName();
void attachNewNode(Node *newNode, int direction);
Node *getAttachedNode(int direction);
private:
string name;
Node *attachedNodes[4];
};
Node::Node(string newName)
{
name = newName;
}
Node::Node()
{};
void Node::setNodeName(string newName)
{
name = newName;
}
string Node::getNodeName()
{
return name;
}
void Node::attachNewNode(Node *newNode, int direction)
{
attachedNodes[direction] = newNode;
}
Node* Node::getAttachedNode(int direction)
{
return attachedNodes[direction];
}
У меня есть файл Maze1.txt:
9
A1
C3
A1 A2 B1 * *
A2 * B2 A1 *
A3 * B3 * *
B1 * * * A1
B2 B3 C2 * A2
B3 * * B2 A3
C1 C2 * * *
C2 C3 * C1 B2
C3 * * C2 *
Где 9 - количество создаваемых узлов, A1 - узел, с которого мы начнем навигацию, C3 - узел, к которому мы попытаемся найти путь, а следующие строки представляют сами узлы и указатели, с которыми они связаны., Например:
A1 A2 B1 * *
представляет узел A1, имеет указатели на узел A2 на севере, B1 на востоке, ноль на юге и ноль на западе.
A2 * B2 A1 *
представляет узел A2, имеющий указатели на нуль на севере, B2 на востоке, A1 на юге и ноль на западе.
Я пытаюсь создать функцию, которая "строит" "лабиринт" узлов. Далее будут установлены закрытые переменные Nodes startNode и endNode для их соответствующих узлов, а numNodes для количества узлов, как указано в файле.
Как я могу обработать строковые данные, чтобы создать узлы для всех заголовков узлов, а затем назначить указатели там, где это необходимо. Попытка:
ifstream instream;
instream.open("Maze1.txt");
string line;
string data;
int numLines = 1;
int numNodes;
Node startNode();
Node endNode();
while(getline(instream, line))
{
istringstream iss(line);
data += line + "\n";
iss.clear();
if(numLines == 1)
{
istringstream buffer(line);
buffer >> numNodes;
}
if(numLines == 2)
Node startNode(line);
if(numLines == 3)
Node endNode(line);
if(numLines > 3)
{
Node temp(line.substr(0,2));
rooms.push_back(temp);
}
iss.clear();
numLines++;
}
Это создаст и заполнит вектор узлов, каждый из которых назван первым узлом, упомянутым в каждой строке строки файла. После этого цикла мне нужно пройти через другой цикл, просматривая каждый фрагмент строки и назначая указатели для соответствующего узла в векторе. Попытка:
ifstream repeat;
repeat.open(filename);
numLines = 1;
skipBlanks = 1;
int roomNum = 0;
while(getline(repeat, line))
{
if(line.empty())
{}
else
{
istringstream iss(line);
if(numLines == 1)
skipBlanks++;
if(numLines == 2)
skipBlanks++;
if(numLines == 3)
skipBlanks++;
if(numLines > 3 && skipBlanks > 3)
{
int first = line.find(" ", 0);
int second = line.find(" ", first + 1);
int third = line.find(" ", second + 1);
int fourth = line.find(" ", third + 1);
for(int i = 0; i < rooms.size(); i++)
{
if(rooms[i].getNodeName() == line.substr(first+1,2))
rooms[roomNum].attachNewNode(rooms[i],1);
if(rooms[i].getNodeName() == line.substr(second+1,2))
rooms[roomNum].attachNewNode(rooms[i],2);
if(rooms[i].getNodeName() == line.substr(third+1,2))
rooms[roomNum].attachNewNode(rooms[i],3);
if(rooms[i].getNodeName() == line.substr(fourth+1,2))
rooms[roomNum].attachNewNode(rooms[i],4);
}
}
roomNum++;
numLines++;
iss.clear();
}
}
Однако мне выдаются ошибки компиляции для каждого из вызовов функции attachNewNode(Node *newNode, int direction).
error: no matching function for call to ‘Node::attachNewNode(__gnu_cxx::__alloc_traits<std::allocator<Node> >::value_type&, int)’
rooms[roomNum].attachNewNode(rooms[i],1);
^
note: candidate is:
note: void Node::attachNewNode(Node*, int)
void Node::attachNewNode(Node *newNode, int direction)
^
note: no known conversion for argument 1 from '__gnu_cxx::__alloc_traits<std::allocator<Node> >::value_type {aka Node}’ to ‘Node*’
Что это значит? И как я могу исправить свое назначение указателей?
1 ответ
Не читая ваш полный код: ошибка говорит, что Node::attachNewNode
ожидает указатель на Node
но вы даете ему Node
сам. Эта конкретная проблема может быть решена путем изменения вашего звонка с
for(int i = 0; i < rooms.size(); i++)
{
if(rooms[i].getNodeName() == line.substr(first+1,2))
rooms[roomNum].attachNewNode(rooms[i],1);
if(rooms[i].getNodeName() == line.substr(second+1,2))
rooms[roomNum].attachNewNode(rooms[i],2);
if(rooms[i].getNodeName() == line.substr(third+1,2))
rooms[roomNum].attachNewNode(rooms[i],3);
if(rooms[i].getNodeName() == line.substr(fourth+1,2))
rooms[roomNum].attachNewNode(rooms[i],4);
}
в
for(int i = 0; i < rooms.size(); i++)
{
if(rooms[i].getNodeName() == line.substr(first+1,2))
rooms[roomNum].attachNewNode(&rooms[i],1);
if(rooms[i].getNodeName() == line.substr(second+1,2))
rooms[roomNum].attachNewNode(&rooms[i],2);
if(rooms[i].getNodeName() == line.substr(third+1,2))
rooms[roomNum].attachNewNode(&rooms[i],3);
if(rooms[i].getNodeName() == line.substr(fourth+1,2))
rooms[roomNum].attachNewNode(&rooms[i],4);
}
Т.е. нужно добавить &
в ваших четырех вызовах, чтобы передать указатель на функцию вместо самого объекта.