Sorun, temel sınıf yapıcısını derivedClassA
'a göre aşağıda olan şekilde nullptr
olarak başlatılmış olarak adlandırıp tamamlamamasıdır. Kod beklendiği gibi çalışıyor ama yine de yanlış geliyor. Sınıfın Tree
türetilen diğer sınıfları atladık uzunluğu uğruna Türetilmiş sınıf yapıcı temel sınıf yapıcısını çağırıyor
getStringExpression()
arayıp onu dönecektir ki ne olursa olsun getStringExpression için değerlendirir. Örneğin,
Tree
türünde bir nesne
DerivedClassA
nesnesine, sağ ve sol çocukların "Araba" ve "Sürüş" öğelerine eşit olduğu bir işaretçi içeriyorsa,
Tree.getStringExpression();
"(Araba + Sürüş)" döndürecektir. Car ve Ride değerlerini, sırasıyla,
getStringExpression()
yöntemi çağrıldığında "Araba" ve "Ride" dizesini döndüren Tree'den türetilen somut sınıflar tarafından döndürüldüğünü (ve bunların hiç bir çocuğu yoktur) varsayalım.
TüretilmişClassA'daki tek bir nesne oluşturduğumda, bu nesne temel yapısı oluşturucusunu türetilmiş bir şekilde oluşturduğum için temel sınıf yapıcısını sıfırlamak yanlış olur, çünkü bu nesnenin yapısı sırasında oluşturulmuş iki çocuğu olan kök düğümdür. Bu senaryoda oluşturulmuş Tree
'a ne olur? İşaretçi nullptr olduğundan, gerçekten kullanılmıyor ya da bu tür bir bağlantının kesilmesi ya da bağlantısının kesilmesi ya da tekil olmaması, derivedClassA
...
Önceden özür dilerim çünkü bunun en açık soru olmadığını biliyorum.
Tree.h-
class Tree
{
public:
explicit Tree(Tree *rootNode);
virtual ~Tree() {};
virtual std::string getStringExpression() const;
private:
Tree *rootNodePtr = nullptr;
};
Tree.cpp-
#include "Tree.h"
Tree::Tree(Tree *rootNode)
{
rootNodePtr = rootNode;
}
std::string Tree::getStringExpression() const
{
if(rootNodePtr != nullptr)
{
return rootNodePtr->getStringExpression();
}
return "Tree has no children";
}
derivedClassA.h-
#include "Tree.h"
class derivedClassA :
public Tree
{
public:
derivedClassA(Tree *leftChild, Tree *rightChild);
virtual ~derivedClassA();
virtual std::string getStringExpression() const override;
private:
Tree *leftChildPtr = nullptr;
Tree *rightChildPtr = nullptr;
};
derivedClassA.cpp-
#include "derivedClassA.h"
derivedClassA::derivedClassA(Tree *leftChild, Tree *rightChild): Tree(nullptr)
{
leftChildPtr = leftChild;
rightChildPtr = rightChild;
}
derivedClassA::~derivedClassA()
{
}
std::string derivedClassA::getStringExpression() const
{
auto expressionValue = "(" + leftChildPtr->getStringExpression() + "+" + rightChildPtr->getStringExpression() + ")";
return expressionValue;
}
Bu sesle - Tree'yi tamamen ayrı bir sınıf haline getirdiğimde ve bir ikiliNode özet sınıfının eşdeğerini yaptım. Ağaç ikili bir düğüm türetilmiş sınıf için bir işaretçi ile oluşturulur – LBaelish