从另一个函数和类c ++获取值

时间:2013-10-22 18:04:27

标签: c++

很抱歉,我是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();
}

那么我应该包括什么或者我犯了什么错误?

3 个答案:

答案 0 :(得分:2)

static float LocationData::civIndex;声明表示civIndexstaticprivateLocationDataprivate(*)。

(*)作为默认访问修饰符

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;
  }

请参阅:

C++ Public

C++ Protected

C++ Private