C++指向对象的指针堆数组中,如何将字符串传递给特定对象?有一些代码请看一下:

C++ Heap array of pointers to objects, how can I pass a string to a specific object? Have some code please take a look:

本文关键字:对象 看一下 代码 字符串 指针 数组 C++      更新时间:2023-10-16

如何简单地将这行文本传递给成员函数?这就是我要问的全部内容...有一个名为 Student:Populate(std::string) 的成员函数,我想将 Student 的特定实例连接到特定文件行的数据......我不知道如何在语法上做到这一点。

这是为了学校作业,所以我必须手动分配新的/删除,没有智能指针,也没有向量,所以只是排除这些。

int main(){
std::stringstream stream;
std::string current;
Student temp;
Student *database = new Student[50];
inFile.open("students.dat", std::ifstream::in);
outFile.open("FullReport.txt",std::ofstream::out);
while(getline(inFile,current)){
for(int i = 0; i < 50; i++){
Student[i] = new Student(current); //this line doesn't work when it's compiled
outFile << Student[i] <<std::endl; //neither does this one
//there is a Student Populate(std::string); function I would like to pass the data to... How can I do that? 
}
inFile.close();
outFile.close();
}

编译器错误:

错误:"["令牌之前的预期非限定 ID 学生[i] = 新生(当前); ^ 主.cpp:26:27:错误:"["标记之前的预期主表达式 outFile <<Student[i] <</div>

所以,有几件事。

首先,没有Student[i].Student是一个类名。类无法从operator[]访问,除非您重载它(可能是您类中的未来主题),即使这样,它也可能不是静态的,这意味着Student[i]没有真正的意义。

但是,有一个database[i],这可能是您想要的。

其次,database[i]不是指针,因此没有理由分配new.你已经在上面用Student *database = new Student[50];行做到了这一点,所以即使是像database[i] = new Student(current);这样的事情也是没有意义的。相反,请尝试以下操作:

database[i] = Student(current);

这会将Student的新实例分配给database[i]。这里不需要new

最后,请注意,这会将Student的新实例分配给database[i],这意味着它将调用构造函数。如果你没有接受std::string的构造函数,则不会编译。它也不会打电话给Populate()

如果要调用Student::Populate(),为此,您需要在对象的实例上调用它。喜欢这个:

database[i].Populate(current);

我希望这就是你要问的。


附言我还应该提到,作为一般规则,您不应该使用new.标准模板库要好得多。

当然,大多数学校作业都不允许这样做,所以有时你必须使用new。但我想我仍然应该提到它。

让我们一点一点地思考这个问题

int main()
{   
std::stringstream stream;

stream这里没有使用。现在让我们摆脱它。不过,它稍后会再次回来。

std::string current;
Student temp;
Student *database = new Student[50];

这将产生 50Student秒。

inFile.open("students.dat", std::ifstream::in);
outFile.open("FullReport.txt",std::ofstream::out);

打开文件。可以做得更好一点,但对。

while(getline(inFile,current))
{   

完善。从文件中获取了一行。

for(int i = 0; i < 50; i++)

使用文件中的这一行,执行相同的操作 50 次。问问你的橡皮鸭是否认为这有意义。

{   
Student[i] = new Student(current);

Student是一个类型,而不是一个变量。不能存储在类型中。你打算使用database的可能性,但它是一个Student数组,new Student(current)提供了指向Student的指针。

outFile << Student[i] <<std::endl;
}
inFile.close();
outFile.close();

过早关闭文件。你还没有读完所有的学生。

}
}

如何解决:

int main()
{
std::string current;
Student **database = new Student*[50];

database是一个包含 50 个指向Students 的指针的数组,准备好接受new Students。但稍后会详细介绍。

std::ifstream inFile("students.dat");
std::ofstream outFile("FullReport.txt");

如果我们在这里定义文件流并指定方向(ifstreamofstream),我们不需要再次指定它。另外,我们可以直接在构造函数中打开文件。谁需要凌乱的电话来open?最后,由于文件是局部变量,它们将在函数结束时自动销毁并关闭。无需凌乱的电话close.(有关此概念的更多信息,请参阅资源获取是什么意思是初始化 (RAII)?)您不必编写的代码没有错误。如果以某种方式发生,它们不是你的错。

int count = 0;

count是一个比我更具描述性的名字

while (std::getline(inFile, current))
{

这里没有任何变化。这真是太棒了。关于Stack Overflow有一个著名的问题,因为有多少人弄错了这个问题而出名。荣誉。你说对了。

database[count] = new Student(current);

分配新Student并将其添加到数据库中。稍后会详细介绍。

outFile << *database[count] << std::endl;

并写入输出文件。请注意取消引用指针并获取指向的值*,以便可以使用常规<<运算符(顺便说一下,您必须提供)打印它。如果没有*程序将打印出指针的内容:地址。

count++;
}
}

再一次没有所有解释,便于代码阅读

int main()
{
std::string current;
Student **database = new Student*[50];
std::ifstream inFile("students.dat");
std::ofstream outFile("FullReport.txt");
int count = 0;
while (std::getline(inFile, current))
{
database[count] = new Student(current);
outFile << *database[count] << std::endl;
count++;
}
}

好吧,以后再说。你不想要

Student **database = new Student*[50];

由于几个原因,它非常恶心。

  1. 现代计算机在直线思维方面非常出色。如果数据在一条漂亮的直线上,他们可以提前阅读并在您需要之前为您准备好数据。数据数组很棒。指向数据的指针数组会阻止计算机加快速度。它读取一个Student,然后它必须查找另一个指针才能找到下一个Student。这可能很慢。速度慢得令人难以置信。当您使用Student0 时,如果有一个Students,则计算机正在加载(或在加载Student0 时已经加载)下一组Students。
  2. 每个动态分配都有成本。程序必须要求操作系统提供内存块。操作系统必须找到一个。这可能很昂贵。最好获得一大块内存并将其分成一个Student数组。
  3. 每个动态分配都必须收起来。分配 50Student秒,您需要有可以节省 50Student秒的代码。分配一个Student数组,你收起一个Students数组

你想要更多类似的东西

int main()
{
std::string current;
Student *database = new Student[50];
std::ifstream inFile("students.dat");
std::ofstream outFile("FullReport.txt");
int count = 0;
while (std::getline(inFile, current))
{
database[count] = Student(current);
outFile << *database[count] << std::endl;
count++;
}
}

当然,你真正想要的是

int main()
{
std::string current;
std::vector<Student> database;
std::ifstream inFile("students.dat");
std::ofstream outFile("FullReport.txt");
while (std::getline(inFile, current))
{
database.emplace_back(current);
outFile << database.back() << std::endl;
count++;
}
}

但这会从教练那里得到一个不错的零回合。学校的第一条规则是给老师他们想要的东西并通过课程。第二条规则是阅读一堆其他东西来学习你没有教过的东西,这样你毕业后就不会毫无用处。