1

PointTwoD というフレンド クラスを持つ locationdata というクラスがあります。

#include <string>
#include <iostream>

using namespace std;

class locationdata
{
  public:
  locationdata(); //default constructor
  locationdata(string,int,int,float,float); //constructor

 //setter
 void set_sunType(string);
 void set_noOfEarthLikePlanets(int);
 void set_noOfEarthLikeMoons(int);
 void set_aveParticulateDensity(float);
 void set_avePlasmaDensity(float);

 //getter 
 string get_sunType();
 int get_noOfEarthLikePlanets();
 int get_noOfEarthLikeMoons();
 float get_aveParticulateDensity();
 float get_avePlasmaDensity();


 float computeCivIndex();
 friend class PointTwoD;  //friend class

  private:

  string sunType;
  int noOfEarthLikePlanets;
  int noOfEarthLikeMoons;
  float aveParticulateDensity;
  float avePlasmaDensity;

};

クラスを含むと思われる PointTwoD という別のクラスがあります: locationdata as a private member 。

#include <iostream>
#include "locationdata.h"

using namespace std;

class PointTwoD
{
  public:
  PointTwoD();
  locationdata location; // class


  private:
  int x;
  int y;

  float civIndex;

};

main() で PointTwoD オブジェクトをインスタンス化しようとして、関数 fromn locationdata を使用すると、エラーが発生します: 非クラス型 PointTwoD()() の「テスト」でメンバー「ロケーション」を要求します。

#include <iostream>
#include "PointTwoD.h"
using namespace std;

int main()
{
     int choice;

   PointTwoD test();

    cout<<test.location->get_sunType; //this causes the error
}

私の質問は

1) フレンド クラスが機能しないのはなぜですか。一度宣言すると、フレンドからすべての関数を使用してすべてのプロパティにアクセスできるはずだと思いました

2) クラス PointTwoD からクラス locationdata のすべてのメソッドとプロパティにアクセスするには、フレンド クラスの代わりに継承を使用する必要がありますか??

最初の更新: 宣言を PointTwoD test() から PointTwoD test に変更した後、次のエラーが発生します。

4

1 に答える 1

2

これはここです:

PointTwoD test();

変数定義ではなく、関数宣言です。

必要なもの:

PointTwoD test;

または C++11 の場合:

PointTwoD test{};

詳細については、 http://en.wikipedia.org/wiki/Most_vexing_parseを参照してください。

于 2013-10-05T01:09:32.833 に答える