我在这里读了几篇关于静态函数的帖子,但是在实现时仍然遇到了麻烦。
我正在编写一个用于寻找最短路径的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
答案 0 :(得分:23)
你应该这样称呼它:
Alg::dijkstra();
<强>限制强>
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
的完整声明,感觉单例设计模式可能很有用:
答案 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以获取图书建议。