2016-08-31 10 views
1

私はニューラルネットワークを作成しようとしています。私はこれまで他の言語でやっていたし、行列ライブラリを使っていた。しかし、私はそれをよりよく理解するために、私自身でそれを作りたかったのです。しかし、私はクラスに問題がありました。独自のメンバのメンバーベクトルを持つクラス

私はC++でこれをやっています。

私はANNというクラスを持っています。それは層のベクトルを持っています。 レイヤはNodeというクラスです。 しかし、ノード内で前のノードのレイヤにアクセスしたいので、このノードの値を計算できます。

私はクラスを持っているかどうかは知っていますが、そのメンバーの1つがそれ自身であることをポインタにする必要があります。 ex。

class Node{ 
public: 
    // Public methods/members here 
private: 
    Node *previousNode; 
} 

しかし、これは私が望むものではありません。 私は*previousNodeがここノード

の祖先になりたいが、私は

class Node{ 
public: 
    //Public functions/members here 
private: 
    vector <Node*> previousLayer; 
} 

は今、私はスマートポインタを使用する方が良いでしょう。このような状況で聞いた何をしたいの例です。私はそれが何であるか正確にはわかりませんが、基本的にはそれらを管理するポインタのラッパーです。私はまた、スマートポインタが使用された主な理由は、いくつかのポインタがNULLのまま残っているか、使用後に削除されないためだと思ったが、このクラスのスコープがプログラム終了時に終わる可能性があります。

私が正しくあなたの質問を解釈していた場合は私の質問は、

答えて

2

。私はベクトルがであるクラスへのポインタのベクトルを実装する方法をであるあなたがのリストを含むようにNodeの各インスタンスをしたいように聞こえますそれが接続されている他のNodeオブジェクトへのポインタ。

あなたが書いた内容は問題ありませんが、あなたが言うように、より安全なコードをstd::shared_ptrに使用することができます。

class Node{ 
public: 
    //Public functions/members here 
private: 
    vector <shared_ptr<Node>> previousLayer; 
} 

あなたはstd::make_sharedを使用してノードを割り当てる必要があり、彼らは限り、彼らが使用されていないとして、メモリ内に保持されます(newまたはdeleteは不要です。)

+0

、より良い使用 'のstd ::現在の層におけるunique_ptr' –

+2

@GuillaumeRacicotいくつかのノードは、そう、前の層内の同じノードを指しますユニークな所有権はここに行く方法ではありません。おそらく、ノードを他の場所に所有させ、ネットワーク構造をオブザーバポインタのベクトルにする方がよいでしょう。 –

+0

ありがとうございます。ここで@M .Mが述べているように、共有所有権が使用されます。残念ながら、各ノードの目的が不明な場合は、私はまだこれらにアクセスする方法が不思議です。私はベクター内の項目にアクセスする方法を理解していますが、ポインタやスマートポインタのために特別なものを逆参照する必要がありますか? –

0
std::vector <Node*> previousLayer; 

あなたがすべて処理する場合イテレータを使用して、ベクターの要素、:

for (auto it = previousLayer.begin(); it != previousLayer.end(); ++it) 
{ 
    Node* node = *it; 
    handle(node); 
} 

// Note: you can using "for (std::vector<Node*>::iterator it = previousLayer.begin(); it != previousLayer.end(); ++it)" instead. 

だけ演算子を使用して、一つの要素にアクセスする場合は[]:

Node* node = previousLayer[n]; 
handle(node); 
// but be careful, don't make the n out of range. that means n must be "0 <= n < previousLayer.size()" 

ベクターの導入:http://en.cppreference.com/w/cpp/container/vectorなし共有所有権をここで使用されていない

関連する問題