如何从另一个类调用静态方法?

时间:2013-10-10 15:46:04

标签: c++ visual-c++ c++11 c++-cli c++builder

我试图从a.h到b.cpp调用静态方法。从我研究的内容来看,它就像放置一个:: scope解决方案一样简单,但是我尝试了它并且它抛出了一个错误“C ++需要所有声明的类型说明符”。以下是我所拥有的。

a.cpp

float method() {
   //some calculations inside
}

a.h

static float method();

b.cpp

 a::method(); <- error!  "C++ requires a type specifier  for all declarations".
 but if I type without the ::
 a method(); <- doesn't throw any errors.

我很困惑,需要指导。

2 个答案:

答案 0 :(得分:3)

如果您只是

#include "b.h"
method();

你只是在“无处”的中间抛出一些指令(在某处你可以声明一个函数,定义一个函数或做一些邪恶的事情,比如定义一个全局,所有这些都需要一个类型说明符开始)

如果你用另一种方法调用你的函数,比如main,编译器就会认为你正在调用一个方法,而不是试图声明一些东西,而不是说它是什么类型。

#include "b.h"
int main()
{
    method();
}

修改

如果你在一个类中确实有一个静态methid,比如在class A标题中声明a.h,你可以这样调用它,使用范围资源运算符,如你所说,小心不要在全局范围内转储随机函数调用,但是将它们放在内部方法中。

#include "a.h"
int main()
{
    A::method();
}

如果问题也是如何声明和定义静态方法,这就是这样做的方法: 在a.h:

#ifndef A_INCLUDED
#define A_INCLUDED

class A{

public :       
      static float method(); 

}; 
#endif

然后在a.cpp

中定义它
#include "a.h"

float A::method()
{
    //... whatever is required
    return 0;
}

答案 1 :(得分:0)

很难理解你正在尝试做什么。尝试类似:

a.h

// header file, contains definition of class a
// and definition of function SomeFunction()

struct a {
    float method();
    static float othermethod();
    static float yetAnotherStaticMethod() { return 0.f; }

    float value;
}

float SomeFunction();

a.cpp

// implementation file contains actual implementation of class/struct a
// and function SomeFunction()

float a::method() {
   //some calculations inside
   // can work on 'value'
   value = 42.0f;
   return value;
}

float a::othermethod() {
    // cannot work on 'value', because it's a static method
    return 3.0f;
}

float SomeFunction() {
     // do something possibly unrelated to struct/class a
     return 4.0f;
}

b.cpp

#include "a.h"
int main()
{
     a::othermethod();  // calls a static method on the class/struct  a
     a::yetAnotherStaticMethod();  // calls the other static method

     a instanceOfA;

     instanceOfA.method();   // calls method() on instance of class/struct a (an 'object')
}