访问包含在数组中的指向类对象的类成员函数的正确语法是啥?

Posted

技术标签:

【中文标题】访问包含在数组中的指向类对象的类成员函数的正确语法是啥?【英文标题】:What is the correct syntax for accessing a class member function for a pointer-to-class object contained within an array?访问包含在数组中的指向类对象的类成员函数的正确语法是什么? 【发布时间】:2016-11-12 15:02:20 【问题描述】:

我有以下函数,stdDev,它接受指向 Student 类对象的指针数组。学生类有一个成员函数 getScores(),它以双倍的形式返回学生的分数。

下面是代码:

double stdDev(Student array[], int SIZE) 

    double sum, std_sum, mean, std_mean = 0;
    double *std_scores = NULL;
    std_scores = new double[SIZE];

    for (int i = 0; i < SIZE; i++)     
        sum += array[i]->getScore;
    
    mean = sum / SIZE;

    for (int i = 0; i < SIZE; i++) 
        std_scores[i] = pow((array[i]->getScore - mean), 2);
        std_sum += std_scores[i];
    
    std_mean = std_sum / SIZE;

    return sqrt(std_mean);

在上述代码的第 8 行和第 13 行,我收到以下错误:

expression must have pointer type

'*': illegal operation on bound member function expression

我是 C++ 指针语法的新手。感谢您提供任何帮助。

【问题讨论】:

你没有一个“指向类对象的数组”,你有一个对象数组。 array[i].getScore() 是我的猜测,没有Student 类的定义。 【参考方案1】:

您的问题的简短答案是:

    sum += answer[i].getScore;

除非你需要调用函数(而不只是引用它),所以应该是:

    sum += answer[i].getScore();

其他问题:

您没有将 sum 初始化为零。 您泄露了 std_scores。以相反的优先顺序: 在函数结束时使用delete [] std_scores 将其删除。 将其声明为`std::vector std_scores(SIZE); 根本不要使用数组。只需使用double score2 = pow((array[i].getScore() - mean), 2);

最后一点:

C++ 不是 C89 - 你应该延迟声明你的变量,直到你可以给它们一个值。 std_scores 是一个特别明显的例子——你初始化为 NULL,然后立即分配一个新值。除了sumstd_sum(和i),您不需要任何非常量变量。 使用std::accumulate 代码会更好 有更好的算法来计算平均值和标准差,这些算法在数值上更稳定。

【讨论】:

以上是关于访问包含在数组中的指向类对象的类成员函数的正确语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 C++ 中指向该数组的指针访问另一个类中的数组?

通过“指向类成员的指针”访问作为数组的类成员

从 CUDA 中的主机访问设备上的类成员数组指针

指向具有私有构造函数的类的类成员的指针

C++中的类所占内存空间总结

c++ 中的每个对象是不是包含不同版本的类成员函数?