| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1155 人关注过本帖
标题:关于C++多文件的问题
只看楼主 加入收藏
蜗牛cr
Rank: 1
等 级:新手上路
帖 子:49
专家分:5
注 册:2014-11-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:15 
关于C++多文件的问题
头文件,源文件之间的包含关系是怎么样的,还有如果一个类中用了类模板,其头文件和源文件该如何包括进主函数里?下面这个项目,是一个关于计算器运算的,但编译通不过,请大家查查哪有错?
Calculator.zip (3.36 KB)
搜索更多相关主题的帖子: 计算器 源文件 如何 项目 
2015-10-01 14:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
頭文件用於聲明,源文件用於實現。

授人以渔,不授人以鱼。
2015-10-01 18:01
蜗牛cr
Rank: 1
等 级:新手上路
帖 子:49
专家分:5
注 册:2014-11-24
收藏
得分:0 
回复 2楼 TonyDeng
还是不太清楚,有例子吗
2015-10-01 20:07
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
收藏
得分:0 
楼主的代码就是例子
2015-10-01 20:09
蜗牛cr
Rank: 1
等 级:新手上路
帖 子:49
专家分:5
注 册:2014-11-24
收藏
得分:0 
回复 4楼 hjx1120
额,可是程序运行不了
2015-10-02 11:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你把代碼直接貼出來,還有編譯信息。

授人以渔,不授人以鱼。
2015-10-02 17:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
main.cpp
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xlocale(341): warning C4530: 使用了 C++ 异常处理程序,但未启用展开语义。请指定 /EHsc
d:\downloads\calculator\MyStack.h(1): error C2370: “maxstack”: 重定义;不同的存储类
d:\downloads\calculator\MyStack.h(1): note: 参见“maxstack”的声明
d:\downloads\calculator\MyStack.h(2): error C2011: “Error_code”:“enum”类型重定义
d:\downloads\calculator\MyStack.h(2): note: 参见“Error_code”的声明
d:\downloads\calculator\MyStack.h(20): error C2953: “MyStack”: 类模板已经定义
d:\downloads\calculator\MyStack.h(4): note: 参见“MyStack”的声明
mystack.cpp
calculator.cpp
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xlocale(341): warning C4530: 使用了 C++ 异常处理程序,但未启用展开语义。请指定 /EHsc
d:\downloads\calculator\MyStack.h(1): error C2370: “maxstack”: 重定义;不同的存储类
d:\downloads\calculator\MyStack.h(1): note: 参见“maxstack”的声明
d:\downloads\calculator\MyStack.h(2): error C2011: “Error_code”:“enum”类型重定义
d:\downloads\calculator\MyStack.h(2): note: 参见“Error_code”的声明
d:\downloads\calculator\MyStack.h(20): error C2953: “MyStack”: 类模板已经定义
d:\downloads\calculator\MyStack.h(4): note: 参见“MyStack”的声明
d:\downloads\calculator\MyStack.cpp(8): error C2244: “MyStack::MyStack”: 无法将函数定义与现有的声明匹配
d:\downloads\calculator\MyStack.cpp(4): note: 参见“MyStack::MyStack”的声明
d:\downloads\calculator\MyStack.cpp(8): note: 定义
d:\downloads\calculator\MyStack.cpp(8): note: 'MyStack::MyStack(void)'
d:\downloads\calculator\MyStack.cpp(8): note: 现有声明
d:\downloads\calculator\MyStack.cpp(8): note: 'MyStack<Stack_entry>::MyStack(void)'
d:\downloads\calculator\MyStack.cpp(19): error C2244: “MyStack::empty”: 无法将函数定义与现有的声明匹配
d:\downloads\calculator\MyStack.cpp(11): note: 参见“MyStack::empty”的声明
d:\downloads\calculator\MyStack.cpp(19): note: 定义
d:\downloads\calculator\MyStack.cpp(19): note: 'bool MyStack::empty(void) const'
d:\downloads\calculator\MyStack.cpp(19): note: 现有声明
d:\downloads\calculator\MyStack.cpp(19): note: 'bool MyStack<Stack_entry>::empty(void) const'
d:\downloads\calculator\MyStack.cpp(29): error C2244: “MyStack::push”: 无法将函数定义与现有的声明匹配
d:\downloads\calculator\MyStack.cpp(21): note: 参见“MyStack::push”的声明
d:\downloads\calculator\MyStack.cpp(29): note: 定义
d:\downloads\calculator\MyStack.cpp(29): note: 'Error_code MyStack::push(const Stack_entry &)'
d:\downloads\calculator\MyStack.cpp(29): note: 现有声明
d:\downloads\calculator\MyStack.cpp(29): note: 'Error_code MyStack<Stack_entry>::push(const Stack_entry &)'
d:\downloads\calculator\MyStack.cpp(39): error C2244: “MyStack::pop”: 无法将函数定义与现有的声明匹配
d:\downloads\calculator\MyStack.cpp(31): note: 参见“MyStack::pop”的声明
d:\downloads\calculator\MyStack.cpp(39): note: 定义
d:\downloads\calculator\MyStack.cpp(39): note: 'Error_code MyStack::pop(void)'
d:\downloads\calculator\MyStack.cpp(39): note: 现有声明
d:\downloads\calculator\MyStack.cpp(39): note: 'Error_code MyStack<Stack_entry>::pop(void)'
d:\downloads\calculator\MyStack.cpp(49): error C2244: “MyStack::top”: 无法将函数定义与现有的声明匹配
d:\downloads\calculator\MyStack.cpp(41): note: 参见“MyStack::top”的声明
d:\downloads\calculator\MyStack.cpp(49): note: 定义
d:\downloads\calculator\MyStack.cpp(49): note: 'Error_code MyStack::top(Stack_entry &) const'
d:\downloads\calculator\MyStack.cpp(49): note: 现有声明
d:\downloads\calculator\MyStack.cpp(49): note: 'Stack_entry MyStack<Stack_entry>::top(void) const'
d:\downloads\calculator\MyStack.cpp(49): note: 'Error_code MyStack<Stack_entry>::top(Stack_entry &) const'
d:\downloads\calculator\MyStack.cpp(56): error C2244: “MyStack::top”: 无法将函数定义与现有的声明匹配
d:\downloads\calculator\MyStack.cpp(51): note: 参见“MyStack::top”的声明
d:\downloads\calculator\MyStack.cpp(56): note: 定义
d:\downloads\calculator\MyStack.cpp(56): note: 'Stack_entry MyStack::top(void) const'
d:\downloads\calculator\MyStack.cpp(56): note: 现有声明
d:\downloads\calculator\MyStack.cpp(56): note: 'Stack_entry MyStack<Stack_entry>::top(void) const'
d:\downloads\calculator\MyStack.cpp(56): note: 'Error_code MyStack<Stack_entry>::top(Stack_entry &) const'
d:\downloads\calculator\MyStack.cpp(61): error C2244: “MyStack::setnull”: 无法将函数定义与现有的声明匹配
d:\downloads\calculator\MyStack.cpp(58): note: 参见“MyStack::setnull”的声明
d:\downloads\calculator\MyStack.cpp(61): note: 定义
d:\downloads\calculator\MyStack.cpp(61): note: 'void MyStack::setnull(void)'
d:\downloads\calculator\MyStack.cpp(61): note: 现有声明
d:\downloads\calculator\MyStack.cpp(61): note: 'void MyStack<Stack_entry>::setnull(void)'
正在生成代码...

