读书人

c++primer.plus第五版14.2节 use_stui

发布时间: 2012-05-04 12:36:09 作者: rapoo

c++primer.plus第五版14.2节 use_stui.cpp编译出错
[code=C/C++][/code]//studenti.h--defining a Student class using private inheritance
#ifndef STUDENTI_H_
#define STUDENTI_H_

#include<iostream>
#include<string>
#include<valarray>

class Student:private std::string,private std::valarray<double>
{
private:
typedef std::valarray<double> ArrayDb;
//std::string name; //contained object
//ArrayDb scores; //contained object
//private method for scores output
std::ostream&arr_out(std::ostream&os)const;
public:
Student():std::string("Null Student"),ArrayDb(){}
Student(const std::string&s)
:std::string(s),ArrayDb(){}
Student(int n):std::string("Nully"),ArrayDb(n){}
Student(const std::string&s,int n):std::string(s),ArrayDb(n){}
Student(const std::string&s,const ArrayDb&a)
:std::string(s),ArrayDb(a){}
Student(const char*str,const double*pd,int n)
:std::string(str),ArrayDb(pd,n){}
~Student(){}
double Average()const;
const std::string&Name()const;
double&operator[](int i);
double operator[](int i)const;
//friends
//input
friend std::istream&operator>>(std::istream&is,
Student&stu); //1 word
friend std::istream&getline(std::istream&is,
Student&stu); //1 line
//0utput
friend std::ostream&operator<<(std::ostream&os,
const Student&stu);
};
#endif
[code=C/C++][/code]
//studenti.cpp--Student class using private inheritance
#include"studenti.h"

using std::ostream;
using std::endl;
using std::istream;
using std::string;

//public methods
double Student::Average()const
{
if(ArrayDb::size()>0)
return ArrayDb::sum()/ArrayDb::size();
else
return 0;
}
const string&Student::Name()const
{
return (const string&)*this;
}

double&Student::operator[](int i)
{
return ArrayDb::operator[](i);//use ArrayDb::operator[]()
}
double Student::operator[](int i)const
{
return ArrayDb::operator[](i);
}

//private method
ostream&Student::arr_out(ostream&os)const
{
int i;
int lim=ArrayDb::size();
if(lim>0)
{
for(i=0;i<lim;i++)
{
os<<ArrayDb::operator[](i)<<" ";
if(i%5==4)
os<<endl;
}
if(i%5!=0)
os<<endl;
}
else
os<<" empty array";
return os;
}

//friends
//use string version of operator>>()
istream&operator>>(istream&is,Student&stu)
{
is>>(string&)stu;
return is;
}
//use string friend getline(ostream&,const string &)
istream&getline(istream&is,Student&stu)
{
getline(is,(string&)stu);
return is;
}
//use string version of operator<<()
ostream&operator<<(ostream&os,const Student&stu)
{
os<<"Scores for "<<(const string&)stu<<":\n";
stu.arr_out(os);//use private method for scores
return os;
}
[code=C/C++][/code]//use_stui.cpp--using a private inheritance
//comlie with studenti.cpp
#include<iostream>
#include"studenti.h"

using std::cin;
using std::cout;
using std::endl;

void set(Student&sa,int n);
const int pupils=3;
const int quizzes=5;

int main()
{
Student ada[pupils]={Student(quizzes),Student(quizzes),Student(quizzes)};
int i;
for(i=0;i<pupils;i++)
set(ada[i],quizzes);
cout<<"\nStudent List: \n";
for(i=0;i<pupils;++i)
cout<<ada[i].Name()<<endl;


cout<<"\nResults:";
for(i=0;i<pupils;i++)
{
cout<<endl<<ada[i];
cout<<"average:"<<ada[i].Average()<<endl;
}
cout<<"Done.\n";
return 0;
}
void set(Student &sa,int n)
{
cout<<"Please enter the student's name:";
getline(cin,sa);
cout<<"Please enter "<<n<<" quiz scores:\n";
for(int i=0;i<n;i++)
cin>>sa[i];
while(cin.get()!='\n')
continue;
}

[解决办法]
一个是windows应用程序,一个是控制台程序,两者的入口函数名称都不一样。
[解决办法]
你用2010创建一个windows的应用程序你就知道 入口函数的名称不一样了。

读书人网 >C++

热点推荐