很抱歉,我是C ++的新手,我有这个愚蠢的问题要问。如何从LocationData computeCivIndex函数检索civIndex的值到PointTwoD类。 GET功能在这种情况下有帮助吗?
LocationData.h
class LocationData
{
private:
string sunType;
int noOfEarthLikePlanets, noOfEarthLikeMoons;
float aveParticulateDensity, avePlasmaDensity;
static float civIndex;
public:
LocationData(); //default constructor
LocationData(string, int, int, float, float); // no default constructor
void setLocationData(string, int, int, float, float);
void displaydata();
static float computeCivIndex(string st, int earth, int moons, float particle, float plasma);
};
locationdataimp.cpp
float LocationData::civIndex = 0;
//convert sunType to sunTypePercentage
float LocationData::computeCivIndex(string st, int earth, int moons, float particle, float plasma)
{
float sunTypePercent;
if(st == "Type 0")
{
sunTypePercent = 80.0;
}
else if(st == "Type B")
{
sunTypePercent = 45.0;
}
else if(st == "Type A")
{
sunTypePercent = 60.0;
}
else if(st == "Type F")
{
sunTypePercent = 75.0;
}
else if(st == "Type G")
{
sunTypePercent = 90.0;
}
else if(st == "Type K")
{
sunTypePercent = 80.0;
}
else if(st == "Type M")
{
sunTypePercent = 70.0;
}
// calculate CIV Value
float civNum,civNum1,civNum2,civNum3,civNum4,civNum5;
civNum1 = sunTypePercent / 100;
civNum2 = plasma + particle;
civNum3 = civNum2 / 200;
civNum4 = civNum1 - civNum3;
civNum5 = earth + moons;
civNum = civNum4 * civNum5;
civIndex = civNum;
//return civNum;
}
pointtwod.h文件
class PointTwoD
{
private:
int xcord,ycord;
float civIndex;
LocationData locationdata;
public:
PointTwoD();
PointTwoD(int, int, string, int, int, float, float, float);
string toString();
void displayPointdata();
};
pointtwod.cpp
void PointTwoD::displayPointdata()
{
PointTwoD pointtwod;
LocationData locationdata;
cout << "X axis: " << xcord << endl;
cout << "Y axis: " << ycord << endl;
cout << "civ: " << locationdata.civIndex << endl;
//locationdata.displaydata();
}
那么我应该包括什么或者我犯了什么错误?
答案 0 :(得分:2)
static float LocationData::civIndex;
声明表示civIndex
中static
为private
而LocationData
为private
(*)。
(*)作为默认访问修饰符
LocationData
访问意味着如果该类未明确允许,则无法通过public static float LocationData::getCivIndex()
{
return civIndex;
}
类型的变量直接访问它。您有两种选择:
1)提供公共getter功能:
class LocationData
{
// ...
public static float getCivIndex();
};
注意:您还需要在类定义中声明此函数:
civIndex
2)在LocationData
公开访问civIndex
。
不建议使用第二个选项,因为这将允许任何代码直接访问和修改private
的值,这很容易导致错误(并且在大型项目中很难跟踪这些类型的错误)。即使你需要一个只设置传入值的setter函数,建议声明变量LocationData locationData;
locationdata.getCivIndex();
,因为这会迫使其他代码通过公共方法,从而更容易识别访问的是什么代码调试期间发生错误时的变量。
您可以像这样使用选项1):
LocationData
或者甚至没有LocationData::getCivIndex();
类型的变量,因为该类中的变量是静态的:
{{1}}
答案 1 :(得分:1)
computeCivIndex
是一个静态成员,所以正确的语法是:
cout << "civ: " << LocationData::civindex << endl;
但是,您的civindex变量是私有的,因此您必须创建一个getter:
static float getCivIndex()
{
return civIndex;
}
cout << "civ: " << LocationData::getCivIndex() << endl;
答案 2 :(得分:0)
您不能像您一样直接访问locationdata.civIndex
。为什么?因为您将civIndex
设置为private
类的LocationData
成员。
根据您的需求,有一些解决方案:
让civIndex
成为public
LocationData
成员
或
创建一个getter方法来提供civIndex
,例如
static float getCivIndex( )
{
return civIndex;
}
请参阅: