【问题标题】:Static function call not working (C++)静态函数调用不起作用(C++)
【发布时间】:2013-11-04 00:34:32
【问题描述】:

由于某种原因,以下代码在 DevC++ 中出现编译器错误:[Error] cannot declare member function 'static double* Sort::bubbleSort(double*, int)' to have static links [-fpermissive]

BubbleSort.cpp:

#include <iostream>
#include "Sort.h"

int main(int argc, char** argv) {

    double list[] = {4.0, 4.5, 3.2, 10.3, 2.1, 1.6, 8.3, 3.4, 2.1, 20.1};
    int size = 10;
    double* sortedList = Sort::bubbleSort(list, size);

    return 0;
}

排序.h:

class Sort
{
    public: 
        static double* bubbleSort (double list[], int size);    
}
;

排序.cpp:

#include "Sort.h"
#include <algorithm> // std::swap

static double* Sort::bubbleSort (double list[], int size)
{
    bool changed = true;

    do
    {
        changed = false;
        for (int j = 0;  j < size - 1; j++)
        {
            if (list[j] > list[j +1])
            {
                std::swap(list[j], list[j + 1]);
                changed = true;
            }
        }
    } 
    while (changed);

    return list; // return pointer to list array    
}

本质上,我试图在不创建 Sort 对象的情况下调用 bubbleSort 函数。如果我先创建一个对象,代码就可以正常工作。

什么可能导致错误?

感谢您的任何建议。

【问题讨论】:

  • 删除原型实现中的静态
  • 但是我不需要将函数声明为 static 以便在不创建类对象的情况下使用它吗?
  • static 修饰符在 Sort.h 中,但不在 Sort.cpp 中。
  • 你为什么要让他成为班级成员? C++ 不是 C# 也不是 Java ...您可以创建独立的函数。
  • @navig8tr 看到这里同样的问题:http://stackoverflow.com/questions/5980520/static-methods-in-c

标签: c++ bubble-sort


【解决方案1】:

static 修饰符在 Sort.h 中,但不在 Sort.cpp 中。

那是因为它在两种情况下意味着两种不同的东西。

当在类声明中使用时,static 表示它引用的方法是类方法(应该在没有对象引用的情况下使用),而不是实例方法(需要对象引用才能调用) .

当在实现文件内部(即在类声明之外)使用时,它表明它所引用的方法应该具有静态链接,这意味着它不应该从包含它的目标文件外部可见。从面向对象的角度来看,这些函数对于包含它们的文件是私有的。很明显,如果其他文件(正在使用您的类)应该访问该方法,这将无法正常工作。

【讨论】:

  • 很好的解释。谢谢。
  • 这是来自 C 的古怪保留。
  • @Giulio Franco:这是否意味着您可以将 static 关键字添加到私有成员函数而不会导致错误?
  • 我不确定,但我认为不会。该方法仍然需要从外部可见,以便被链接器链接。没有什么可以强迫您将所有方法放在同一个文件中,因此私有方法也应该是公开可见的。无论如何,您可以通过使用静态函数(函数,而不是方法)而不是私有方法来防止方法被看到。
  • 当然静态函数不能访问类的私有成员。不过,这是个问题。
【解决方案2】:

删除 .cpp 文件中的 static 关键字。此外,您不需要返回指针list,因为只有数组的内容会发生变化,而不是数组本身。您可以继续使用放入函数的指针。 sortedList 将指向与 main 函数末尾的 list 相同的内存位置。

【讨论】:

    【解决方案3】:

    如果您的 Sort 类中的所有内容都是这个静态成员,那么绝对不需要类。

    double* bubbleSort (double list[], int size)
    {
        bool changed = true;
    
        do
        {
            changed = false;
            for (int j = 0;  j < size - 1; j++)
            {
                if (list[j] > list[j +1])
                {
                    std::swap(list[j], list[j + 1]);
                    changed = true;
                }
            }
        } 
        while (changed);
    
        return list; // return pointer to list array    
    }
    

    此外,不需要返回指向列表的指针,因为您在对列表进行排序时正在修改列表(double list[]double* list 相同,并且由于您正在更改例程中的值,所以指向第一个元素的指针仍然相同,但数组中的值将被交换)。

    void bubbleSort (double list[], int size)
    {
        bool changed = true;
    
        do
        {
            changed = false;
            for (int j = 0;  j < size - 1; j++)
            {
                if (list[j] > list[j +1])
                {
                    std::swap(list[j], list[j + 1]);
                    changed = true;
                }
            }
        } 
        while (changed);
    }
    

    【讨论】:

    • 感谢您的建议。还有其他成员,但并不多。我当然可以在不使用课程的情况下逃脱,但我认为这是一种很好的做法。
    • 在 C++ 中,如果它不必在类中(例如,它不使用任何类成员),则没有理由将它放在类中。对于来自 Java 和 C# 等语言的人来说,这是一个很难改掉的习惯。
    【解决方案4】:

    你应该让函数独立,如果你需要一个类方法,让它用正确的参数调用独立函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2013-05-28
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多