11

我创建了一个名为 Student 的类,如下所示:

class Student
{
 private:
     unsigned int id;                                // the id of the student 
public:   
    unsigned int get_id(){return id;};   
    void set_id(unsigned int value) {id = value;};
    Student(unsigned int init_val) {id = init_val;};   // constructor
    ~Student() {};                                     // destructor
};

然后在我想要一个容器(比如一个向量)之后,它的元素是学生类的实例,但我发现自己无法理解这种情况,这是我的问题:

首先我运行这段代码:

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

const unsigned int N = 5;

Student ver_list[2] = {7, 9};


int main()
{

  cout<< "Hello, This is a code to learn classes"<< endl;

  cout<< ver_list[1].get_id() << endl;

return 0;
}

一切都很好,输出是:

Hello, This is a code to learn classes
9

现在当我尝试这些选项时:

选项1:

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

const unsigned int N = 5;

vector <Student> ver[N];             // Create vector with N elements
for(unsigned int i = 0; i < N; ++i )
ver[i].set_id(i); 


int main()
{

  cout<< "Hello, This is a code to learn classes"<< endl;

  cout<< ver[1].get_id() << endl;

return 0;
}

我得到了这个输出“错误”:

test.cpp:26:3: error: expected unqualified-id before 'for'
   for(unsigned int i = 0; i < N; ++i )
   ^
test.cpp:26:27: error: 'i' does not name a type
   for(unsigned int i = 0; i < N; ++i )
                           ^
test.cpp:26:34: error: expected unqualified-id before '++' token
   for(unsigned int i = 0; i < N; ++i )
                                  ^
test.cpp: In function 'int main()':
test.cpp:43:15: error: 'class std::vector<Student>' has no member named 'get_id'

 cout<< ver[1].get_id() << endl;
               ^

选项#2:

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

const unsigned int N = 5;

Student ver[N];                       // Create one dimensional array with N elements
for(unsigned int i = 0; i < N; ++i )
   ver[i].set_id(i); 


int main()
{

  cout<< "Hello, This is a code to learn classes"<< endl;

  cout<< ver[1].get_id() << endl;

return 0;
}

输出“错误”是:

test.cpp:30:14: error: no matching function for call to 'Student::Student()'
Student ver[5];
             ^
test.cpp:30:14: note: candidates are:
test.cpp:14:2: note: Student::Student(unsigned int)
  Student(unsigned int init_val) {id = init_val;};   // constructor
  ^
test.cpp:14:2: note:   candidate expects 1 argument, 0 provided
test.cpp:7:7: note: Student::Student(const Student&)
 class Student
       ^
test.cpp:7:7: note:   candidate expects 1 argument, 0 provided
test.cpp:31:1: error: expected unqualified-id before 'for'
 for(unsigned int i = 0; i < N; ++i )
 ^
test.cpp:31:25: error: 'i' does not name a type
 for(unsigned int i = 0; i < N; ++i )
                         ^
test.cpp:31:32: error: expected unqualified-id before '++' token
 for(unsigned int i = 0; i < N; ++i )
                                ^

在第一次尝试中一切看起来都很好,但是当我尝试下两个选项时,我收到了错误,我希望我能理解我在做什么错。

谢谢。

4

6 回答 6

27

这:

vector <Student> ver[N];

N创建一个元素数组。每个元素都是vector<Student>. 这不是你想要的。您可能正在尝试创建N元素向量。其语法是:

vector <Student> ver(N);

但是您不能使用它,因为您的类没有默认构造函数。所以你的下一个选择是用相同的元素初始化所有对象。

vector <Student> ver(N, Student(0));

您还尝试创建一个这样的学生数组:

Student ver[N];

这行不通。因为它尝试使用默认构造函数初始化数组中的每个元素。但是您的类没有默认构造函数。所以这行不通。但这就是为什么您的原始代码确实有效的原因:

Student ver_list[2] = {7, 9};  // Here you are using the constructor for your object.
                               // It uses the normal constructor you provided not the default one.

另一个问题是您不能在函数(方法)之外运行代码。
所以这不起作用:

for(unsigned int i = 0; i < N; ++i )
    ver[i].set_id(i); 

在 C++11 中,您可以像初始化数组一样初始化向量:

vector<Student>  ver = { 0, 1, 2, 3, 4, 5};

