C++std::向量问题

C++ std::vector problems

本文关键字:问题 向量 C++std      更新时间:2023-10-16

我正在尝试将一些类从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(它们是随机选择的:例如,如果我在vector中运行了一次带有3层的应用程序,vector的第一个对象就是NULL。如果我第二次运行它,前2个对象是NULL,第三次只运行第一个对象NULL,以此类推)。现在我无法解释为什么会发生这种情况。我必须说,所有应该在向量中的对象,它们也生活在网络中,并且它们不是NULL;

在我完成addLayer()之后,这种情况到处都会发生,所以不仅仅是在getLayers()中。我不能很好地理解这个问题。我首先想到我可以修改向量。但我找不到这样的东西。此外,如果来自矢量的引用为NULL,那么作为链表(inputLayer和outputLayer)存在于ForwardNetwork内部的引用为什么不为NULL?

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

没有理由需要ForwardNetwork::getLayers内部的dynamic_cast,除非您正在执行某种类型的多态类型转换,并且希望证明从中转换的指针类型可以转换为ForwardLayer*类型。如果从一个ForwardLayer指针分配给另一个,那么强制转换就不会失败。得到NULL指针的事实意味着转换失败,我怀疑问题来自FeedforwardLayerForwardLayer之间的差异,但这里没有足够的代码来解释继承层次结构是如何构建的。

也就是说,您的NULL指针不是错误地将指针添加到链表的结果,而是由失败的dynamic_cast导致的。