0
如何爲類構造函數編寫異常說明符。 在下面的例子中,throw()可以正常工作,除了構造函數以外的所有其他成員函數。 我使用的是g ++ 4.8。C++構造函數的異常說明符
#include <exception>
#include <string>
class ArrayStackException: public std::exception {
public:
ArrayStackException(std::string msg) : mMsg(msg) {}
virtual const char* what() const throw() {
return mMsg.c_str();
}
std::string mMsg;
};
template<typename T>
class ArrayStack {
public:
//ArrayStack() = delete;
explicit ArrayStack(int stackSize) throw();
~ArrayStack();
void Push(T item) throw();
T Pop() throw();
bool IsEmpty() const;
T StackTop() const throw();
private:
int mStackSize;
int mTop;
T* mItems;
};
template<typename T>
ArrayStack<T>::ArrayStack(int stackSize) : mStackSize(stackSize),
mTop(-1),
mItems(nullptr) throw() {
if(stackSize < 1) {
throw ArrayStackException(std::string("Stack size must be geater than 0"));
}
mItems = new T[mStackSize];
}
template<typename T>
ArrayStack<T>::~ArrayStack() {
delete mItems;
}
template<typename T>
void ArrayStack<T>::Push(T item) throw(){
if(mTop == (mStackSize - 1)){
throw ArrayStackException(std::string("Stack Overflow Occured..."));
}
++mTop;
mItems[mTop] = item;
}
template<typename T>
T ArrayStack<T>::Pop() throw(){
if(IsEmpty() == true){
throw ArrayStackException(std::string("Stack Underflow Occured..."));
}
return mItems[mTop--];
}
template<typename T>
bool ArrayStack<T>::IsEmpty() const {
return (mTop == -1 ? true : false);
}
template<typename T>
T ArrayStack<T>::StackTop() const throw(){
if(IsEmpty() == true) {
throw ArrayStackException(std::string("Stack is empty!!"));
}
return mItems[mTop];
}
01:27:54 **** Incremental Build of configuration Debug for project ArrayStack ****
make all
Building file: ../src/ArrayStack.cpp
Invoking: GCC C++ Compiler
g++ -D__GXX_EXPERIMENTAL_CXX0X__ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/ArrayStack.d" -MT"src/ArrayStack.d" -o "src/ArrayStack.o" "../src/ArrayStack.cpp"
In file included from ../src/ArrayStack.cpp:10:0:
../src/ArrayStack.h:31:40: error: declaration of ‘ArrayStack<T>::ArrayStack(int)’ has a different exception specifier
ArrayStack<T>::ArrayStack(int stackSize) : mStackSize(stackSize),
^
../src/ArrayStack.h:17:11: error: from previous declaration ‘ArrayStack<T>::ArrayStack(int) throw()’
explicit ArrayStack(int stackSize) throw();
^
../src/ArrayStack.h: In constructor ‘ArrayStack<T>::ArrayStack(int)’:
../src/ArrayStack.h:33:33: error: expected ‘{’ before ‘throw’
mItems(nullptr) throw() {
^
../src/ArrayStack.h: At global scope:
../src/ArrayStack.h:33:33: error: expected unqualified-id before ‘throw’
make: *** [src/ArrayStack.o] Error 1
謝謝約瑟夫曼斯菲爾德。 – dearvivekkumar
@dearvivekkumar沒問題。如果它有幫助,不要忘記接受。 –