【问题标题】:Class that has the member Vector of its own members具有自己成员的成员 Vector 的类
【发布时间】:2016-08-31 02:24:53
【问题描述】:

我正在尝试编写神经网络。我以前用其他语言做过,并且使用过矩阵库;但是,我想自己制作,以便更好地理解它们。但是我的课程遇到了问题。

我正在用 C++ 做这个。

我有一个叫做 ANN 的课程。它有一个层向量。 层是一个名为 Node 的类。 但是,在节点内我想访问上一层节点,所以我可以计算这个节点的值。

我知道我是否有一个类,并且我希望它的一个成员本身就是一个指针。 例如。

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

然而,这不是我想要的。 我希望*previousNode 成为节点的祖先

这是我想要的一个例子

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

现在我听说在这种情况下使用智能指针会更好。我不完全知道那是什么,我知道它基本上是管理它们的指针的包装器。我还认为使用智能指针的主要原因是因为一些指针在使用后被保留为 NULL 或未被删除,但我认为这并不重要,因为此类的范围只能在程序结束时结束。

我的问题是如何实现一个指向该向量所在类的指针向量。

【问题讨论】:

    标签: c++ class pointers vector smart-pointers


    【解决方案1】:

    如果我对您的问题的解释正确,听起来您希望Node 的每个实例都包含指向它所连接的其他Node 对象的指针列表。

    你写的很好,但正如你所说,使用std::shared_ptr 可以使代码更安全。

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

    您应该使用std::make_shared 分配您的节点,只要它们被使用,它们就会在内存中持续存在(不需要newdelete。)

    【讨论】:

    • 这里不使用共享所有权,最好使用std::unique_ptr
    • @GuillaumeRacicot 当前层中的几个节点将指向前一层中的同一个节点,因此唯一所有权不是这里的方法。也许更好的方法是让节点在别处拥有,并让网络结构成为观察者指针的向量。
    • 谢谢,正如@M.M 所说,这里将使用共享所有权,如果每个节点的目的不清楚,我很抱歉,但是我仍然想知道如何访问这些。我了解如何访问向量中的项目,但我仍然需要取消引用指针或智能指针的任何特殊内容吗?
    • @MilesSmith 你可以使用-&gt;* 类似于原始指针
    【解决方案2】:
    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多