【问题标题】:Vector of pointers to base class within a derived class派生类中指向基类的指针向量
【发布时间】:2012-04-22 15:57:07
【问题描述】:

我正在编写一个应用程序,其中我将通过指向基类的指针访问多个派生类。我希望这些派生类之一在应用程序中包含它的邻居(也是基类类型)的指针向量,如下所示:

    #include <vector>

    class BaseClass
    {
    public:
        BaseClass() { }
        virtual ~BaseClass() { }
    };

    class DerivedClass : virtual public BaseClass
    {
    public:
        DerivedClass() : BaseClass() { }
        ~DerivedClass() { }
    private:
        vector<BaseClass*> Neighbors;
    };

但是,得到以下编译器错误:

example.cpp:16: error: ISO C++ forbids declaration of ‘vector’ with no type
example.cpp:16: error: expected ‘;’ before ‘<’ token

这甚至可能吗?如果可能,请有人指出我的错误!编译器应该知道刚刚声明的 BaseClass 是什么类型,实际上声明 BaseClass Foo; 类型的成员有效,所以我不明白为什么向量无法识别 BaseClass*。

干杯!

【问题讨论】:

    标签: c++ vector multiple-inheritance derived-class


    【解决方案1】:

    您没有输入using namespace std;using std::vectorstd::vector&lt;...&gt;...

    #include <vector>
    using std::vector; //choice 1
    using namespace std; //choice 2 
    
    class BaseClass
    {
    public:
        BaseClass() { }
        virtual ~BaseClass() { }
    };
    
    class DerivedClass : virtual public BaseClass
    {
    public:
        DerivedClass() : BaseClass() { }
        ~DerivedClass() { }
    private:
        std::vector<BaseClass*> Neighbors; //choice 3
    };
    

    【讨论】:

    • 选择 2 是一个非常糟糕的主意,并且总是会导致问题!选择 1 可以进入类的范围内,以避免污染包含此文件的代码的命名空间。
    • 确实不错。我倾向于使用选项 1,尽管您的第二点可能会改变我的方式,因为我从未想过这一点。顺便说一句,感谢您将我推向投票的人超过 1k :p
    【解决方案2】:

    旨在作为对答案 #1 的评论:您应该避免在头文件中“使用 ...”声明。将它们保存在实现文件 (.cpp) 中。 Google 的风格指南提供了一些附加信息,原始发帖人和回答者可能会觉得有帮助:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces。我不认可整个 google 样式。

    【讨论】:

    • OP 没有使用using。这是对另一个答案的评论吗?
    • 嗨,迈克,是的,我的回答是对第一个解决方案的评论,但因为我是新成员,所以我没有足够的积分来评论。我会推荐原始海报和第一个答案的作者阅读谷歌的编程指南,以获得关于命名空间的良好解释和合理性,特别是关于使用声明的部分。 google-styleguide.googlecode.com/svn/trunk/…
    • 好的 Scottymac,感谢您的链接。唯一的问题是我不知道如何在类声明中设置命名空间! {std::vector Neighbors} 给出相同的错误。类声明顶部的 {using std::vector} 返回:错误:类范围内非成员的使用声明。
    • using 声明需要靠近定义 (.cpp) 文件的顶部。在答案 #1 中,“选择 3”是我的首选方式(即,您的头文件中根本没有“使用 ...”语句。
    • @Aurelius 在 2012 年的帖子中是否需要此评论?
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2016-02-19
    • 2014-06-16
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多