2009-02-23 11 views
9

で新しい例外を作成する:私はそれをコンパイルしようとすると、は、私はC++クラスを持っていると私はUbuntuの中でそれを実行しようとしていますC++

#ifndef WRONGPARAMETEREXCEPTION_H_ 
#define WRONGPARAMETEREXCEPTION_H_ 

#include <iostream> 
#include <exception> 
#include <string> 

using namespace std; 

#pragma once 

class WrongParameterException: public exception 
{ 
    public: 
     WrongParameterException(char* message): exception(message) {}; 
     virtual ~WrongParameterException() throw() {}; 
}; 

#endif 

、コンパイラは私に、このエラーを与える:

WrongParameterException.h: In constructor ‘WrongParameterException::WrongParameterException(char*)’: 
WrongParameterException.h:14: error: no matching function for call to ‘std::exception::exception(char*&)’ 
/usr/include/c++/4.3/exception:59: note: candidates are: std::exception::exception() 
/usr/include/c++/4.3/exception:57: note: std::exception::exception(const std::exception&) 

誰かが私に間違っていることを教えてもらえますか?私はstringまたはconst stringまたはconst string&にメッセージ変数を変更しようとしましたが、それは役に立ちませんでした。

try 
{ 
    if ((strToInt1 == -1) || (parameters[1] == NULL) || (strToInt3 == -1) || (parameters[3] != NULL)) 
    { 
      throw WrongParameterException("Error in the config or commands file"); 
    } 
} 
catch(WrongParameterException e) 
{ 
    log.addMsg(e.what()); 
} 
+3

質問には関係ありませんが、重要です:ヘッダーに 'use namespace std;'を使用しないでください。次に、C++が提供する標準例外クラス(std :: runtime_error、logic_error、およびdomain_errorなど)について学びます。 const&でキャッチ例外ヘッダーにはを含めないでください。 – gimpf

答えて

17

まず、#pragma onceは間違った方法ですが、ヘッダーのガードについて学びます。 Related question on SOはなぜ#pragma onceを使用するのが間違っているのか説明しています。ウィキペディアは、同じ目的を果たすために、どのように弱点もなくinclude guardsの使い方を説明しています。

第2に、わからないパラメータ(この場合は文字配列へのポインタ)を使用してstd :: exceptionのコンストラクタを呼び出しています。

#include <stdexcept> 
#include <string> 

class WrongParameterException : public std::runtime_error { 
public: 
    WrongParameterException(const std::string& message) 
     : std::runtime_error(message) { }; 
}; 

おそらくあなたが望むものでしょうか。例外の詳細については、C++ FAQ Lite article on Exceptionsおよびexceptions article(cplusplus.com)を参照してください。

幸運を祈る!

+0

ヘッダーガードはより正確で移植性がありますが、コードがMSコンパイラでコンパイルされることがわかっている場合は、#pragmaを実行するとコンパイルが速くなります(一致する#endifを見つけるためにファイルを解析しません) )。 –

+0

彼はUbuntuでこれを実行していると指定していたので、GCCと仮定しています。この場合、PRAGMA文は最初に機能しません。 –

+7

#pragmaは、このコメントが書き込まれた時点のgccバージョンで一度サポートされていることは間違いありません。そうでない場合、今サポートされています - http://gcc.gnu.org/onlinedocs/gcc-4.6.2/cpp/Alternatives-to-Wrapper-_0023ifndef.html – Steve

9

のstd ::例外は、文字列のいずれかの種類を取るコンストラクタを持っていない、唯一の仮想何()メソッドを返します。ここでは

は私がメインで作成した新しい例外を使用する方法であります例外の説明。

自分で文字列を保存してそこから返す必要があります。

5

std :: exceptionのコンストラクタは文字列引数をとらない。コンパイルエラーの原因となるものを1つ与えようとしています。

文字列を格納する必要があります。文字列は、未処理のポインタではなくstd :: stringとして処理する方がよいでしょう。what()メソッドから返します。 MS VS2K5で例外クラスの宣言を見てみると

2

、あなたが欲しいコンストラクタは次のとおりです。

exception (const char *const&); 

そうにあなたのコンストラクタを変更してみてください:

WrongParameterException (const char *const message) 

、それが助けかどうかを確認します。それ以外の場合は、独自のクラスにポインタを格納し、関連するすべてのメソッドを実装します。

1

単純な解決策は、例外を別の方法で設計することです。簡単な例を次に示します。

class MyException : public Exception 
{ 
public: 
    MyException(CString strError) { m_strError = strError; } 

    CString m_strError; 
}; 

次に、あなたの例外メッセージを使用してください。これは、ExceptionにはString以外のコンストラクタがないため、あなた自身でそれをstlreする必要があるからです。

8

私のアドバイスは、次のようになります。std::runtime_errorから

  1. 継承。上記のX-Istenceによってアドバイスされたとおり。これは概念的にはランタイムエラーであり、std::runtime_errorコンストラクタは何が起こったかを説明する引数としてstd::stringを受け入れます。
  2. 例外についてキャッチすることについてcatch(WrongParameterException e)の代わりにcatch(WrongParameterException const& e) (constリファレンスに注意してください)を使用します。まず例外は通常あなたのケースでは定数であり、また参照を使用して、WrongParameterExceptionのサブクラスをキャッチします。例外処理。
関連する問題