我有一些来自std::exception
或std::runtime_error
的例外情况。唯一的方法是构造函数explicit MyExceptionX(const char *text = "") : std::exception(text) {}
。有没有办法在不使用宏的情况下简化这些代码?
class MyException1: public std::exception
{
public:
explicit MyException1(const char *text = "") : std::exception(text) {}
};
class MyException2: public std::exception
{
public:
explicit MyException2(const char *text = "") : std::exception(text) {}
};
class MyException3: public std::exception
{
public:
explicit MyException3(const char *text = "") : std::exception(text) {}
};
//...
答案 0 :(得分:7)
当一切都公开时,无需使用class
。您可以改用struct
。此外,您可以继承构造函数:
struct MyException1: std::exception
{
using std::exception::exception;
};
struct MyException2: std::exception
{
using std::exception::exception;
};
struct MyException3: std::exception
{
using std::exception::exception;
};
另外,如果你真的需要不同的类型,你可以这样做:
template <int>
struct MyException : std::exception
{
using std::exception::exception;
};
using MyException1 = MyException<1>;
using MyException2 = MyException<2>;
using MyException3 = MyException<3>;
如果您想要更具描述性的名称,可以使用enum
代替int
。
答案 1 :(得分:0)
你可以是using
超类'构造函数。以下简化的代码示例可以满足您的需求:
#include <iostream>
class A {
public:
A(char* cText) {
std::cout << cText << std::endl;
}
~A() {
}
};
class B : public A {
public:
using A::A;
~B() {
}
};
int main(int argc, char** argv) {
B("Test");
return 0;
}
此外,继承构造函数的using
功能仅在使用-std=c++11
或-std=gnu++11
进行编译时可用。
答案 2 :(得分:0)
以下在我的VisualStudio 2012中编译良好:
> > "C:\Program Files\Java\jdk1.7.0_80\bin\java" -Xmx1024M -XX:MaxPermSize=512m -Dmaven.home=C:\IBM\apache-maven-3.3.3 -Dclassworlds.conf=C:\IBM\apache-maven-3.3.3\bin\m2.conf -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0.2\bin" -Dfile.encoding=UTF-8
> -classpath "C:\apache-maven-3.3.3\boot\plexus-classworlds-2.5.2.jar;C:\Program
> Files (x86)\JetBrains\IntelliJ IDEA 14.0.2\lib\idea_rt.jar"
> com.intellij.rt.execution.application.AppMain
> org.codehaus.classworlds.Launcher -Didea.version=14.0.2
> -DskipTests=true package -P enterprise
>
> -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
不幸的是,C ++不允许在throw语句本身中使用字符串文字。详情请见:String literals not allowed as non type template parameters。