【问题标题】:Define an error class for C++为 C++ 定义一个错误类
【发布时间】:2016-05-06 05:54:54
【问题描述】:

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

请注意,如果我将 my_exception 的整个定义和声明移到 my_class.cpp 中,一切都可以正常编译并正常工作。为什么会这样,我应该怎么写才能将异常的定义放入.h 文件中?还是应该将错误类定义放入.h 文件中?

main.cpp:

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

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

my_class.cpp:

#include my_class.h
my_class::my_class(){ 
    throw me_err; 
}

【问题讨论】:

  • 为什么需要全局变量 me_err 以及为什么要将 my_exception 与 my_class 一起定义(在同一个文件中)?
  • 此外,在所有不会立即触发错误的坏事中,在头文件中包含using namespace std 是最糟糕的情况之一。

标签: c++ class error-handling


【解决方案1】:

您遇到的问题是您在头文件中创建了一个全局变量。当您编译 main.cppmy_class.cpp 时,它们中的每一个现在都具有相同的全局变量。要解决此问题,您可以使 me_err 成为 my_class 的成员,因为它正在使用它。

编辑:

正如Fred Larson 所指出的,您可以完全摆脱me_err 而只使用throw my_exception;

【讨论】:

  • me_err 是否需要存在?为什么不只是throw my_exception;
猜你喜欢
  • 2012-02-16
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 2016-09-27
  • 1970-01-01
相关资源
最近更新 更多