为C+定义错误类+; 我一直试图在C++中定义一个错误类。我有三个档案main.cpp,my_class.h,my_class.cpp。如果我尝试使用下面的代码进行编译,当然,所有代码都在三个单独的文件中,我会得到一个多定义错误my_exception

为C+定义错误类+; 我一直试图在C++中定义一个错误类。我有三个档案main.cpp,my_class.h,my_class.cpp。如果我尝试使用下面的代码进行编译,当然,所有代码都在三个单独的文件中,我会得到一个多定义错误my_exception,c++,class,error-handling,C++,Class,Error Handling,请注意,如果我将my_exception的整个定义和声明移动到my_class.cpp中,那么一切都可以正常编译。为什么会这样,我应该如何编写,以便将异常的定义放入.h文件?或者我甚至应该将错误类定义放入.h文件中 main.cpp: #include my_class.h int main(){ my_class m; /* stuff */ } #include my_class.h my_class::my_class(){ throw me_err; }

请注意,如果我将
my_exception
的整个定义和声明移动到
my_class.cpp
中,那么一切都可以正常编译。为什么会这样,我应该如何编写,以便将异常的定义放入
.h
文件?或者我甚至应该将错误类定义放入
.h
文件中

main.cpp

#include my_class.h
int main(){
    my_class m;
    /* stuff */
}
#include my_class.h
my_class::my_class(){ 
    throw me_err; 
}
my_class.h

#ifndef MY_CLASS_H
#define MY_CLASS_H

#include <iostream>  //irrelevant for this
#include <exception>
using namespace std;

//taken from http://www.cplusplus.com/doc/tutorial/exceptions/
class my_exception : public exception{
    virtual const char* what() throw() { return "message";}
} me_err;

class my_class{
    my_class() };
};

#endif // MY_CLASS_H

您遇到的问题是在头文件中创建了一个全局变量。编译
main.cpp
my_class.cpp
时,它们中的每一个现在都具有相同的全局变量。要解决此问题,您可以使
me\u err
成为
my\u类的成员,因为这就是使用它的原因

编辑:


正如您所指出的,您可以完全摆脱
me\u err
,只需使用
抛出my\u异常

您遇到的问题是在头文件中创建了一个全局变量。编译
main.cpp
my_class.cpp
时,它们中的每一个现在都具有相同的全局变量。要解决此问题,您可以使
me\u err
成为
my\u类的成员,因为这就是使用它的原因

编辑:


正如您所指出的,您可以完全摆脱
me\u err
,只需使用
抛出my\u异常

为什么需要全局变量
me\u err
,为什么要将my\u异常与
my\u class
一起定义(在同一个文件中)?此外,对于所有不会立即触发错误的错误,在头文件中使用命名空间std
是最糟糕的情况之一。为什么需要全局变量
me\u err
,为什么要将my\u异常与
my\u class
一起定义(在同一个文件中)?此外,在所有不会立即触发错误的错误中,在头文件中使用
名称空间std
是最糟糕的情况之一。是否需要存在
me\u err
?为什么不直接抛出我的异常
me\u err
是否需要存在?为什么不直接抛出我的异常