将向量声明为类成员变量

3

我有一个简单的类在头文件a.hh中:

#ifndef a_hh
#define a_hh

class a
{
public: 
    int i;
    a()
    {
        i = 0;
    }

};
#endif

接下来有一个文件:b.cc

#include <iostream> 
#include "a.hh"

using namespace std;

int main(int argc, char** argv)
{

    a obj;
    obj.i = 10;
    cout << obj.i << endl;
    return 0;
}
> 

到目前为止一切都很好。 我编译代码,编译也没问题。 但是只要我在类中添加了一个向量:

#ifndef a_hh
#define a_hh

class a
{
public: 
    int i;
    vector < int > x;
    a()
    {
        i = 0;
    }

};
#endif

我收到以下编译错误:

> CC b.cc
"a.hh", line 7: Error: A class template name was expected instead of vector.
1 Error(s) detected.

在此将向量声明为成员的问题是什么?

9
你是否包含了#include <vector>头文件? - Mysticial
1
似乎编译器无法识别向量。您是否已添加了include?并将std::命名空间添加到向量中。 - Geoffroy
4
在包含后,应使用std::vector。 - Drakosha
是的,即使在那之后我仍然得到相同的错误。 - Vijay
2
那个 a::a() 在干嘛?那是不必要的限定符。删掉 a:: 就可以了。 - Eitan T
1
你应该学习并开始使用构造函数初始化列表。 - Kerrek SB
3个回答

5
你需要包含头文件#include <vector>,并使用限定名称std::vector<int> x;
#ifndef a_hh
#define a_hh

#include <vector>

class a{
public:
    int i;
    std::vector<int> x;
    a()             // or using initializer list: a() : i(0) {}
    {
        i=0;
    }
};

#endif 

其他要点:


@EitanT,实际上我已经编译成功了。但你发现的不错,我已经进行了修正。 - hmjd
只是出于好奇,它是如何编译的呢? - Eitan T
那该死的 MSVC 又干了这种事。 - Eitan T
这里并不是什么大问题,但使用初始化列表来为i赋值可能会教授良好的实践方法,而不是延迟赋值。 - ereOn
@hmjd:我正在尝试创建长度为10的任意类型(即通用向量)的向量。请查看代码http://ideone.com/c9UY48。它有什么问题?为什么编译失败? - Destructor
显示剩余4条评论

1

将向量声明为类成员:

#include <iostream>
#include <vector>
using namespace std;

class class_object 
{
    public:
            class_object() : vector_class_member() {};

        void class_object::add_element(int a)
        {   
            vector_class_member.push_back(a);
        }

        void class_object::get_element()
        {
            for(int x=0; x<vector_class_member.size(); x++) 
            {
                cout<<vector_class_member[x]<<" \n";
            };
            cout<<" \n";
        }

        private:
            vector<int> vector_class_member;
            vector<int>::iterator Iter;
};

int main()
{
    class_object class_object_instance;

    class_object_instance.add_element(3);
    class_object_instance.add_element(6);
    class_object_instance.add_element(9);

    class_object_instance.get_element();

    return 0;
}

0

1. 你需要 #include <vector>using namespace std,然后像下面这样使用 a.hh:

#ifndef a_hh
#define a_hh

#include <vector>
using namespace std;

class a
{
public: 
    int i;
    vector <int> x;
    a()
    {
        i = 0;
    }

};
#endif

2. 如果你不想在所有的代码中仅使用 std 命名空间,你可以在类型前指定命名空间,就像 std::vector<int> x;


1
无论您在所有代码中使用命名空间都没有关系。 - hupantingxue
1
这很重要。它会污染全局命名空间,经常会引起问题。 - Nawaz
问题在于你是否编写头文件以供任何可能从你的类中受益的人使用(在这种情况下,你的头文件不应该将std的全部内容放入全局命名空间中)。Nawaz给了你-1的影响,因为你假设你的头文件只会在每个人都始终使用namespace std的条件下使用。 - Steve Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接