首页 新闻 会员 周边 捐助

C++primer中关于类接口

0
悬赏园豆:5 [已解决问题] 解决于 2015-04-25 14:17

Question 1: 看到书上写着这么一句  成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以在类的外部.    内外部倒好理解,那是否成员函数必须和类所在头文件在同一个头文件下?(基于将类定义在头文件中---如果不定义在头文件中更好也希望大神们指出).

Question 2: 又有一句如果函数在概念上属于类但是不定义在类中,则它一般应与类声明(而非定义)在同一个头文件中--------这是指"接口"函数的定义和类声明放在一个头文件, 类定义和"接口"函数的声明放在一个头文件???(原谅我乱七八糟的理解)

-------------------------------------------------------------------

打以上字的时候突然想到  作者写的代码---明白了一些.

采用一个头文件和两个.c文件.但同时如果我用两个头文件:

#ifndef SALE_H_
#define SALE_H_

#include<string>
#include<iostream>

struct Sales_data
{
    std::string isbn() const {return bookNo;}
    Sales_data &combine(const Sales_data &);
    double avg_price() const;

    std::string bookNo;
    unsigned units_sold=0;
    double revenue=0.0;
};

double Sales_data::avg_price() const
{
    if(units_sold)
        return revenue/units_sold;
    else
        return 0;
}

Sales_data &Sales_data::combine(const Sales_data &rhs)
{
    units_sold+=rhs.units_sold;
    revenue+=rhs.revenue;
    return *this;
}

Sales_data add(const Sales_data &,const Sales_data &);
std::ostream &print(std::ostream &,const Sales_data &);
std::istream &read(std::istream &,Sales_data &);


#endif

头文件: sale_data.h

#ifndef SA_H_
#define SA_H_

#include "ssale.h"
#include<iostream>
using std::ostream;using std::istream;

istream &read(istream &is,Sales_data &item)
{
    double price=0;
    is>>item.bookNo>>item.units_sold>>price;
    item.revenue=price*item.units_sold;
    return is;
}

ostream &print(ostream &os,const Sales_data &item)
{
    os<<item.isbn()<<" "<<item.units_sold<<" "
        <<item.revenue<<" "<<item.avg_price();
    return os;
}

Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
    Sales_data sum=lhs;
    sum.combine(rhs);
    return sum;
}

#endif

采用这种方式到时  在test.cc文件中只需包含一个头文件sale_data.h也能完成将定义成.cc文件.  这样是不是存在什么弊端呢?  (仅仅从表面上看感觉也是单独将声明和定义分离开来)

test.cc代码

#include<iostream>
#include"sale_data.h"
using namespace std;
int main()
{
    Sales_data d1,d2;
    read(cin,d1);
    read(cin,d2);
    print(cout,d1)<<endl;
    print(cout,d2)<<endl;
}

仅为测试.

--------------------------------

讲的比较凌乱,望见谅.   更望解答,谢谢.

C++
Nooooooo的主页 Nooooooo | 初学一级 | 园豆:192
提问于:2015-04-23 19:05
< >
分享
最佳答案
0

那是否成员函数必须和类所在头文件在同一个头文件下? —— 书上一直说的是成员函数的“声明”和“定义”,到你这儿就只剩下“成员函数”了,那你到底是问的“声明”还是“定义”呢?

 

第二个问题讲的是代码书写的“建议”,而非只能这么做。只要能编译通过就 OK。至于如何放置,你代码写多了,看多了,自然就知道怎么放比较方便理解和使用。

收获园豆:5
Launcher | 高人七级 |园豆:45050 | 2015-04-24 09:24

恩.谢谢~  确实是我没讲清.   回过头去在想弄清楚了. 可能很大程度自己困惑了就乱试结果能通过,就弄得矛盾了点.  很大程度还是自我积累不够.~   谢谢指出.

Nooooooo | 园豆:192 (初学一级) | 2015-04-25 14:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册