将对象数组传递给类

时间:2013-10-28 19:45:54

标签: c++ class

#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中只使用数组一样。 我的问题的根源是找到一个解决方案,并找出这个代码错误的原因。

2 个答案:

答案 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]

nameName的成员,因此您必须先获得Name个对象。然后你可以查看会员访问权限:

(*array[i]).name

然后你可以使用 - &gt; (*x).yx.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::getlinestd::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);
}