使用静态方法编译时出错

时间:2012-10-16 12:44:45

标签: c++ static-methods

说明我的标题,尝试在我的代码中使用静态方法编译我的文件。 我的computeCivIndex()试图从用户那里得到5个输入并进行计算并返回浮点值。

this.sunType用于java语法,但对于V ++,如果两者名称相同,我应该用它们将它们链接在一起?

我的代码中有getter和setter方法,还有2个构造函数太长而无法发布。

这是我的错误:

test.cpp:159: error: cannot declare member function ‘static float LocationData::computeCivIndex(std::string, int, int, float, float)’ to have static linkage
test.cpp: In static member function ‘static float LocationData::computeCivIndex(std::string, int, int, float, float)’:
test.cpp:161: error: ‘this’ is unavailable for static member functions

代码:

class LocationData
{   
    private:
    string sunType;
    int noOfEarthLikePlanets;
    int noOfEarthLikeMoons;
    float aveParticulateDensity;
    float avePlasmaDensity;
    public:
    static float computeCivIndex(string,int,int,float,float);
};
static float LocationData::computeCivIndex(string sunType, int noOfEarthLikePlanets,int     noOfEarthLikemoons, float aveParticulateDensity, float avePlasmaDensity)
{
    this.sunType = sunType;
    this.noOfEarthLikePlanets = noOfEarthLikePlanets;
    this.noOfEarthLikeMoons = noOfEarthLikeMoons;
    this.aveParticulateDensity = aveParticulateDensity;
    this.avePlasmaDensity = avePlasmaDensity;
    if(sunType == "Type O")
         //and more for computation
}

2 个答案:

答案 0 :(得分:3)

static声明推迟static实施。静态实现意味着您的函数符号仅在实现它的文件中可用。

在功能实现之前简单地删除静态。此外,静态函数是类函数,您无法访问其中的类的非静态成员。这些是在没有对象实例的情况下使用的,因此,没有实例变量。

float LocationData::computeCivIndex(string sunType, int noOfEarthLikePlanets,int     noOfEarthLikemoons, float aveParticulateDensity, float avePlasmaDensity)
{
}

答案 1 :(得分:2)

编译器错误对我来说似乎相当清楚:

  

错误:'this'不适用于静态成员函数

基本上,因为成员是static,所以它不会在特定类型实例的上下文中执行 - 因此在方法中使用this是没有意义的。你尝试使用this,因此错误。

来自MSDN documentation for static

  

在类声明中声明成员函数时,static关键字指定该函数由该类的所有实例共享。静态成员函数无法访问实例成员,因为该函数没有隐式this指针。要访问实例成员,请使用作为实例指针或引用的参数声明该函数。

听起来你只是不想将成员声明为静态。

(顺便说一句,我不喜欢描述它“由所有类的实例共享” - 我更喜欢它不是特定于类的任何特定实例的想法。没有必要创建的任何实例。)