2012-01-14 8 views
0

C++でリンクリストを実装しようとしています。現在、私は次のコードを持っている:ここではC++でリンクリストを実装するのが難しい

using namespace std; 

struct CarPart 
{ 
    int partNumber; 
    char partName[40]; 
    double unitPrice; 

    CarPart* Next; 
}; 

class ListOfParts 
{ 
private: 
    int size; 
    CarPart* Head; 
public: 
    ListOfParts():size(0), Head(NULL) 
    {  
    } 

    int Count() 
    { 
     return size; 
    } 
}; 

問題があるが、理想的には、私は私のクラスの中Stuct CarPartを維持する必要があります。したくないですが。同時に、私はこれがどこからでもアクセスできるようにしたくありません。

クラス内に構造を作成せずに何らかの方法で対応できますか?代わりにのみクラスListOfPart?sの

+0

を定義する前に前方宣言

struct CarPart 

を忘れないでください、そして、あなたのプロジェクトがこのかざしなっている場合:C++は、すでに単独でリンクされています''にリストしておいてください。あなたはリラックスして上司に "解決して"週末を取ることができます! :-) –

+0

@kerek SB:素晴らしい提案をしてくれてありがとう。私はu..Iと相互作用覚え は、それで遊ぶnはすべての可能なアールを探求することを決めたsometime..finally必要性のためのC++でちょうど学習者となっているのです! – Roger

+0

非常に良い。私の提案は弾丸をかむと* * '今のところ、唯一の学習のために、入れ子になったクラスをCarPart'作り、そしてあなたはそれが動作するようになったとき、あなたは実際の型*テンプレートを作る*とジェネリックを使用しないのいずれかになります"node"クラス。ネストされたクラスとして保持します。 –

答えて

3

まあからアクセス可能である可能性があり、新たなクラスCarPartを作成し、最初の提案として、あなたはstd::listを使用して検討していますか?独自のリンクリストのセマンティクスを実装する手間を省くことができます。

struct CarPart 
{ 

    int partNumber; 
    std::string partName; 
    double unitPrice; 
}; 

std::list<CarPart> ListOfParts; 

をあなたは私が(しない限り、私はあなたが使用することをお勧めテキスト、ためstd::stringを使用しているにも気づくでしょう:あなたは(価値がある可能)学習体験のためのリンクリストを書いている場合を除き、私が使用することをお勧めあなたにはない非常に良い理由があります)。

CarPartのコンストラクタをprivate宣言し、ListOfPartsをフレンドクラスとして宣言することもできます。しかし、これを考えてみましょう。パーツのリストの外側にある車のパーツの建設を拒否することで、あなたは何を得ますか?あなたが何かを得ることがわかりません。実際には、友人を使用することで、コードの構造に不必要な複雑さが導入されます。恐ろしい 'friend'キーワードを使用するのが普通です。あなたは友人のクラスのメソッドを使用したいなかった場合とにかく、次のように記述します。のみListOfpartsを意味するだろう

class ListOfParts; 
struct CarPart 
{ 
    friend class ListOfParts; 

    int partNumber; 
    char partName[40]; 
    double unitPrice; 
    CarPart* Next; 

private: 

    CarPart() 
    { 
     // Do nothing. 
    } 
}; 

がリストCarPartのデフォルトコンストラクタを呼び出すことができます。 私はこれを非常に明確にしておきましょう。カプセル化のルールを破るので、これは嫌な解決策です。しかし、変更可能なように、友人は使用しています(これはそれではありません)。

+0

は次のような意味です: クラスCarPart { int i; フレンドクラスのリストList of parts; Carpart * next; プライベート: CarPArt() {}} クラスlistofParts { {CarPart *ヘッド。 } – Roger

+0

@Roger上記の私の修正を参照してください。 –

+0

でも、以前の私の質問では、クラスの外にあるStructを使っていました。これはカプセル化に従ったものではないでしょうか? それでは、適切なソリューションは何ですか? – Roger

0

あなたが求めていることは矛盾しています。 CarPartを外部からアクセスできるようにするには(別のクラスまたはパブリックメンバーとして宣言した場合)、アクセス可能にしたくない場合(プライベートメンバーとして宣言した場合)。

クラスをもう少し汎用的にすることをお勧めします。CarPartのリンクリストではなく、NodeのリンクリストをそれぞれTとするクラステンプレートにします。あなたが許可されている場合は、とにかくstd::listを使用しているはずですが、本当にしたい場合は、あなた自身で書くことができます。

また、クラスと構造体も基本的に同じです。唯一の違いは、クラスメンバーと継承はデフォルトではprivateであり、構造体メンバと継承はデフォルトで公開されることです。しかし、キーワードは必ずしも入れ替え可能ではありません。

0

CarPart構造体を別のヘッダーに移動し、このヘッダーをListOfParts実装部分にのみ含めることができます(実装から定義を分離する必要があります)。

、ちょうどあなたの情報のため

class ListOfParts 
関連する問題