У меня есть дерево n-way, реализованное с использованием std :: vector. Класс Node содержит только указатель на корневой элемент, а класс Link имеет std :: vector указателей на себя. Я назову каждую из своих ссылок, когда я их создаю, но когда я пытаюсь найти узел в этом дереве, используя имя ссылки, но получаю ошибку сегментации. Также я понимаю, что моя функция GetLink() не делает никаких проверок ошибок, я пробовал пару вещей, но они не работали, поэтому, если возможно, было бы очень полезно получить какое-либо предложение о том, как реализовать это в этом случае. Вот мой код:Как получить ребенка в n-образном дереве?
// in node.h
class Node {
public:
// constructors
// fuctions
private:
Link *root;
};
// in link.h
class Link {
public:
//EDIT: added vector initialization in the constructor
Link() : my_links(0) { }
// some functions
// EDIT: example of making the tree
bool Load(token) {
// parsing code based on token
else if (strcmp (temp, "link") == 0)
{
Link* lnk = new Link();
lnk->Load (token);
lnk->Init();
AddChild (lnk);
lnk->m_parent = this;
}
// some more parsing code
}
void Link::AddChild (Link* pChild)
{
my_links.push_back(pChild);
}
Link* Link::GetLink(char* str) // this is the function that is the problem.
{
if (strcmp(name, str) == 0)
{
return this;
}
for (int i=0; i < (int) my_links.size(); i++)
{
//Edit: added check for NULL ptr
if (my_links[i] == NULL)
{
fprintf (stderr, "\n\t Couldn't find link\n\n");
break;
}
//Edit: typo corrected
return my_links[i]->GetLink(str);
}
}
private:
char name[256];
Link* m_parent;
std::vector<Link*> my_links;
};
// in main.cpp
static Node* node;
static Link* link;
main()
{
char *str = "link_3";
link = node->GetLink(str);
printf("\n found link: %s", link->GetName());
retrun 0;
}
EDIT: Переписывание ранее код как MCVE
#include <cstdio>
#include <vector>
#include <cstring>
class Link {
public:
//EDIT: added vector initialization in the constructor
Link() : my_links(0)
{
m_parent = NULL;
}
void SetParent(Link* pParent)
{
m_parent = pParent;
}
// EDIT: example of making the tree
bool Load(char *str)
{
unsigned int len;
Link* lnk = new Link();
len = strlen(str);
strcpy(name, str);
lnk->SetParent(this);
AddChild (lnk);
return true;
}
void AddChild (Link* pChild)
{
my_links.push_back(pChild);
}
Link* GetLink(char* str) // this is the function that is the problem.
{
if (strcmp(name, str) == 0)
{
return this;
}
for (int i=0; i < (int) my_links.size(); i++)
{
//Edit: added check for NULL ptr
if (my_links[i] == NULL)
{
fprintf (stderr, "\n\t Couldn't find link\n\n");
break;
}
//Edit: typo corrected
return my_links[i]->GetLink(str);
}
fprintf(stderr, "\n\t Cannot get link\n\n");
return 0;
}
char* GetName()
{
return name;
}
private:
char name[256];
Link* m_parent;
std::vector<Link*> my_links;
};
class Node {
public:
Node()
{
root = NULL;
}
bool Load (char *str)
{
unsigned int len;
root = new Link(); // here is where the error occurs
len = strlen(str);
strcpy(name, str);
return true;
}
void AddChild (char *str)
{
root->Load(str);
}
Link* GetRoot()
{
return root;
}
private:
char name[256];
Link *root;
};
static Node* node;
static Link* lnk;
int main()
{
node->Load((char*)"I am root");
node->AddChild((char*)"I am child 1");
node->AddChild((char*)"I am child 2");
node->AddChild((char*)"I am child 3");
char *str = (char*)"I am child 2";
lnk = node->GetRoot()->GetLink(str);
printf("\n found link: %s", lnk->GetName());
return 0;
}
Я получаю ошибку сейчас в VS2010 на линии 77, который является "корень = новый Link()" в классе Node , функция Load() является:
Unhandled exception at 0x012e1bbe in nWayTree.exe: 0xC0000005: Access violation writing location 0x00000100.
Если вы используете 'станд :: VECTOR', это не C, что вы пишете, так что не помечать вопрос с C. –
Вы не инициализирован размер' вектора '. Либо 'push_back' все указатели' Link', либо инициализируют размер 'vector' в конструкторе. Следовательно, 'my_links.size()' дает ошибку сегментации. – shauryachats
@ShauryaChats Я инициализирую вектор в конструкторе и имею функцию, которая добавляет детей pushing_back. Я просто не включил его здесь для краткости. – Urler