2012-03-19 24 views
0

私はjavaからC++にいくつかのクラスを移植しようとしています。C++ std :: vector problems

class ForwardNetwork { 
protected: 
    ForwardLayer* inputLayer; 
    ForwardLayer* outputLayer; 
    vector<ForwardLayer* > layers; 
public: 
    void ForwardNetwork::getLayers(std::vector< ForwardLayer* >& result) { 
     for(int i= 0 ;i< layers.size(); i++){ 
      ForwardLayer* lay = dynamic_cast<ForwardLayer*>(this->layers.at(i)); 
      if(lay != NULL) 
       result.push_back(lay); 
      else cout << "Layer at#" << i << " is null" << endl; 
     } 

    } 
    void ForwardNetwork::addLayer (ForwardLayer* layer) { 
     if(layer != NULL) 
      cout << "Before push layer is not null" << endl; 
     //setup the forward and back pointer 
     if (this->outputLayer != NULL) { 
      layer->setPrevious (this->outputLayer); 
      this->outputLayer->setNext (layer); 
     } 
     //update the input layer and outputLayer variables 
     if (this->layers.size() == 0) 
      this->inputLayer = this->outputLayer = layer; 
     else this->outputLayer = layer; 

     //push layer in vector 
     this->layers.push_back (layer); 

     for(int i = 0; i< layers.size();i++) 
      if(layers[i] != NULL) 
       cout << "Check::Layer[" << i << "] is not null!" << endl; 
    } 

void ForwardNetwork::reset() { 
    std::cout<< "Network size#" << this->layers.size() << std::endl; 
    int index = -1; 
    for (int i = 0; i< this->layers.size(); i++){ 
     cout << "Layer[" << i << "] address#" << layers[i] << endl; 
     if(layers[i] != NULL){ 
     layers[i]->reset(); 
     } 
     else cout << "Layer NULL"; 
    } 
} 
}; 

セカンドクラス:

class Backpropagation : public Train { 
public: 
    Backpropagation::Backpropagation (ForwardNetwork* network){ 
     this->network = network; 
     vector<ForwardLayer*> vec; 
     network->getLayers(vec); 
    } 
}; 

主な機能:今、私はメインから追加する場合

ForwardNetwork* network = new ForwardNetwork(); 
ForwardLayer* layer2= new ForwardLayer(2); 
network->addLayer(layer2); 
ForwardLayer* layer3 = new ForwardLayer(3); 
network->addLayer(layer3); 
ForwardLayer* layer1 = new ForwardLayer(1); 
network->addLayer(layer1); 
network->reset(); 
Train* train = new Backpropagation(network); 

()いくつかの

それでは、私たちは、この2つのクラスを持っているとしましょうaddLayer(..)メソッドを使用してネットワークにレイヤーを追加することができます。私のベクターはちょうどそれと同じです。しかし、私はBackpropagation()コンストラクト私がgetLayers()を入力すると、ベクトルからのオブジェクトのいくつかは、NULLに設定されたアドレスを持っています(ランダムに選択されます:例えば、 2回目は最初に2つのオブジェクトがヌル、3回目は最初のオブジェクトがヌルになるなど)。 これはなぜ起こっているのか説明できません。私はベクトル内になければならないすべてのオブジェクトもネットワーク内にあり、NULLではないと言わなければなりません。

これは、getLayers()だけでなく、addLayer()で行った後でも起こります。 私はこの問題をよく理解できません。私は私のベクトルを修正するかもしれないと最初に考えました。しかし、私はそのようなものを見つけることはできません。 また、ベクトルからの参照がNULLの場合、ForwardNetwork内にリンクリスト(inputLayerとoutputLayer)として存在する参照がNULLではないのはなぜですか?

PS:Ubuntuの11.10

+14

「ベクトル」と書くと、間違っている可能性があります。ベクトルにポインタを格納する必要はありません。実際にはポインタは悪いことです。コンテナのメモリ管理能力を迂回しています。 –

+2

ポインタのベクトルに有効なユースケースがいくつかあります。たとえば、あるベクトルが別のベクトルで実行されたアルゴリズムの結果を保持している場合はどうでしょうか?たとえば、常にそれらをすべてコピーしますか?私はその例では、>は、おそらく、これらの日に行く方法だと言います。 – Benj

+0

shared_ptrのベクタは、ベクタが内部ストレージを再割り当てする必要があるときはいつも、メモリオーバーヘッドと簿記オーバーヘッドを導入しませんか? –

答えて

1

あなたは多型鋳造のいくつかの種類をやっていることを証明したいされていない限り、あなたはForwardNetwork::getLayersの内部dynamic_castを必要としない理由はありません下の私はグラム使用コンパイラ++ GCC 4.6.1の一環として、キャスト元のポインタの型をForwardLayer*型に変換することができます。 1つのForwardLayerポインターを別のポインターに割り当てると、キャストは失敗しません。 NULLポインタを取得しているということは、キャストが失敗していることを意味し、FeedforwardLayerForwardLayerの違いから問題が発生していると思われますが、継承階層がどのように構築されるかを解説するのに十分なコードはありません。

あなたのNULLポインタはリンクされたリストへのポインタを間違って追加した結果ではなく、代わりに失敗したdynamic_castの結果であると言われています。