2013-10-13 45 views
-2

任何一个知道如何解决这个错误?我不太确定它出错的地方。错误C++不能调用没有对象的成员函数

MissionPlan.cpp: In function ‘int computeCivIndex(PointTwoD*, int)’: 
MissionPlan.cpp:132: error: cannot call member function ‘float LocationData::computeCivIndex(std::string, int, int, float, float)’ without object 

的源代码:

int computeCivIndex(PointTwoD list[], int entry) 
{ 
    int record = 0; 

    for (int z = 0; z < entry; z ++) 
    { 
    LocationData d=list[z].getLocationData(); 
    float civIndex = LocationData::computeCivIndex(d.getSunType(), d.getNoOfEarthLikePlanets(), d.getNoOfEarthLikeMoons(), d.getAveParticulateDensity(), d.getAvePlasmaDensity()); 
    if(civIndex != list[z].getCivIndex()) 
    { 
     record++; 
    } 
    list[z].setCivIndex(civIndex); 
    } 
    return record; 
} 
+2

使'LocationData :: computeCivIndex'静态(如果可以的话),或者如果它不能通过对象调用它。 – StoryTeller

+0

使你的mehtod静态 – MRB

+0

如错误所述,你需要一个对象实例。你的意图是什么?你打算做什么? –

回答

1

LocationData::computeCivIndex是一个非静态成员函数,你需要调用它在一个LocationData实例:

float civIndex = d.computeCivIndex(....); 
//    ^^ not LocationData:: 
-1

你的方法未声明作为静态的,所以你不能在没有实例化LocationData对象的情况下调用它。

但是,是的,你可以执行一个hack来调用computeCivIndex()而不需要实例化LocationData对象。它只有在computeCivIndex()不访问/修改任何LocationData的内部数据时才起作用,否则会导致内存管理失败。所以,试试这个:

((LocationData*)1)->computeCivIndex(/* arguments here */); 

请注意,这种方式无非是黑客多,使用这种不安全。

+0

-1。这种黑客不应该工作,除非'int'可以转换为'LocationData',在这种情况下它将是安全的,并且数据将在临时对象中被修改。在C++中也没有'内存管理失败',但UB可能导致无声错误。无论如何,人们不应该推荐黑客来解决这些问题,特别是有*正确的方法(请参阅@juanchopanza答案)。 –

+0

@MaciejPiechotka对吧。我说过应该改变什么以防止出现错误。我不应该推荐?所以我没有。我只是说,调用一个没有实例化对象的方法是可能的**原则上**。最后,是的,'int'不可转换为'LocationData',但可转换为'Locationdata *'或任何其他指针类型。 – Netherwire

+0

问题是即使方法不触及内存也是不安全的 - 这是UB。编译器可以自由地假定UB从不发生,并且可能会导致优化期间的各种意外行为,例如它可能假设这是一个死代码并将其消除(更可能用'0',然后'1'但参数站立)。在你声明'哦 - 编译器必须清楚代码的含义'请注意[gcc 4.8打破了SPEC 2006](http://blog.regehr.org/archives/918) - 对于人类代码是清楚的但编译器有很好的理由来执行“优化”。 –

相关问题