2017-11-06 2 views
0

私はクラスオブジェクトの一般的なリンクリストを作成するための宿題を作成するプログラムを作成しています。先生はテンプレートの代わりにvoidポインタを使用して、シェルのリンクリストを実装する必要があります(はい、あなたがビーチにいるようなシェル、この男は変です)。汎用リンクリストの出力に奇妙な文字(?、n)とスペースがあります。C++

リンクリストに格納されているオブジェクトをコンソールに出力するコードを書いていて、非常に奇妙な出力が得られていますが、デバッグ方法を理解できません。

void* LinkedList::getNextNode() 
{ 
    if (curNode_ == nullptr) 
    { 
    curNode_ = first_; 
    } 

    while (curNode_ != nullptr) 
    { 
     curNode_ = curNode_->link_; 
     return curNode_; 
    } 

    return nullptr; 
} 

そして最後に、ここにある:ここで

はここ
void printToConsole(Shell* newShell, LinkedList& shellList) 
{ 
    do 
    { 
     newShell = static_cast<Shell*>(shellList.getNextNode()); 
     cout << "newShell " << newShell << endl; 
     newShell->printToConsole(); 
    } while (shellList.getNextNode() != nullptr); 

} 

は、各クラスのオブジェクトを指すノードにアクセスするためのリンクリストヘッダ内の関数のコンソールに印刷するには、メイン関数ですシェルヘッダーのコードでメンバー変数を出力します。

void Shell::printToConsole() 
{ 
    cout << name_ << ", " << taxonomy_ << ", " << mass_ << ", " << length_ << endl; 
} 

私はコンソールにリストを印刷するオプションを選択すると今、私は見ている何かのように:?!?!

紙FIg8q Gastropoda08q 0.45P8q 33.4 7Qの9Q ?? 8Q レースMurex 8Q

を7Q

奇妙なことは、出力すべきすべてのテキストがそこにあるということです。これらの奇妙な文字と書式もすべて存在します。私は困惑している。皆さんが私を正しい方向に向けることを願っています。

要求されたとして、ここではシェルクラスのヘッダファイルです:

#include <string> 

using namespace std; 

class Shell 
{ 
private: 
    string name_; 
    string taxonomy_; 
    string mass_; 
    string length_; 

public: 

    Shell(); 
    void setName(string name); 
    void setTaxonomy(string taxonomy); 
    void setMass(string mass); 
    void setLength(string length); 
    void setMass(double mass); 
    void setLength(double length); 
    void printToConsole(); 
    void appendToFile(); 
}; 

そして、ここでは実装です:(空のメソッドを無視する)

#include <iostream> 
#include <fstream> 

#include "Shell.h" 

using namespace std; 

Shell::Shell() 
{ 
    name_ = ""; 
    taxonomy_ = ""; 
    mass_ = ""; 
    length_ = ""; 
} 
void Shell::setName(string name) 
{ 
    name_ = name; 
} 
void Shell::setTaxonomy(string taxonomy) 
{ 
    taxonomy_ = taxonomy; 
} 
void Shell::setMass(string mass) 
{ 
    mass_ = mass; 
} 
void Shell::setLength(string length) 
{ 
    length_ = length; 
} 
void Shell::setMass(double mass) 
{ 

} 
void Shell::setLength(double radius) 
{ 

} 
void Shell::printToConsole() 
{ 
    cout << name_ << ", " << taxonomy_ << ", " << mass_ << ", " << length_ << endl; 
} 
void Shell::appendToFile() 
{ 

} 

より編集:

ここですLinkedList.h:

struct Node 
{ 
    void* data_; 
    Node* link_; 

    Node() 
    { 
     data_ = 0; 
     link_ = 0; 
    } 
}; 

class LinkedList 
{ 
private: 
    Node* first_; 
    Node* last_; 
    Node* curNode_; 
    long listLen_; 

public: 
    LinkedList(); 
    ~LinkedList(); 
    void addLinkToBack(void* ptr); 
    void* removeLinkFromFront(); 
    void* getFirstNode(); 
    void* getNextNode(); 
    long getListLength(); 
}; 

そしてここでは、LinkedListのクラスの実装です:

#include <iostream> 
#include <fstream> 

#include "LinkedList.h" 

