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; }
仅为测试.
--------------------------------
讲的比较凌乱,望见谅. 更望解答,谢谢.
那是否成员函数必须和类所在头文件在同一个头文件下? —— 书上一直说的是成员函数的“声明”和“定义”,到你这儿就只剩下“成员函数”了,那你到底是问的“声明”还是“定义”呢?
第二个问题讲的是代码书写的“建议”,而非只能这么做。只要能编译通过就 OK。至于如何放置,你代码写多了,看多了,自然就知道怎么放比较方便理解和使用。
恩.谢谢~ 确实是我没讲清. 回过头去在想弄清楚了. 可能很大程度自己困惑了就乱试结果能通过,就弄得矛盾了点. 很大程度还是自我积累不够.~ 谢谢指出.