私はクラスオブジェクトの一般的なリンクリストを作成するための宿題を作成するプログラムを作成しています。先生はテンプレートの代わりに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()
{
}
あなたのLinkedListクラスはどのように初期化されていますか? –
最新の編集内容を表示します。ありがとう –
したがって、Shellクラス内のprintToConsole関数が、メインファイル内のprintToConsole関数から呼び出されたときに正しく動作していないように見えます。呼び出しは正しく行われますが、何らかの理由でShellのprintToConsoleは、1つのShellオブジェクトの値を出力するのではなく、リンクされたリスト内のShellオブジェクトのすべてのメンバー変数の値を出力しようとします。メイン。このアイデアは何ですか? –