授人以渔,不授人以鱼。
2015-10-02 18:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
凡是編譯錯誤,從頭到尾逐個排除,改一項編譯一次,每次修正第一條錯誤信息,因為後面的許多錯誤信息,往往是前面錯誤連帶引出的,改了前面的,後面的可能不再出現,所以必須從上到下逐個改、逐次編譯。

我們先看這一條:
d:\downloads\calculator\MyStack.h(1): error C2370: “maxstack”: 重定义;不同的存储类
d:\downloads\calculator\MyStack.h(1): note: 参见“maxstack”的声明

根據這條信息,查看MyStack.h文件的第一行:
程序代码:
const int maxstack=10;//ջ��Ԫ����������
enum Error_code{success,underflow,overflow};// &ouml;�����ͣ������жϺ������гɹ�����
template<class Stack_entry>
class MyStack//��ģ�壬ʵ�ֳ����Ŀ����ԣ���������ΪStack_entry 
{
    public:
        MyStack();
        bool empty()const;//�ж�ջ�Ƿ�Ϊ��
        Error_code push(const Stack_entry& item);
        Error_code pop();
        Error_code top(Stack_entry& item)const;
        Stack_entry top()const;//����top������ʵ�ֲ�ͬ����Ҫ
        void setnull();//����ջ
    private:
        int count;//������
        Stack_entry entry[maxstack];//������ʵ�ִ洢 
             
        
    
};

 


第一行是
const int maxstack=10;//ջ��Ԫ����������
這是一個常量聲明兼定義。“定義”,是創建一個數據實體,而不僅僅是聲明(回看上面我告訴你頭文件應該祗有聲明的話)。由於你這個頭文件在多處.cpp中被#include進來,所以等於在這多個.cpp文件中都重複定義並創建一個同名變量,這是語言不允許的。

修改並不是簡單地讓錯誤信息消失了事,關鍵是要看程序使用這個變量的意圖,才能針對性的改對。改的辦法有許多,視意圖而定。你這個maxstack變量真的是整個程序都要用到的全局變量嗎?如果是,那麼祗應在一個.h中聲明並定義它,然後在別的.h中extern引用這個變量。如果是僅在某個#include了這個.h文件的.cpp模塊中使用,那麼可以用static修飾這個變量,則所有#include過這個.h的.cpp都有各自獨立、相互隱藏不可見的同名變量。

注意看上面一段呐:千萬不要覺得“讓編譯器不報錯就可以了”,對於不合真正意圖的編程,編譯器無錯通過祗能讓你更困惑,更無法排查錯誤,此時你可能完全不知道問題發生在這裡。太多的人是但求編譯器不報錯就算學會了的。

[ 本帖最后由 TonyDeng 于 2015-10-2 18:40 编辑 ]

授人以渔,不授人以鱼。
2015-10-02 18:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
從命名的性質和初步觀察看,你這個變量本來就不宜放在.h中,它合理的位置應是在main.cpp的全局變量區中初始化,.h祗聲明即可。

還有:通常來說,一個.h文件是不應該被重複#include的,在整個程序中,它祗應出現一次,多次#include同一個文件,人家那是有防重複#include機制的。那個技巧,很多資料都有介紹,自己去找。不告訴你前面這些,你也不會知道人家的代碼寫那個是幹什麼用,所以說光模仿、拼命抄別人的代碼,其實是學不到什麼的,不是自己碰過壁再想出來的東西,不是自己的。

[ 本帖最后由 TonyDeng 于 2015-10-2 18:52 编辑 ]

授人以渔,不授人以鱼。
2015-10-02 18:46
蜗牛cr
Rank: 1
等 级:新手上路
帖 子:49
专家分:5
注 册:2014-11-24
收藏
得分:0 
回复 9楼 TonyDeng
谢谢版主,为啥你的回复都是繁体字?
2015-10-04 10:13
快速回复:关于C++多文件的问题
数据加载中...
 
   



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

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