【发布时间】:2015-03-17 11:49:15
【问题描述】:
我已经使用 C# 大约一年了,最近一直在测试我对 C++ 严酷世界的耐心。
我正在尝试创建一个面向对象的二叉树。我已经逐步完成了代码并阅读了 C++ 中引用参数传递和 const 的使用,但无法弄清楚我正在做什么来导致访问冲突错误。我已确保正确创建了结构,并且代码按预期完成了 main 的第一行,但是调用 toString 似乎会导致错误,我无法弄清楚原因。
这是目前为止的代码:
// ExpressionCL.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
using namespace std;
template<class TData> class TreeNode
{
private:
TData Data;
const TreeNode<TData>* Left = nullptr;
const TreeNode<TData>* Right = nullptr;
void setData(TData data)
{
Data = data;
}
public:
TreeNode<TData>(TData data)
{
setData(data);
}
TreeNode<TData>(TData data, const TreeNode<TData>& leftNode, const TreeNode<TData>& rightNode)
{
setData(data);
setLeft(leftNode);
setRight(rightNode);
}
void setLeft(const TreeNode<TData>& leftNode)
{
Left = &leftNode;
}
void setRight(const TreeNode<TData>& rightNode)
{
Right = &rightNode;
}
TreeNode<TData> getLeft() const
{
if (hasLeft())
{
return Left;
}
}
TreeNode<TData> getRight() const
{
if (hasRight())
{
return Right;
}
}
TData getData() const
{
return Data;
}
bool hasLeft() const
{
if (Left != nullptr)
{
return true;
}
else
{
return false;
}
}
bool hasRight() const
{
if (Right != nullptr)
{
return true;
}
else
{
return false;
}
}
string toString() const
{
string treeString = "";
if (hasLeft())
{
treeString += Left->toString();
}
treeString += to_string(Data);
if (hasRight())
{
treeString += Right->toString();
}
return treeString;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
TreeNode<int> IntTree(1, TreeNode<int>(1), TreeNode<int>(2));
cout << IntTree.toString() << endl;
return 0;
}
一些指导或进一步推荐的资源会很棒。
【问题讨论】:
-
你对指针和引用感到困惑>o
-
存储指向临时对象的指针会给你带来麻烦。
-
并且代码不应该按照编写的那样编译,至少如果你打开了警告(和错误),你真的应该这样做。
getLeft和getRight的路径没有return语句。 -
@ChristopherCreutzig 返回失败不需要编译错误或警告。当然,OP 仍然应该修复这些功能。
-
另一件事是
hasLeft()可以写成return Left != nullptr;。这将大大提高代码的可读性。