LinkedList::LinkedList() 
{ 
    first_ = nullptr; 
    last_ = nullptr; 
    curNode_ = nullptr; 
    listLen_ = 0; 
} 
LinkedList::~LinkedList() 
{ 
    for (int i = listLen_; i > 0; i--) 
    { 
    removeLinkFromFront(); 
    } 
} 
void LinkedList::addLinkToBack(void* ptr) 
{ 
    Node *newNode; //pointer of type node (struct) 
    newNode = new Node; //create the new node 
    std::cout << "newNode = " << newNode << std::endl; 
    newNode->data_ = ptr; //newNode data pointer points to same memory address as ptr, which points to the current shell object 
    std::cout << newNode-> data_ << std::endl; 
    newNode->link_ = nullptr; //set link of newnode to null 

    if (first_ == nullptr) //if first is nullptr, list is empty, first and last point to newnode 
    { 
     first_ = newNode; 
     std::cout << "first_ = " << first_ << std::endl; 
     last_ = newNode; 
    } 
    else //list is not empty 
    { 
     last_->link_ = newNode; //insert newnode at end of list 
     last_ = newNode; //last now points to actual last node of list 
    } 

    listLen_++; 

} 
void* LinkedList::removeLinkFromFront() 
{ 
    std::cout << "removeLinkFromFront called" << std::endl; 
    Node *temp; 

    if (first_ != nullptr) //while there are nodes in the list 
    { 
     temp = first_; //temp points to first node 
     std::cout << "line 49" << std::endl; 
     first_ = first_->link_; //first points to next node 
     std::cout << "line 51" << std::endl; 
     delete temp; 
     std::cout << "line 53" << std::endl; 
    } 

    else if (first_ == nullptr) //list is empty 
    { 
     std::cout << "list is empty" << std::endl; 
     last_ = nullptr; 
     return nullptr; 
    } 

    listLen_--; 
    std::cout << "list length = " << listLen_ << std::endl; 

    return last_; 
} 
void* LinkedList::getFirstNode() 
{ 
    return first_->data_; 
} 
void* LinkedList::getNextNode() 
{ 
    if (curNode_ == nullptr) 
    { 
    curNode_ = first_; 
    } 

    while (curNode_ != nullptr) 
    { 
     curNode_ = curNode_->link_; 
     return curNode_; 
    } 

    return nullptr; 
} 

long LinkedList::getListLength() 
{ 

} 
+0

あなたのLinkedListクラスはどのように初期化されていますか? –

+0

最新の編集内容を表示します。ありがとう –

+0

したがって、Shellクラス内のprintToConsole関数が、メインファイル内のprintToConsole関数から呼び出されたときに正しく動作していないように見えます。呼び出しは正しく行われますが、何らかの理由でShellのprintToConsoleは、1つのShellオブジェクトの値を出力するのではなく、リンクされたリスト内のShellオブジェクトのすべてのメンバー変数の値を出力しようとします。メイン。このアイデアは何ですか? –

答えて

0

私はラインの問題を見ることができます(これらはデバッグのためのもので、出力文を無視):

cout << "newshell" << newshell << endl; 

あなたはostreamに演算子をオーバーロードしていない限り、コンソールにオブジェクトを記録しようとすると、ゴミが表示されます。

cout << "newshell" << endl; 

を...と出力を比較:

は以下でその行を置き換えます。

+0

その行を完全に削除しましたが、問題は変わりません。 –

+0

ヘッダファイルとシェルクラスの実装を見てください。 – pcgben

+0

私の編集を参照してください。ありがとうございました –

0

は、2つの大きな問題があります:グローバルprintToConsole

  1. LinkedList::getNextNodeの結果は、直接 Shell*へのキャストなどとして使用されています。 getNextNodeが返すものはノードデータ(つまりShell)へのポインタではありませんが、Nodeオブジェクトの先頭へのポインタです。

作業コードは次のようになります

Node* nextNode = static_cast<Node*>(shellList.getNextNode()); 
newShell = static_cast<Shell*>(nextNode->data_); 
getNextNode
  • スキップ他のすべてのノード。リストに奇数のノードが含まれていると、エラーが発生します。下記参照古い答えを

  • Shellクラスの

    チェックフィールド、name_taxonomy_など その種類はどのようなものがあり、彼らはchar*ある場合は が正しく\0でそれらを終了していない可能性があり。

    リンクリストに問題がある可能性があります。 、つまりlink_が初期化されていないメモリを指している可能性があります。

    +0

    Shellのメンバ変数はすべて文字列です。 –

    +0

    ノードが作成されると、Link_はゼロに初期化されます。 –

    関連する問題