C ++ std :: vector问题

时间:2012-03-19 17:33:44

标签: c++ pointers vector

我正在尝试将一些类从java移植到c ++。

所以我们假设我们有两个类:

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

现在,如果我通过addLayer(..)方法从main()将一些图层添加到网络中,这一切都很好。我的矢量就像它应该的那样。但是在我用网络对象调用Backpropagation()构造函数后,当我输入getLayers(),我的一些来自vector的对象将它们的地址设置为NULL(它们是随机选择的:例如,如果我用3层运行我的应用程序一次到vector,vector中的第一个对象是null。如果我第二次运行它前2个对象为null,第三个时间只是第一个对象为null,依此类推)。 现在我无法解释为什么会发生这种情况。我必须说所有应该在向量中的对象它们也存在于网络中并且它们不是NULL;

这在我完成addLayer()后到处发生,所以不仅仅是在getLayers()中。 我不能很好地掌握这个问题。我首先想到我可能会修改我的载体。但是我找不到这样的东西。 另外,如果vector的引用为NULL,那么作为链表(inputLayer和outputLayer)存在于Forw​​ardNetwork中的引用不是NULL?

PS:作为编译器,我使用ubuntu 11.10下的gcc 4.6.1的g ++部分

1 个答案:

答案 0 :(得分:1)

除非您正在进行某种类型的多态转换并且想要证明正在转换的指针类型可以转换为a dynamic_cast,否则您没有理由需要ForwardNetwork::getLayers内部ForwardLayer* ForwardLayer类型。如果您从一个NULL指针指向另一个FeedforwardLayer指针,那么转换应该不会失败。您获得ForwardLayer指针的事实意味着演员表失败,我怀疑问题来自NULLdynamic_cast之间的差异,但是还不够此处提供的代码用于解释继承层次结构的构造方式。

话虽如此,您的{{1}}指针不是错误地将链接添加到链接列表的结果,而是由失败的{{1}}引起的。