Shapeという共通の抽象基底クラスから派生した異なるオブジェクトを含む単一リンクリストを実装する必要があるuni割り当てがあります。C++で単一リンクリストを作成するためのいくつかのポインタ
クラスの実装では、GitHubにリンクします:shapes.h、shapes.cppです。これまではShape
とその派生クラスCircle
で構成されています。また、Rectangle
,Point
、Polygon
となります。
これらの異なる種類のシェイプの1つのリンクリストを実装する必要があります。これまでのところ私はList
級とNode
-classのための以下のクラスのプロトタイプを作ってみた:
void Append(Shape& inData)
-objectは、次のスタイルで、メインから呼ばれることができるはず
ShapeList
に
class Node
{
public:
Node() {}
friend class ShapeList;
private:
Shape* data;
Node* nextNode;
};
class ShapeList
{
public:
ShapeList(){head = NULL;}
void Append(Shape& inData);
private:
Node* head;
};
:
ShapeList list1;
list1.Append(Circle(5,5,5));
list1.Append(Rectangle(4, 10, 2, 4));
void Append(Shape& inData)
を実装するにはどうすればよいですか?私はいくつかの異なるアプローチを試しましたが、これまでのところ正しい解決策を思い付いていません。
Append
へのパラメータは、(Shape& inData)
以外の値にすることも完全に可能です。
編集:
私はAppend(Shape& inData)
を実装しましたが、それは時々しか動作します:
ShapeList list1;
list1.Append (Circle(5,5,5))
と
Circle circle1;
ShapeList list1;
list1.Append(circle1);
ではなく、次のようにこれまでのところ、私のAppend()
-Implementationが見えます:
void ShapeList::Append(Shape& inData)
{
//Create a new node
Node* newNode = new Node();
newNode->data=&inData;
newNode->nextNode=NULL;
//Create a temp pointer
Node *tmp = head;
if (tmp != NULL)
{
//Nodes already present in the list
//Traverse to the end of the list
while(tmp->nextNode != NULL)
tmp = tmp->nextNode;
tmp->nextNode=newNode;
}
else
head=newNode;
}
それはあなたに大丈夫ですか?ここで
一時オブジェクトからリンクリストを作成すると大きな問題になります。ヒープ上にコピーを作成するか作成する必要があります。 –
あなたが試したアプローチとは何ですか?なぜ彼らは働かなかったのですか?そしてなぜ彼らが働かなかったのかわからないと、あなたをより良い解決に導かないでしょうか? – Caleb
私は、メモリとデータ構造の面で、スタックとヒープの間の問題を実際に理解していると思います。これは、あなたのソリューションを真に理解するためにはじめて必要なことです。 – RageD