C ++ std :: векторные проблемы - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь перенести несколько классов из Java в C ++.

Итак, скажем, у нас есть 2 класса:

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

Теперь, если я добавляю из main () несколько слоев в сеть с помощью метода addLayer (..), это все хорошо. Мой вектор такой же, как и должен. Но после того, как я вызываю конструктор Backpropagation () с сетевым объектом, когда я вхожу getLayers (), некоторые из моих объектов из вектора имеют свой адрес, установленный в NULL (они выбираются случайным образом: например, если я запускаю свое приложение один раз с 3 слоями в вектор, первый объект из вектора равен null. Если я запускаю его во второй раз первые 2 объекта нулевые, в третий раз просто первый объект нулевой и т. д.). Теперь я не могу объяснить, почему это происходит. Я должен сказать, что все объекты, которые должны быть в векторе, они также живут внутри сети и не равны NULL;

Это происходит везде после того, как я сделал addLayer (), а не только в getLayers (). Я не могу понять эту проблему. Сначала я подумал, что могу изменить свой вектор. Но я не могу найти такую ​​вещь. Кроме того, почему, если ссылка из вектора равна NULL, ссылка, которая находится внутри ForwardNetwork в виде связанного списка (inputLayer и outputLayer), не равна NULL?

PS: в качестве компилятора я использую g ++ часть gcc 4.6.1 под Ubuntu 11.10

1 Ответ

1 голос
/ 19 марта 2012

Нет причины, по которой вам нужно dynamic_cast внутри ForwardNetwork::getLayers, если вы не выполняете какой-либо тип полиморфного приведения и не хотите подтвердить, что тип указателя, из которого выполняется приведение, может быть преобразован в тип ForwardLayer* , Приведение просто не должно завершиться неудачей, если вы назначаете один указатель ForwardLayer другому. Тот факт, что вы получаете NULL указатели, означает, что приведение не выполняется, и я подозреваю, что проблема связана с разницей между FeedforwardLayer и ForwardLayer, но здесь недостаточно кода, чтобы понять, как ваша иерархия наследования построена.

При этом ваши NULL указатели не являются результатом неправильного добавления указателей в связанный список, а вместо этого являются результатом неудачного dynamic_cast.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...