【问题标题】:Static Collection of Instances C++? [duplicate]实例 C++ 的静态集合? [复制]
【发布时间】:2014-07-09 20:30:13
【问题描述】:

我有一个 Phone 类,我想要它,在创建时将其自身添加到电话的静态集合中。所以我有收藏:

static vector < class Phone* > instances;

在构造函数中我这样做:

Phone::instances.push_back(this);

但是链接器抛出了一个无法解析的外部符号,这是为什么呢?我究竟做错了什么?我没有找到类似的问题。是否需要在构造函数之外添加实例?还是我必须在另一个班级上收藏?非常感谢。

【问题讨论】:

    标签: c++ collections constructor static instances


    【解决方案1】:

    你必须在你的类之外声明静态成员。

    在您的标题中:

    class Phone{
    ...
    static vector < class Phone* > instances;
    ...
    };
    

    在您的 cpp 中,您需要创建它的实例:

    //on global or namespace scope
    vector <Phone*> Phone::instances;
    

    【讨论】:

    • 谢谢@shr,我想这件事已经发生在我身上了,这是为什么呢?我可以在任何地方阅读有关该主题的更多信息?谢谢!
    • 变量大多在源文件中声明。静态成员必须在某处声明,如果您在标头中声明它,它将为每个源(包括标头)声明变量,您将收到already defined 链接错误。这就是为什么您不在头文件中声明变量的原因。 (除非是静态全局,就像每个源文件的本地不同,与主题无关)
    【解决方案2】:

    另外,只是一个旁注,不是对您问题的直接回答,最好有一个“std::shared_ptr”向量,而不是原始指针。但是,如果您是 std::shared_ptr 的向量,您将无法将“this”添加到该向量中,因此您必须在您的类中再添加一个东西,以便能够在您包装的类中访问“this”在 std::shared_ptr 中。以下是您可以执行的操作:

    class Phone : public std::enable_shared_from_this<Phone>
    {
        static vector<std::shared_ptr<Phone>> instances;
    }
    
    //then somewhere in your code:
    Phone::instances.push_back(shared_from_this());
    

    在您的 .cpp 文件中:

    vector<std::shared_ptr<Phone>> Phone::instances;
    

    【讨论】:

    • 酷,但我对shared_ptrs了解不多,为什么它们更好?我想我应该在线阅读:P
    • 它们更好的原因是因为它确实引用计数。一旦没有 shared_ptrs 指向创建的对象,它就会自动被破坏。因此,您不必担心手动删除它们。
    猜你喜欢
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多