2016-03-30 34 views
0

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

, ama burada fikir türetilmiş sınıfların herhangi numarası olan bir ağaç nesne oluşturmak ve 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; 
} 

cevap

0

Tree ve Node sınıflarını birleştirdiğinizden geliyor. Bunu kendisi iki çocuğu var olduğu bir "kök Node olmalıdır tek bir "kök" ağaç ile yapıcı içinde Tree başlatılıyor olması durumunda, NodeTree devralan olmaz -. Eğer iki ayrı sınıfları olurdu

.

veya belki de soyut bir Node sınıf ve farklı düğüm türleri için kapıyı açarak, iki çocuklu bir düğüm represnet onu devralan bir BinaryNode var (ikiden fazla çocuk, veya dengesiz çocuklu düğümler).

Yani sorunuzu cevaplamak için, evet, "base" i varsayılan değerle başlattığınız garip görünüyor, ama sanırım bunun nedeni sınıf hiyerarşinizin yanlış olmasıdır. derivedClassA, Tree değil.

+0

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

İlgili konular