-1
#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);
}

此代码给出错误“成员函数'void Grad :: searcharray(Name * )'中的grade.c ++:grade.c ++:11:25:错误:请求' array'中的成员'name',它是指针类型'Name*'(也许您打算使用 '->' ?)”我需要帮助才能完成这项工作。我猜这很简单,就像在 Java 中扩展类一样,但不确定它在 c++ 中是如何工作的。我假设您可以将一个对象数组传递给一个类,就像在 C 中只使用一个数组一样。我的问题的根源是找到解决方案并找出此代码错误的原因。

4

2 回答 2

2

利用标准库可以大大改进您的代码。您的初始代码的问题是您正在执行array->nameCarray风格的数组(技术上是它衰减的指针)。除非您首先获得索引处的指针,否则不可能有这样的表达式:

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.

于 2013-10-28T19:54:44.093 回答
1

正如其他人指出的那样,问题在于您使用的参数声明Name *array[]array->name.

请记住,建立在 C 之上的 C++ 遵循“声明模仿使用”的规则,这意味着声明变量的方式看起来就像它的使用方式。因此,声明:

Name *array[]

您从中获得名称的方式是:

*array[i]

并且name是其中的成员,Name因此您必须先获取一个Name对象。然后,您可以附加成员访问权限:

(*array[i]).name

然后您可以使用 -> 快捷方式,其中(*x).y与以下内容相同x.y

array[i]->name

其他问题:

您的代码似乎受到 1989 或 1990 版本 C 所需的代码风格的严重影响。您应该尽量避免这种情况,因为它使编写 C++ 代码比必须的要糟糕得多。

您声明 aGrade *并立即分配它。您可以将声明与初始化组合成:

Grade *test = new Grade();

但是您无论如何都不需要使用指针:使用Grade test;(如果您确实需要指针,那么您应该使用智能指针。永远不要使用 'naked' new。)

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::getlineand开始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);
}
于 2013-10-28T20:40:01.457 回答