2015-11-04 40 views
1

我有類節點迷宮由定義:創建節點的從字符串文件C++

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具有指向北部節點null,東部B2,南部A1和西部null的指針。

我正在嘗試創建一個「構建」節點「迷宮」的函數。下面將把私有變量節點startNode和endNode設置爲它們各自的節點和numNode爲文件給出的節點數量。

如何處理字符串數據以爲所有節點標題創建節點,然後在適當的位置分配指針。嘗試:

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*’ 

這是什麼意思?我怎樣才能糾正我的指針分配?

回答

0

沒有讀取完整的代碼:錯誤說,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); 
    } 

即您必須在四次調用中添加一個&,以便將指針傳遞給該函數,而不是該對象本身。

+0

這確實確實修復了attachNewNode錯誤,但現在我得到了一個分段錯誤(核心轉儲),它必須發生在for循環的某處。這類似於超出界限的例外嗎?如果沒有,那可能是什麼原因造成的? –

+0

是的,這可以是超出界限的異常,或者可以通過取消引用非法指針(即指向非分配內存的指針)來引起。一個保存在你的'Node * attachedNodes [4];'array(seg錯誤還有其他原因,但我非常肯定你的案例中提到了其中一個)。要知道肯定在調試器中運行你的程序(參見例如http://valgrind.org/,或者看看你的IDE是否提供了它)。 – Haatschii