如果您没有 C++11 或初始化更复杂。然后你需要编写一个包装器。

class VecWrapper
{
     public:
         std::vector<Student>   ver;
         VecWrapper()
         {
            ver.reserve(N);
            for(unsigned int i = 0; i < N; ++i )
                ver.push_back(Student(i));
         }
 };

现在你可以把它放在全局范围内,它会自动初始化。

 VecWrapper   myData;  // myData.vec  initializaed before main entered.

 int main()
 {}

完整解决方案:

选项 2:

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

const unsigned int N = 5;

// The following is not correct
// This creates an arrya of `N` elements each element is `vector <Student>`
//
// vector <Student> ver[N];             // Create vector with N elements
// 

// The following lines are not allowed.
// All code has to be inside a function.
//
// for(unsigned int i = 0; i < N; ++i )
// ver[i].set_id(i); 


// What you want is:
//    I use the following because it is unclear if you have C++11 or not.  
class VecWrapper
{
   public:
     std::vector<Student>   vec;
     VecWrapper()
     {
        vec.reserve(N);
        for(unsigned int i = 0; i < N; ++i )
            vec.push_back(Student(i));
     }
};
VecWrapper   myData;  // myData.vec 
int main()
{

  cout<< "Hello, This is a code to learn classes"<< endl;

  cout<< myData.vec[1].get_id() << endl;

return 0;
}
于 2013-10-29T13:38:20.000 回答
2

主要问题是您试图在全局范围内执行 for 循环。在函数外部定义和初始化变量是可以接受的,但使用 for 循环或赋值运算符则不行。将 for 循环放入 main() (我建议您也将 N 和向量/学生数组放入 main() 并且一切都应该工作。
此外,编译器会抱怨,因为当您声明Student array[5];vector<Student> ver[N];它正在寻找默认构造函数时对于名为 Student() 的学生,它只是为类设置默认值。您需要在 Student 类中提供此值;将 id 设置为某个永远不会是实际学生 ID 的值,例如 -1。

于 2013-10-29T12:11:02.667 回答
1

选项1:

你应该替换vector <Student> ver[N]vector<Student> ver(N)

std::vector 是一个类,它自己表示向量,你不应该创建向量数组,你应该将 N(vector size) 传递给它的构造函数。检查此链接

选项#2:

Student ver[N];

是不正确的,因为 Default Constructor Student() 被调用了 N 次,但你还没有实现它。所以你必须使用数组初始化器Student ver[5] = {1, 2, 3, 4, 5}或显式地实现默认构造函数。

当然——“for”循环必须在函数体内使用。

于 2013-10-29T13:11:40.607 回答
1
    #include<iostream>

    using namespace std;

    class Student
    {
        private:
        int id;

        public:
        // Mutator
        void setId(int i)
        {
          id = i;
        }
        // Accessor
        int getId()const
        {
          return id;
        }
    };

    int main()
    {
        const unsigned int N = 5;
        Student ver[N];   // Define instances as an array 
        // of the Student class

        int idStudent[N] = { 11, 32, 37, 4, 50};  // Create 
        // one dimensional array with N elements of the 
        // student ID

        for(unsigned int i = 0; i < N; i++ ){ // Assign 
        //student ID for each object of the class
        ver[i].setId(idStudent[i]);}

        cout<< "Hello, This is a code to learn classes : "
        << endl << endl; // Display the student ID

        for(unsigned int i = 0; i < N; i++ ){
        cout<< "Student ID #"  << i+1 << " of "
        << N << " : " << ver[i].getId() << endl;}

        return 0;

    }
于 2019-08-13T19:00:57.050 回答
0

这实际上与向量根本没有联系。你只需要将你的“for”语句移动到你的 main

于 2013-10-29T12:09:51.030 回答
0

问题的解决方案是创建一个 Student 类的实例数组作为 Student ver[N]。接下来,使用 mutator 函数 setID(int i) 以数组格式 (int idStudent[N] = { 11, 32, 37, 4, 50};) 将给定学生 ID 中的元素分配给学生类:ver[i].setId(idStudent[i]) 和 for 循环来完成这项工作。

最后,使用访问器函数 ver[i].getID() 和 for 循环来显示信息。

于 2019-08-14T22:00:01.617 回答