簡體   English   中英

在C ++中將抽象類與頭文件一起使用

[英]Using Abstract Classes with Header Files in C++

最近,剛剛學習了Java中類繼承的正確應用,並考慮將其應用於我用C ++編寫的某些代碼。

以下是空Node.cpp的標頭:

#ifndef Node_h
#define Node_h

#include <string>

using namespace std;

///////////////////////////////////////////////////////
//Class Declarations
class Array;
class Hash;
class Node;
    class BodyNode;
        class RealNode;
            class CharNode;
            class ComboNode;
        class EndNode;
    class HashNode;
    class NodeFollower;

///////////////////////////////////////////////////////
//Class Definitions
class Node{
public:
    virtual string toString(int info) = 0;
    };

class BodyNode: public Node{
public:
    };

class RealNode: public BodyNode{
protected:
    Hash *wordHash, *addressHash;
    Array *followers;
    int count;

//Initialization
    RealNode();
    ~RealNode();

//Hashes
    BodyNode getNext(int address);
    NodeFollower getWord(BodyNode *word);
    NodeFollower getAddress(int address);

    string toString(int info);
    };

#endif

從此代碼,我得到以下錯誤:

Node.h:43:11: error: invalid abstract return type for member function ‘BodyNode RealNode::getNext(int)’
Node.h:28:7: note:   because the following virtual functions are pure within ‘BodyNode’:
Node.h:25:17: note:     virtual std::string Node::toString(int)

在google,stackoverflow和cplusplus上查找了所有內容,盡管我發現了很多圍繞此問題的答案,但我找不到解決該問題的確切答案。 我從中采購的cplusplus.com網站是:

http://www.cplusplus.com/doc/tutorial/polymorphism/

此外,我在stackoverflow上找到的一些答案表明:

using namespace std;

應該避免,這聽起來像是有充分的理由,但是我不知道該如何包含字符串。 我試過了

string::string

對於每個聲明,我都嘗試過

using namespace std::string;

但兩者都無濟於事。 預先感謝您的幫助!

您的第一個問題是BodyNode從具有toString() 純虛函數的常規Node繼承。 如果它是純虛擬的(= 0),那么您必須在所有派生類中為其提供一個定義,而沒有。

因此,由於沒有在BodyNode提供純虛擬函數定義,因此它也是一個抽象類,並且是不可實例化的(抽象類具有1個或多個純虛擬方法,因此無法實例化)。

您還存在一個問題,即getNext()返回BodyNode類型,並且由於BodyNode是抽象的,所以這是不可能的-您可以返回指向它的指針而不是按副本值,但是我認為您的真正問題是首先它不應該是抽象的。

在BodyNode中提供默認的toString()函數來解決您的問題。

您不能將抽象類用作函數返回類型。 但是您可以返回指針或對其的引用,如以下聲明所示:

BodyNode* getNext(int address);
BodyNode& getNext(int address);

您可以將字符串聲明為:

#include <string>
...
std::string myString;

由於BodyNode也是一個抽象類,所以您不能從getNext返回它。 您必須返回一個引用或一個指針。

BodyNode也是一個抽象類,因為-從抽象類派生的類必須實現純虛函數,或者它們也都是抽象類。

您不能返回BodyNode類型的對象。 您只能返回指針或引用。 請參閱-

http://msdn.microsoft.com/en-us/library/c8whxhf1.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM