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:
如何简单地将这行文本传递给成员函数?这就是我要问的全部内容...有一个名为 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 个指向Student
s 的指针的数组,准备好接受new Student
s。但稍后会详细介绍。
std::ifstream inFile("students.dat");
std::ofstream outFile("FullReport.txt");
如果我们在这里定义文件流并指定方向(ifstream
,ofstream
),我们不需要再次指定它。另外,我们可以直接在构造函数中打开文件。谁需要凌乱的电话来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];
由于几个原因,它非常恶心。
- 现代计算机在直线思维方面非常出色。如果数据在一条漂亮的直线上,他们可以提前阅读并在您需要之前为您准备好数据。数据数组很棒。指向数据的指针数组会阻止计算机加快速度。它读取一个
Student
,然后它必须查找另一个指针才能找到下一个Student
。这可能很慢。速度慢得令人难以置信。当您使用Student
0 时,如果有一个Student
s,则计算机正在加载(或在加载Student
0 时已经加载)下一组Student
s。 - 每个动态分配都有成本。程序必须要求操作系统提供内存块。操作系统必须找到一个。这可能很昂贵。最好获得一大块内存并将其分成一个
Student
数组。 - 每个动态分配都必须收起来。分配 50
Student
秒,您需要有可以节省 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++;
}
}
但这会从教练那里得到一个不错的零回合。学校的第一条规则是给老师他们想要的东西并通过课程。第二条规则是阅读一堆其他东西来学习你没有教过的东西,这样你毕业后就不会毫无用处。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 有人能分解一下这个c++模板的语法吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- C++指向对象的指针堆数组中,如何将字符串传递给特定对象?有一些代码请看一下:
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 为什么在从 c++ 中的函数返回对象的情况下,我看不到正在调用的复制构造函数?
- 此代码看起来像是删除了此对象,但事实并非如此
- 乍一看,构造函数返回了一个对象
- 有人能看一下一些简单的梯度下降代码吗?
- 有人能确切地解释一下,如果在堆上分配对象数组的过程中抛出异常,会发生什么吗
- 为什么看起来好像我的对象被破坏了两次
- 当构造将std::less作为参数时,对象类型看起来很奇怪