将对象数组传递给类 #包括“average.c++” #包括“name.c++” 班级等级{ 公众: 等级(){} 无效搜索数组(名称*数组[]){ int i; 对于(i=0;i名称); } } }; int main(){ int i; 字符行[64]; 姓名*姓名[10]; 对于(i=0;i搜索数组(名称); }
这段代码给出了错误 “成员函数”中的“.C++”:SalcRay.(名称*): grade.c++:11:25:错误:请求“array”中的成员“name”,该成员是指针类型“name*”(可能您想使用“->”?) 我需要帮助来完成这项工作。我猜这是一个简单的扩展类,就像你在java中,但不知道这是如何工作C++。 我假设您可以将一个对象数组传递给一个类,就像您在C中只使用一个数组一样。将对象数组传递给类 #包括“average.c++” #包括“name.c++” 班级等级{ 公众: 等级(){} 无效搜索数组(名称*数组[]){ int i; 对于(i=0;i名称); } } }; int main(){ int i; 字符行[64]; 姓名*姓名[10]; 对于(i=0;i搜索数组(名称); },c++,class,C++,Class,这段代码给出了错误 “成员函数”中的“.C++”:SalcRay.(名称*): grade.c++:11:25:错误:请求“array”中的成员“name”,该成员是指针类型“name*”(可能您想使用“->”?) 我需要帮助来完成这项工作。我猜这是一个简单的扩展类,就像你在java中,但不知道这是如何工作C++。 我假设您可以将一个对象数组传递给一个类,就像您在C中只使用一个数组一样。 我的问题的根本在于找到一个解决方案,并找出此代码出错的原因。利用标准库可以大大改进代码。初始代码的问题是,您
我的问题的根本在于找到一个解决方案,并找出此代码出错的原因。利用标准库可以大大改进代码。初始代码的问题是,您正在执行
array->name
,其中array
是一个C样式的数组(从技术上讲是它衰减到的指针)。除非首先在索引处获取指针,否则不可能使用这样的表达式:
#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);
}
此外,写入该行的for循环遍历数组1的次数过多。正如其他人指出的那样,条件语句
i的问题在于,您使用的参数声明为Name*array[]
类似于array->Name
<>记住C++是在C的顶部建立的,它遵循规则“声明模仿用法”,这意味着声明变量的方式看起来像它使用的方式。因此,宣言:
#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);
}
从中获得名称的方法是:
Name *array[]
而name
是name
的成员,因此必须首先获取name
对象。然后,您可以添加成员访问权限:
*array[i]
然后您可以使用->快捷方式,其中(*x).y
与x.y
相同:
(*array[i]).name
其他问题:
<> C.代码的1989或1990版本所需的代码风格受到很大影响,您应该尽量避免,因为它使得编写C++代码比它要糟糕得多。
您可以声明一个等级*
,并立即分配它。您可以将声明与初始化组合为:
array[i]->name
但是你不需要使用指针:使用等级测试代码>(如果您确实需要指针,则应使用智能指针。切勿使用“裸”新的)
同样,在创建名称时,您可以避免new
Grade *test = new Grade();
这里应该避免使用固定大小的数组。相反,您应该默认使用std::vector
:
Name names[10]; // assuming that Name is default constructible
for(...) {
...
name[i] = Name(line);
}
读取输入时,应避免使用scanf
和固定大小的缓冲区。相反,如果您正在阅读行,您可能应该从std::getline
和std::string
开始
for (int i=0; i<10; ++i)
您忘记为数组编制索引:array[i]->name
array
类型为name**
,而array->name
相当于(*array)。name
。请使用std::array
而不是普通的C样式数组。如果不能使用C++11标准功能,请至少使用std::vector
!
std::vector<Name> names;
for (...) {
...
names.push_back(Name(line)); // or in C++11 names.emplace_back(line);
}
for (int i=0; i<10; ++i)
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);
}