#include "average.c++"
#include "name.c++"
class Grade {
public:
Grade() {}
void searcharray(Name *array[]) {
int i;
for(i = 0; i <= 10; i++){
printf("%s", array->name);
}
}
};
int main() {
int i;
char line[64];
Name *names[10];
for(i = 0; i < 5; i++){
scanf("%s", &line);
names[i] = new Name(line);
}
Grade *test;
test = new Grade();
test->searcharray(names);
}
此代码给出错误 “成员函数中的grade.c ++'void Grad :: searcharray(Name * )': grade.c ++:11:25:错误:请求'数组'中的成员'name',它是指针类型'Name *'(也许你打算使用' - &gt;'?)“ 我需要帮助才能完成这项工作。我猜这是像在Java中扩展类一样简单,但不确定它在c ++中是如何工作的。 我假设您可以将一个对象数组传递给类,就像在C中只使用数组一样。 我的问题的根源是找到一个解决方案,并找出这个代码错误的原因。
答案 0 :(得分:2)
利用标准库可以大大改善您的代码。您的初始代码的问题在于您正在执行array->name
,其中array
是一个C风格的数组(技术上是它衰变的指针)。除非首先在索引处获得指针,否则不可能使用这样的表达式:
array[i]->name;
此外,写入该行的for循环遍历数组1太多次。条件语句i <= 10
应为i < 10
,因此您不会取消引用超出数组末尾的地址。
无论如何,我认为如果你使用向量,内存管理和std::string
,我可能会告诉你它应该是什么样子,而不是用你的代码显示你的代码。我希望这会有所帮助:
#include <iostream>
#include <string>
#include <vector>
#include <memory>
class Grade
{
public:
Grade() { }
static void searcharray(const std::vector<std::unique_ptr<Name>>& array)
{
for (const auto& obj : array)
{
std::cout << obj->name;
}
}
};
int main()
{
std::string name;
std::vector<std::unique_ptr<Name>> names;
while (std::cin >> name)
names.push_back(std::unique_ptr<Name>(new Name(name)));
// names.push_back(std::make_unique<Name>(name))
Grade::searcharray(names);
}
请注意,我还提出了searcharray
static
,因为它与Grade
的给定实例无关。
答案 1 :(得分:1)
正如其他人指出的那样,问题在于您使用的参数Name *array[]
已声明为array->name
。
请记住,C ++建立在C之上,遵循规则'声明模仿使用',这意味着声明变量的方式与使用它的方式相似。所以声明:
Name *array[]
你从中得到一个名字的方式是:
*array[i]
name
是Name
的成员,因此您必须先获得Name
个对象。然后你可以查看会员访问权限:
(*array[i]).name
然后你可以使用 - &gt; (*x).y
与x.y
相同的快捷方式:
array[i]->name
其他问题:
您的代码似乎受到1989或1990版本C所需的代码样式的严重影响。您应该尽量避免这样做,因为这会使编写C ++代码的情况比以前更糟糕。
您声明Grade *
并立即分配。您可以将声明与初始化结合到:
Grade *test = new Grade();
但是你无论如何都不需要使用指针:使用Grade test;
(如果你确实需要指针,那么你应该使用智能指针。永远不要使用'裸'new
。)< / p>
同样,您可以在创建名称时避免new
。
Name names[10]; // assuming that Name is default constructible
for(...) {
...
name[i] = Name(line);
}
这里应该避免使用固定大小的数组。相反,您应默认使用std::vector
:
std::vector<Name> names;
for (...) {
...
names.push_back(Name(line)); // or in C++11 names.emplace_back(line);
}
你应该将变量i
声明为for循环的一部分,而不是声明之外的变量:
for (int i=0; i<10; ++i)
当您阅读输入时,应避免使用scanf
和固定大小的缓冲区。相反,如果你正在读行,你应该从std::getline
和std::string
开始。
std::string line;
while (std::getline(std::cin, line)) { // read as many lines as there are, not just 10 no matter what
names.emplace_back(line);
}