无法从朋友类访问私人和公共成员

时间:2013-10-05 01:05:05

标签: c++ class inheritance most-vexing-parse

我有一个名为locationdata的类,它有一个名为PointTwoD的朋友类

#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作为私有成员。

#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中的函数时,我收到一个错误:在“test”中请求成员'location'是非类型的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测试后,我收到以下错误:' - &gt;'的基本操作数有非指针类型,它是什么意思以及如何解决它

1 个答案:

答案 0 :(得分:2)

这里:

PointTwoD test();

是函数声明,而不是变量定义。

你需要:

PointTwoD test;

或在C ++ 11中:

PointTwoD test{};

有关详细信息,请参阅http://en.wikipedia.org/wiki/Most_vexing_parse