Я пытаюсь перенести несколько классов из 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