标题:关于头文件
取消只看楼主
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
结帖率:92.86%
已结贴  问题点数:20 回复次数:7 
关于头文件
1.书上说:设计头文件应使其能被多次包含在同一源文件中所以只有声明不定义 a. 那我如下写的类定义是不是错的?
#include <string>
#include <iostream>
using namespace std;
class screen{
public:
typedef string ::size_type index;
char get() const{ return contents[ cursor];}
inline char get(index ht,index wd) const;
index get_cursor() const;
screen(index hght, index wdth,const string & cntnts);
screen& move (index r,index c);
screen& set (char);
screen& display(ostream & os);
private :
string contents;//b. 是不是这些变量前都要在前面加上extern?如果这样是不是在cpp里还要把这部分写一遍啊,只是不加extern?
index cursor;
index height;
index width;
};
2.又有一章说:类定义放在.h里,成员函数定义一般放在同名的源文件里 a. 结合问题1,变量声明在头文件,这说函数定义在源文件。那变量定义在哪? b. 我们写main时包含了头文件,但没提 其同名源文件的事啊,编译器会自动去找? c. 我用vs2010 的添加选项:除了创建项里有头文件,还有一个创建类。那用这个创建类的选项和 书上所说,用头文件,源文件的方式有区别吗?有的话哪个好? d. 创建的头文件不在当前的工程下,要包含这个头文件仍是直接#include"screen"就好了? 谢谢
搜索更多相关主题的帖子: contents private display 
2012-08-22 14:46
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
得分:0 
回复 3楼 pangding
非常感谢两位的回答,很满意。但恕我才疏学浅,再追问几句:

1.书上在说完  以防重复定义所以头文件只声明   后,就讲了条件预处理命令。两者是   并列关系  即  是两种处理 多次定义  的方法?
2.“contents 其实只是类 screen 定义的一部分。并不是在单独定义变量,因此不用加 extern。而在 cpp 里,也只用包含这个头文件就可以了。不用再重新定义。”是说类定义里的对变量的操作都不是定义?是声明?那怎么还会“因为如果一个变量既在 a.h 中有所定义,又在 b.h 中有所定义。那么最终会因为重复定义而产生错误。所以一般只能用 exterm 声明变量,而在对应的 cpp 中定义。”?   没理解,所以这两句意思感觉矛盾。。。   “变量应该定义在 cpp 里。”到底怎么定义呢?
3“.vs2010的项目有个include属性,表示编译的时候到这些目录中去搜索头文件,你只要添加了相应的路径就可以搜索到了”如图: 是这个吗?包含目录后面的内容是:$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;没看懂。。。这些是路径?
4.“你可以进入命令行窗口后打set回车,可以看到当前的环境变量设置。”  请问命令行窗口指什么?是图中的吗?怎么没呢?
5“main.cpp只要包含头文件就可以了。.h中的函数声明会自动到同名源文件中搜索函数定义”和“它负责把函数调用和函数的定义联系在一起。它会在一些指定的地方查找函数的定义,比如系统库文件的位置和当前工程指定的位置。”说的不一样,还是后者对吧。但“一些指定的地方”是?我是可以随便在一个工程里建一个定义函数的cpp吗?只要有,他就能找到是吗?
2012-08-23 10:20
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
得分:0 
回复 6楼 lonmaor
1.
添加#ifndef/#endif预定义语句,感觉函数定义什么的就可以直接写在头文件里也没事了吧,那为何还要建源文件?



4.
这里命令行方式不是指vs的命令行方式,是windows程序的附件中的命令提示符,用win+R打开运行窗口,输入cmd回车也是一样的。
吧?

非常感谢。
2012-08-23 13:47
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
得分:0 
还有“比如如果设计不当,就可能会出现循环包含。比如 a.h 包含 b.h,而 b.h 又包含 a.h”
书上有个例子:Message 类里有一个set<Folder*>保存message所在所有文件夹的指针。而类Folder里有一个set<Message*>保存文件夹里所有文件的指针
如Folder类定义前写一个Message的声明,不就解决了循环包含吗?
程序代码:
#include<set>
#include<string>
class Message
class Folder
{//...}
2012-08-23 14:24
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
得分:0 
程序代码:
Folder& Folder::operator=(const Folder&f){
    if(& f!=this){
        remove_Fl_from_Msg();
        messages=f.messages;
        put_Fl_in_Msg(messages);
     }
    return *this;
}
还有为什么返回值类型Folder&前没有Folder::
2012-08-23 14:56
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
得分:0 
回复 12楼 pangding
“正确的写法就是头文件里写 extern int a; cpp 里写 int a = 1; 这样。类的定义不受这个限制。”
恩。。。。关于声明,定义。int  a;是定义吧?那在类的定义里写,还是定义不?如:class A{ int a;}中的算是声明?如果是定义,可大家都这么些的啊。。
谢谢
2012-08-25 17:53
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
得分:0 
回复 17楼 pangding
恩。。谢谢。。其实我想问的是class A{int a;};中对于a 这个变量是定义还是对a的声明。。。
2012-08-27 08:24
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
得分:0 
回复 20楼 pangding
奥。。明白了。但这是有点矛盾吗?就像函数在类的定义里是分定义和声明的。。。还是只是这样说其实他们也不是定义。。。。
2012-08-27 23:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-379925-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.248687 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved