Я пытаюсь написать кусок кода для своего рода дерева, которое я создаю, и если узел не существует, я хотел бы выдать исключение, показывающее, какой узел не существует.Т.е.:
Trie t = Trie();
try {
t.get('a');
} catch(NoSuchNode e) {
cout << e.what() << endl;
}
этот код должен просто ничего не делать, если узел существует, в противном случае выведите данную ошибку, вот мой код исключения (я использую std :: exception, потому что это показалось хорошей идеей):
class NoSuchNode : public std::exception
{
private:
char *_node_name;
public:
NoSuchNode(const char *node_name) { _node_name = new char(*node_name); }
virtual const char* what() const throw()
{
std::stringstream ss;
ss << "There exists no node for: " << _node_name << ".";
const std::string& tmp = ss.str();
return tmp.c_str();
}
};
И это работает так, как должно, valgrind также не выдает ошибок при неправильном чтении, так что я полагаю, все в порядке?Теперь на мой вопрос, прежде чем я пришел к этому решению, я просто изменил:
_node_name = new char(*node_name);
на:
_node_name = node_name;
, так что мне не нужно выделять для него больше места,Проблема в том, что иногда он не печатает хорошие данные, а иногда один символ и даже больше после этого.Не совсем то, что я ожидал.Кроме того, Вальгринд пожаловался на то, что я прочел память, которую мог использовать.Почему это?Бьюсь об заклад, что если std :: string просто get - это указатель на символ, он думает, что это строка с нулевым символом в конце и поэтому пытается читать с начала памяти, пока не найдет нулевой символ?Это правильно, и как правильно решить эту проблему?Должен ли я просто передавать данные по значению, как я это делаю?
Добавлено: Каждый узел должен содержать только один символ и ничего более, все, что передается символом, это просто один символ и ничего больше.Так что у меня нет, так сказать, строки в символах.
Итак, получается, что меня действительно заинтересовало то, как потоки обрабатывают ввод char *.Спасибо за ответы!
Если что-то не так в моем коде и у вас есть время, пожалуйста, сообщите мне!
Заранее спасибо!