2016-08-31 5 views
1

Я пытаюсь написать нейронную сеть. Я делал это раньше на других языках и использовал библиотеки матриц; однако я хотел сделать это самостоятельно, чтобы лучше понять их. Однако я столкнулся с проблемой с моими классами.Класс, который имеет член. Участник-участник

Я делаю это на C++.

У меня есть класс под названием ANN. Он имеет вектор слоев. Слои - это класс под названием Node. Однако в узле я хочу получить доступ к предыдущему слою узлов, поэтому я могу вычислить значения этого узла.

Я знаю, если у меня есть класс, и я хочу, чтобы один из его членов был сам по себе, он должен быть указателем. ex.

class Node{ 
public: 
    // Public methods/members here 
private: 
    Node *previousNode; 
} 

Однако это не то, что я хочу. Я хочу *previousNode быть предком узлов

вот пример того, что я хочу

class Node{ 
public: 
    //Public functions/members here 
private: 
    vector <Node*> previousLayer; 
} 

Теперь я слышал в этой ситуации было бы лучше использовать смарт-указатель. Я точно не знаю, что это такое, я знаю, что это в основном оболочка для указателей, которые ими управляют. Я также думал, что основная причина использования умных указателей заключается в том, что некоторые указатели оставляют NULL или не удаляются после использования, но я не думал, что это действительно имеет значение, поскольку объем этого класса может быть только возможен, когда программа закончится.

Мой вопрос заключается в том, как бы я реализую вектор указателей на класс вектор находится.

ответ

2

Если я правильно интерпретировать ваш вопрос, это звучит, как вы хотите, чтобы каждый экземпляр Node содержит список указатели на другие объекты Node, к которым он подключен.

То, что вы написали, прекрасно, но, как вы говорите, это может сделать для безопасного кода использовать std::shared_ptr.

class Node{ 
public: 
    //Public functions/members here 
private: 
    vector <shared_ptr<Node>> previousLayer; 
} 

Вы должны выделить свои узлы с std::make_shared и они будут сохраняться в памяти до тех пор, пока они не используются (нет необходимости в new или delete.)

+0

Нет долевой собственности не используется здесь, лучше использовать 'станд :: unique_ptr' –

+2

@GuillaumeRacicot несколько узлов в текущем слое будет указывать на тот же узел в предыдущем слое, так уникальная собственность - не путь сюда. Возможно, лучший подход состоит в том, чтобы иметь узлы в другом месте и иметь сетевую структуру в виде векторов указателей наблюдателей. –

+0

Спасибо, совместное владение будет использоваться здесь, как указано в @ M.M, извините, если цель каждого узла была неясной, однако мне все еще интересно, как я получу доступ к ним.Я понимаю, как обращаться к элементам в векторе, но мне все же придется разыменовывать указатель или что-то особенное для умного указателя? –

0
std::vector <Node*> previousLayer; 

, если вы хотите, чтобы обрабатывать все элемент в векторе, используя итератор:

for (auto it = previousLayer.begin(); it != previousLayer.end(); ++it) 
{ 
    Node* node = *it; 
    handle(node); 
} 

// Note: you can using "for (std::vector<Node*>::iterator it = previousLayer.begin(); it != previousLayer.end(); ++it)" instead. 

, если вы хотите получить доступ к одному элементу, используя оператор []:

Node* node = previousLayer[n]; 
handle(node); 
// but be careful, don't make the n out of range. that means n must be "0 <= n < previousLayer.size()" 

вектор введение: http://en.cppreference.com/w/cpp/container/vector