C ++中的静态函数

时间:2013-12-03 22:24:19

标签: c++ function static

我在这里读了几篇关于静态函数的帖子,但是在实现时仍然遇到了麻烦。

我正在编写一个用于寻找最短路径的Dijkstra算法的硬编码示例。

在Alg.h中声明:

static void dijkstra();

在Alg.cpp中定义:

static void Alg::dijkstra() { 

//Create Map
Initialize();

//Loop to pass through grid multiple times
for(int i=0; i<5; i++)
{   
    current=1;  
    while(current!=6)
    {
        //Iterate through and update distances/predecessors
        //For loop to go through columns, while current iterates rows
        for(int j=1; j<7; j++)
        {
            //Check if distance from current to this node is less than
            //distance already stored in d[j] + weight of edge

            if(distanceArray[current][j]+d[current]<d[j])
            {
                //Update distance
                d[j] = distanceArray[current][j]+d[current];
                //Update predecessor
                p[j] = current;
            }    
        }
        //Go to next row in distanceArray[][]
        current++;
    } //End while


} //End for

output();
} //End Dijkstras

我想从没有对象的主调用我的函数。当我在Main.cpp中拥有所有这些代码时,它工作得很好。将其拆分为单独的文件会导致错误Main.cpp:15: error: ‘dijkstra’ was not declared in this scope。我在搜索SE时遇到的帖子给了我一个印象,即要做到这一点,我需要将该方法设为静态,但我仍然没有运气。

我做错了什么?

Main.cpp的:

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

int main() { 

    dijkstra();
    return 0; 
}

编辑:添加了完整的头文件,Alg.h:

#ifndef Alg_
#define Alg_

#include <iostream>
#include <stack>

using namespace std;

class Alg
{
    public:
        void tracePath(int x);
        void output();
        void printArray();
        void Initialize();
        static void dijkstra();
        int current, mindex;
        int distanceArray[7][7]; //2D array to hold the distances from each point to all others
        int d[6]; //Single distance array from source to points
        int p[6]; //Array to keep predecessors 
        int copyD[6]; //Copy of d[] used for sorting purposes in tracePath()
        int order[6]; //Contains the order of the nodes path lengths in ascending order

}; //End alg class

#endif

原创一体化工作Main.cpp文件:http://pastebin.com/67u9hGsL

8 个答案:

答案 0 :(得分:23)

你应该这样称呼它:

Alg::dijkstra();

<强>限制

  • 无法调用任何其他非静态的类函数。
  • 无法访问非静态类数据成员。
  • 当构造函数为private / protected时,可以通过new class()实例化对象。例如。工厂职能。

答案 1 :(得分:8)

您可以使用命名空间,而不是拥有包含所有静态成员的类。

Alg.h:

namespace Alg
{
   void dijkstra();
}

和Alg.cpp

namespace Alg
{
   void dijkstra()
   {
     // ... your code
   }
}

在main.cpp

#include "Alg.h"

int argc, char **argv)
{
  Alg::dijkstra();

  return 1;
}

答案 2 :(得分:6)

你确定该功能应该是静态的吗?

看起来你只想要一个功能? 在头文件中:

#ifndef DIJKSTRA_H
#define DIJKSTRA_H
void dijkstra(); 
#endif

在你的cpp文件中

void dijkstra() {
   /* do something */
}

在主文件中:

#include "yourcppfile.h"

int main(int argc, char **argv) {
    dijkstra();
}

如果你真的想要一个静态函数,你必须把它放到一个嵌套类中:

class Alg {
  public:
    static void dijkstra();
  /* some other class related stuff */
}

cpp文件中某处的实现

void Alg::dijkstra() {
  /* your code here */
}

然后在主要驻留的cpp文件中

#include "your header file.h"

int main(int argc, char **argv) {
  Alg::dijkstra();
}

答案 3 :(得分:1)

如果我没记错,任何'静态'功能仅限于实现它的模块。因此,'static'阻止在另一个模块中使用该函数。

答案 4 :(得分:0)

你正在混淆本地函数的'static'关键字,在类中使用'static'关键字使函数成为类函数而不是对象函数。

删除static Alg.cpp的第一行和头文件。这将允许Alg.o包含main可以引用的全局符号,链接器可以链接。

您仍然需要按照@egur所述的方式致电Alg::dijkstra()

在此之后您可能仍会收到错误。你使用Alg ::的方式更像是namespace而不是'class'定义。

答案 5 :(得分:0)

在标头文件Alg.h中:

#ifndef __ALG_H__
#define __ALG_H__

namespace Alg {

    void dijkstra();

}

#endif

如果您计划在多个cpp文件中包含标头,则必须使用包含保护。看来你想把这个函数放在命名空间Alg中,对吧?

在Alg.cpp中:

#include "Alg.h"

void Alg::dijkstra() { /* your implementation here */ }

然后,在main.cpp中,您可以使用完整的命名空间限定来调用它:

#include "Alg.h"

int main() {

    Alg::dijkstra();

}

如果您只想将代码分发给多个文件,我不明白为什么要将该函数声明为static

答案 6 :(得分:0)

现在我们已经完成了您的类Arg的完整声明,感觉单例设计模式可能很有用:

http://en.wikipedia.org/wiki/Singleton_pattern

答案 7 :(得分:0)

此处的关键是‘dijkstra’ was not declared in this scope错误。

获取您的多合一源文件并删除main功能。用它来创建一个新的源文件:

void dijkstra();
void output();

int main(int argc, char *argv[]) {
    dijkstra();
    output();
    return 0;
}

没有main以及上面这个文件的多合一cpp应该一起编译,并为您提供与之前相同的结果,就像我一样。如果忘记从算法文件中删除main,则会出现duplicate symbol _main错误。

不需要static


我在这里的回答未能涉及头文件的良好实践,也就是说,您希望在.h文件中包含这些函数声明。它解决了编译时错误。

您可能希望找到一本好书来帮助您完成C ++的一些机制,其中程序上下文(在语言意义上)可以改变关键字的含义。这可能是令人困惑的,并且它证明了对于具有与C ++一样丰富多彩的历史的语言。请查看here以获取图书建议。