【问题标题】:Allocating an object of abstract class type c++ xcode分配抽象类类型的对象c ++ xcode
【发布时间】:2017-07-29 22:16:37
【问题描述】:

TreeInterface.h

#ifndef TreeInterface_h
#define TreeInterface_h
#include"PreconditionException.h"
#include"NotFoundException.h"
//#include"Tree.hpp"
template<class ItemType>
class TreeInterface //: public binarySearchTree<ItemType>
{
  virtual void clear()=0;
  virtual  bool isEmpty()const=0;
  virtual int getHeight()=0;
  virtual ItemType getRootData() const throw(precondViolated)=0;
  virtual bool add(const ItemType& item)=0;
  virtual void setItem()=0;
  virtual int getNumberOfNodes()const=0;
  //virtual ItemType getEntry(const ItemType& anEntry) const throw(NotFoundException)=0;
  // int getNumberOfNodes()const;
  //virtual void setRootData(const ItemType& item)=0;
  //virtual void inorder()=0;
};
#endif /* TreeInterface_h */

我尝试创建二叉树,但抽象类有问题。当我尝试创建类binarySearchTree 的新实例时,它给了我一个错误:Allocating an object of abstract class type "binarySearchTree"。我检查了所有功能。我不知道该怎么办。我认为问题在于包含不同的文件,例如 Node.cpp,我不确定。我将不胜感激。

树.h

#ifndef Tree_h
#define Tree_h
#include"TreeInterface.h"
#include"Node.h"
//#include"tree.cpp" // should be correct
#include <stdio.h>
#include <iostream>
#include<cstdlib>
#include"PreconditionException.h"
#include "NotFoundException.h"
using namespace std;
template<class ItemType>
class binarySearchTree: public TreeInterface<ItemType>
{
private:
    node<ItemType>* rootPtr;
protected:
int getHeightHelp(node<ItemType>* subTreePtr)const;

void destroyTree(node<ItemType>* subTreePtr);

node<ItemType>* balancedAdd(node<ItemType>* subTreePtr,node<ItemType>* newNodePtr);

node<ItemType>* copyTree(const node<ItemType>* treePtr) const;
public:
binarySearchTree();

binarySearchTree(const ItemType& rootItem);

binarySearchTree(const ItemType& rootItem,binarySearchTree<ItemType>* leftPart,binarySearchTree<ItemType>* rightPart);

binarySearchTree(const binarySearchTree<ItemType>& treePtr);

void clear();
bool isEmpty()const;
int getHeight();
bool add(const ItemType& item);
ItemType getRootData() const throw(precondViolated);
int getNumberOfNodes(node<ItemType>* subtree)const;
void setItem(ItemType item);
};

` 节点.h

#ifndef Node_h
#define Node_h

#include <stdio.h>
#include<iostream>
using namespace std;
template<class ItemType>
class node
{
private:
ItemType data;
node<ItemType>* left;
node<ItemType>* right;
public:
node();
node(const ItemType &newdata);
node(const ItemType& item,node<ItemType>* leftPtr,node<ItemType>*      rightPtr);
ItemType getNodeItem();
ItemType* getLeftPtr();
ItemType* getRightPtr();
void setLeft(node<ItemType>* newleft);
void setRight(node<ItemType>* newright);
void setNodeItem(ItemType& item);
bool isLeaf() const;
};

当我尝试创建 binarySearchTree 的新实例时出现错误。 main.cpp

#include <iostream>
#include<cstdlib>
#include<string>
#include"Tree.h"
using namespace std;
int main()
{
int num=11;
binarySearchTree<int>* node=new binarySearchTree<int>();  //the error is here. Allocating an object of abstract class type "binarySearchTree" 
node->add(9);
node->isEmpty();
}

【问题讨论】:

标签: c++ xcode binary-tree binary-search-tree pure-virtual


【解决方案1】:

正如 xaxxon 在链接中指出的那样,如果您有一个抽象类(其中虚函数 = 0),则需要覆盖基类中的所有函数才能实例化派生类的对象.你的编译器错误告诉你你没有覆盖所有的函数。

在您的情况下,您的问题稍微更微妙。考虑以下几点:

class Abstract
{
public:
    virtual bool MyFunction(int x) = 0;
};

class Concrete : public Abstract
{
public:
    bool MyFunction()       // This does not override Abstract::MyFunction because it is "overloaded", parameters are different
    {
        return true;
    }
};

int main()
{
    Concrete concrete;
    return 0;
}

虽然看起来我们正在覆盖 MyFunction,但事实并非如此,因为参数不同(基类具有 int x)。所以它的功能不一样,Concrete实际上仍然是一个抽象类。

比较你的函数:void setItem(ItemType item); 不会覆盖基类中的 virtual void setItem()=0;

【讨论】:

  • 您不应在该问题中回答重复的问题。如果您认为副本没有足够的信息,您应该在此处添加一个答案以保持信息集中 - 但大多数情况下现有答案就足够了,而额外的答案只会使获得最佳答案所需的时间更长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多