0

抱歉,我是 C++ 新手,我有一个愚蠢的问题要问。如何从 LocationData computeCivIndex 函数中检索 civIndex 的值到 PointTwoD 类。GET 功能在这种情况下有帮助吗?

位置数据.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);

};

位置数据imp.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();
}

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

4

3 回答 3

2

声明的static float LocationData::civIndex;意思civIndexstaticprivate(*) in LocationData

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

访问意味着如果该类没有明确允许private,您不能通过类型变量直接访问它。LocationData你有两个选择:

1)提供公共getter函数:

public static float LocationData::getCivIndex()
{
  return civIndex;
}

注意:您还需要在类定义中声明此函数:

class LocationData
{
  // ...
  public static float getCivIndex();
};

2)公开访问civIndexLocationData

不建议使用第二个选项,因为这将允许任何代码直接访问和修改 的值civIndex,这很容易导致错误(并且这些类型的错误在大型项目中很难追踪)。即使您需要一个只设置传入值的 setter 函数,也建议声明该变量private,因为这会强制其他代码通过公共方法,以便在调试期间更容易识别正在访问该变量的代码,以防万一的错误。

您可以像这样使用选项 1):

LocationData locationData;
locationdata.getCivIndex();

或者甚至没有类型变量LocationData,因为该变量在该类中是静态的:

LocationData::getCivIndex();
于 2013-10-22T18:20:04.033 回答
1

computeCivIndex是一个静态成员,所以正确的语法是:

cout << "civ: " << LocationData::civindex << endl;

但是,您的 civindex 变量是私有的,因此您必须创建一个 getter:

static float getCivIndex()
{
    return civIndex;
}

cout << "civ: " << LocationData::getCivIndex() << endl;
于 2013-10-22T18:09:05.267 回答
0

您不能locationdata.civIndex像以前那样直接访问。为什么?因为你设置civIndex为类的private成员LocationData

根据您的需要,有一些解决方案:

成为会员civIndex_publicLocationData

或者

创建一个 getter 方法来提供civIndex诸如

  static float getCivIndex( )
  {
      return civIndex;
  }

看:

C++ 公共

C++ 保护

C++ 私有

于 2013-10-22T18:14:08.207 回答