0

在我的标题中说明,试图在我的代码中使用静态方法编译我的文件。我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
}
4

2 回答 2

3

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

只需在函数实现之前删除静态。此外,静态函数是类函数,您不能访问其中的类的非静态成员。这些意味着在没有对象实例的情况下使用,因此没有实例变量。

float LocationData::computeCivIndex(string sunType, int noOfEarthLikePlanets,int     noOfEarthLikemoons, float aveParticulateDensity, float avePlasmaDensity)
{
}
于 2012-10-16T12:46:52.673 回答
2

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

错误:“this”对于静态成员函数不可用

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

来自MSDN 文档static

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

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

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

于 2012-10-16T12:47:22.437 回答