作者:佐别 | 来源:互联网 | 2022-12-05 15:09
我坚持使用这种模式,因为我创建的只有一个派生类得到实例化.用g ++和MSVS检查.具体来说,只创建了我定义的第一个派生类.编译器不会发出任何类型的警告.完整代码如下.
#include
static int nodes = 0;
class TreeNode {
private:
int m_id;
public:
TreeNode() :
m_id(++nodes)
{}
TreeNode(int id) :
m_id(id)
{
++nodes;
}
TreeNode* left;
TreeNode* right;
int getId() const {
return m_id;
}
};
template
//typename std::enable_if::value>::type
class TreeParser {
protected:
TreeParser() {
++parsers;
}
public:
static uint32_t parsers;
void preorderTraversal(TreeNode* node) {
if (node != nullptr) {
processNode(node);
preorderTraversal(node->left);
preorderTraversal(node->right);
}
}
virtual ~TreeParser() = default;
void processNode(TreeNode* node) { // 2, 3. the generic algorithm is customized by derived classes
static_cast(this)->processNode(node); // depending on the client's demand - the right function will be called
}
};
template
uint32_t TreeParser::parsers = 0;
class SpecializedTreeParser1 : public TreeParser // 1. is-a relationship
{
public:
explicit SpecializedTreeParser1() :
TreeParser()
{}
void processNode(TreeNode* node) {
std::cout <<"Customized (derived - SpecializedTreeParser1) processNode(node) - "
"id=" <getId() <<'\n';
}
};
class SpecializedTreeParser2 : public TreeParser // 1. is-a relationship
{
public:
explicit SpecializedTreeParser2() :
TreeParser()
{}
void processNode(TreeNode* node) {
std::cout <<"Customized (derived - SpecializedTreeParser2) processNode(node) - "
"id=" <getId() <<'\n';
}
};
int main()
{
TreeNode root;
TreeNode leftChild;
TreeNode rightChild;
root.left = &leftChild;
root.right = &rightChild;
std::cout <<"Root id: " <
输出是:
Root id: 1
Left child id: 2
Right child id: 3
Customized (derived - SpecializedTreeParser1) preorderTraversal() - id=1
Customized (derived - SpecializedTreeParser1) preorderTraversal() - id=2
Customized (derived - SpecializedTreeParser1) preorderTraversal() - id=1963060099 // what is that?
为什么我不能实例化第二个派生类?
1> Michael Kenz..:
我没错,你的程序有不确定的行为.该left
和right
的指针leftChild
,并rightChild
留下未初始化,使其尽快preorderTraversal()
到达那里,你的程序炸毁.这也是你id
最终得到奇怪的原因:它是从一些随机存储位置读取的......
要解决此问题,请确保始终将a left
和right
成员TreeNode
初始化nullptr
为代码的其余部分:
class TreeNode {
…
TreeNode* left = nullptr;
TreeNode* right = nullptr;
…
};