2012-03-19 4 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"; 
    } 
} 
}; 

2 등석 :

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); 

() 일부

그럼 우리가이 개 수업을 가정 해 봅시다 addLayer (..) 메소드를 통해 네트워크에 레이어를 추가하는 것이 좋습니다. 내 벡터는 꼭 그래야합니다.하지만 Backpropagation() constructo r은 네트워크 객체와 함께 getLayers()를 입력 할 때 벡터의 객체 중 일부가 NULL로 설정된 주소를가집니다 (무작위로 선택됨 : 예를 들어 3 계층을 벡터로 한 번 실행하면 벡터의 첫 번째 객체 두 번째 시간에 처음으로 2 개의 객체가 null 인 경우 세 번째로 첫 번째 객체가 null이되는 등). 이제는 왜 이런 일이 일어나는지 설명 할 수 없습니다. 벡터에 있어야하는 모든 객체는 네트워크 내부에도 존재하며 NULL이 아니며,

getLayers()뿐만 아니라 addLayer()를 사용하면 모든 곳에서 발생합니다. 나는이 문제를 잘 이해하지 못한다. 나는 내 벡터를 수정할지도 모른다고 처음에 생각했다. 그러나 나는 그런 것을 찾을 수 없다. 또한 vector의 참조가 NULL 인 경우 ForwardNetwork 내부의 링크 된 목록 (inputLayer 및 outputLayer)에있는 참조가 NULL이 아닌 이유는 무엇입니까?

추신 : 컴파일러로 난 당신이 당신이 다형성 주조 어떤 종류의 일을하지 않는 ForwardNetwork::getLayers의 내부 dynamic_cast을 필요로하고 있음을 증명하고자 할 이유가 없다 11.10

+14

'벡터 '이라고 쓸 때마다 틀릴 것입니다. 벡터에 포인터를 저장할 필요가 없으며 실제로는 나쁜 것입니다. 컨테이너의 메모리 관리 기능을 우회하고 있습니다. –

+2

포인터의 벡터에 대한 몇 가지 유즈 케이스가 있다고 생각합니다. 벡터가 다른 알고리즘 (예 : )에서 수행 된 알고리즘 결과를 유지하는 경우 항상 모든 것을 복사하고 싶습니까? 나는 그 예에서 벡터 >이 아마 요즘가는 길이라고 말할 수 있습니다. – Benj

+0

벡터가 내부 저장소를 재 할당해야 할 때마다 shared_ptr의 벡터가 메모리 오버 헤드와 부기 오버 헤드를 유발하지 않을까요? –

답변

1

우분투에서 GCC 4.6.1의 g ++ 부분을 사용 에서 캐스팅 될 포인터 유형을 ForwardLayer* 유형으로 변환 할 수 있습니다. 하나의 ForwardLayer 포인터에서 다른 포인터로 지정하면 캐스트가 실패하지 않아야합니다. 당신이 NULL 포인터를 얻는다는 사실은 캐스트가 실패했다는 것을 의미하며, FeedforwardLayerForwardLayer 사이의 차이로 인한 것으로 의심됩니다.하지만 상속 계층 구조가 어떻게 구성되어 있는지에 대한 설명이 충분하지 않습니다.

즉, NULL 포인터는 연결된 목록에 포인터를 잘못 추가 한 결과가 아니며 대신 dynamic_cast이 실패한 결과입니다.