0

我正在尝试传递一个数组Student

进入函数processStudent(string myFilename, Student* myArray, int &mySize)。但它给了我不同类型的错误。

Student() 什么都不做,但我尝试为它们分配某种值,它仍然给出完全相同的错误消息:

主要我有这个:

// Create an array of students, with the size of theMax (256)
Student* arrayOfStudent= new Student[theMax];

// An integer that will keep track of actually how many students
// Because when we loop, we want to loop within the cell
// that actually have data or student.
int actualSize = 0;

// Invoke the helper function to set up the array of students
// It passed the arryOfStudent by reference, so the changes
// inside of the function will be reflected when it returns
processStudent(filename, arrayOfStudent, actualSize);

函数是这样的:

void processStudent(string myFilename, Student* myArray, int& mySize)
{
    // Something here, but removed still gives that error
}

// 在班级Student的cpp文件中

Student::Student() 
{
    // Nothing here
}

错误信息:

new-host-2:csci135p1 george$ g++ -Wall -o csci135p2main csci135p2main.cpp
Undefined symbols for architecture x86_64:
  "Student::Student()", referenced from:
      _main in cc3fTXti.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

我一直在剥离和剥离我的代码,但这个错误不会消失。我想创建这个数组,并将它传递给 processStudent 函数,这样它就可以在读取文件时设置每一个。

4

5 回答 5

1

你应该问自己一些可以帮助你的问题:

“我如何创建新的学生实例?”
好吧,我这样做:Student* s = new Student();- 它创建新对象并将对它的引用存储为指针(Student*

“那么我如何创建一个 10 Students 的数组呢?”
好吧,它可能是一个指向 new 的指针数组,Student我可能不得不多次调用new......通过这样想,你很容易得到这样的结果:

Student** students = new Student*[10];
for (int i = 0; i < 10; ++i)
    students[i] = new Student();

...这意味着,当你清理它时,你必须调用delete每一个Student*加号,你必须清理数组本身:调用delete[]-Student**当你意识到丑陋的内存管理与指针数组连接时,它应该让你寻找更简单和更好的方法来实现它,因此你应该最终使用std::vector对象而不是数组,如果可能的话,而不是指针,如果不是,那么至少使用智能指针而不是裸指针。

于 2012-04-13T14:48:39.703 回答
1

第一个错误(自从我写这篇文章以来似乎已从问题中删除)告诉您第二个参数processStudent是指针到指针Student**,而不是指针,Student*。这很奇怪,因为您使用参数显示您的声明Student*;你确定这是你的代码中的实际声明吗?你在某处有不同的声明吗?

第二个错误可能是因为您没有链接到包含构造函数定义的单元。您只使用一个源文件 ( csci135p2main.cpp) 调用编译器,我猜您在不同的源文件中定义了构造函数。

于 2012-04-13T14:38:34.367 回答
1

有错误信息告诉你答案:

学生*”到“学生**”</p>

更改myArray参数的类型processStudent()

void processStudent(string myFilename, Student** myArray, int& mySize)
{
}

当一个数组被传递给一个函数时,它会衰减为一个指针:

void some_func(char* b) {...}

char buf[100];
some_func(buf);

当您将arrayOfStudent数组衰减传递给一个指针时,恰好该数组是一个指针数组,因此**.


链接器抱怨它无法找到Student. 该定义包含在Student.cpp文件中,因此编译所有源文件以解决链接器错误:

g++ -Wall -o csci135p2main csci135p2main.cpp Student.cpp

于 2012-04-13T14:33:33.623 回答
0

您的代码容易出错,难以维护异常不安全的 C++。在现代 C++ 中,您应该使用std::vector<Student>, 和Student实现移动语义的类,vector<shared_ptr<Student>>或者基于实例vector<unique_ptr<Student>>的所有权(共享与否) 。Student

如果学生数组是输入/输出参数,您的函数原型应该是这样的:

void processStudent(const std::string & filename, std::vector<Student> & students);

相反,如果processStudent函数创建学生数组(例如基于文件的内容),只需将其作为返回值返回(由于移动语义,这非常有效):

std::vector<Student> processStudent(const std::string & filename);
于 2012-04-13T15:01:16.277 回答
0

you'd better use a vector of Student (prefer using arrays only with basic types (int, char..) and vectors for everything else).

#include <vector>

std::vector<Student*> arrayOfStudent = new vector<Student*>();
/* ... */
processStudent(filename, arrayOfStudent, actualSize);

and

void processStudent(std::string& filename, vector<Student*>& arrayOfStudent, int& actualSize) {
/* ... */
}

I'm not sure whether that would solve your problem, but at least that's a better use...

于 2012-04-13T14:41:43.853 回答