头文件:为什么以下函数可以在不声明为朋友或成员函数的情况下访问类成员?
// pe10-8arr.h -- header file for a simple list class
#ifndef SIMPLEST_
#define SIMPLEST_
// program-specific declarations
const int TSIZE = 45; // size of array to hold title
struct film
{
char title[TSIZE];
int rating;
};
// general type definitions
typedef struct film Item;
const int MAXLIST = 10;
class simplist
{
private:
Item items[MAXLIST];
int count;
public:
simplist(void);
bool isempty(void);
bool isfull(void);
int itemcount();
bool additem(Item item);
void transverse(void (*pfun)(Item &item));
};
#endif
代码使用报头:
#include "pe10-8arr.h"
simplist::simplist(void)
{
count = 0;
}
bool simplist::isempty(void)
{
return count == 0;
}
bool simplist::isfull(void)
{
return count == MAXLIST;
}
int simplist::itemcount()
{
return count;
}
bool simplist::additem(Item item)
{
if (count == MAXLIST)
return false;
else
items[count++] = item;
return true;
}
void simplist::transverse(void (*pfun)(Item &item))
{
for (int i = 0; i < count; i++)
(*pfun)(items[i]);
}
#include <iostream>
#include <cstdlib> // prototype for exit()
#include "pe10-8arr.h" // simple list class declaration
// array version
void showmovies(Item &item); // to be used by transverse()
int main(void)
{
using namespace std;
simplist movies; // creates an empty list
Item temp;
if (movies.isfull()) // invokes isfull() member function
{
cout << "No more room in list! Bye!\n";
exit(1);
}
cout << "Enter first movie title:\n";
while (cin.getline(temp.title,TSIZE) && temp.title[0] != '\0')
{
cout << "Enter your rating <0-10>: ";
cin >> temp.rating;
while(cin.get() != '\n')
continue;
if (movies.additem(temp) == false)
{
cout << "List already is full!\n";
break;
}
if (movies.isfull())
{
cout << "You have filled the list.\n";
break;
}
cout << "Enter next movie title (empty line to stop):\n";
}
if (movies.isempty())
cout << "No data entered. ";
else
{
cout << "Here is the movie list:\n";
movies.transverse(showmovies);
}
cout << "Bye!\n";
return 0;
}
void showmovies(Item &item)
{
std::cout << "Movie: " << item.title << " Rating: "
<< item.rating << std::endl;
}
以上只是编译和成功运行的代码。谁能告诉我为什么函数showmovies()
可以使用引用访问simplist
的项目成员,而不被声明为好友函数或成员函数?
我不太清楚你在问什么; 'showmovies'使用你直接传递给它的'item'参数;它不会触及'simplist' – 2012-04-02 15:18:39
showmovies不会调用成员函数,它只会从Item结构中获取字段。 – 2012-04-02 15:20:07
在结构中默认情况下,所有内容都是公共的。 – BoBTFish 2012-04-02 15:20:15