9

私はC++クラスを持っていて、Ubuntuで実行しようとしています。

#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&たが、役に立ちませんでした。

mainから作成した新しい例外を使用する方法は次のとおりです。

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());
}
4

6 に答える 6

19

まず、#pragma onceそれを回避するための間違った方法です。ヘッダーインクルードガードについて学びます。SOに関する関連する質問#pragma onceは、使用が間違った方法である理由を説明しています。ウィキペディアでは、欠点のない同じ目的を果たすインクルードガードの使用方法について説明しています。

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

#include <stdexcept>
#include <string>

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

おそらくあなたが望むものになるでしょう。例外の詳細については、cplusplus.comの例外に関するC ++ FAQLiteの記事と例外の記事を参照してください。

幸運を!

于 2009-02-23T11:29:09.283 に答える
9

std :: exceptionには、あらゆる種類の文字列を受け取るコンストラクターはなく、例外の説明を返す仮想what()メソッドのみがあります。

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

于 2009-02-23T11:14:49.690 に答える
8

私のアドバイスは次のとおりです。

  1. から継承しstd::runtime_errorます。上記のX-Istenceによってアドバイスされたように。これは概念的にはランタイムエラーであり、コンストラクターは何が起こったかを説明する引数としてをstd::runtime_error受け入れます。std::string
  2. 例外のキャッチについて。catch(WrongParameterException const& e) の代わりに(const参照に注意してください)を使用catch(WrongParameterException e)します。最初に、例外は通常、あなたの場合は一定であり、また、参照を使用して、WrongParameterExceptionコードがより洗練された例外処理で進化する場合に備えて、のサブクラスをキャッチします。
于 2009-02-23T11:41:38.393 に答える
5

std::exceptionのコンストラクターは文字列引数を取りません。あなたはそれに1つを与えようとしています。それがコンパイルエラーの原因です。

文字列を保存する必要があります。これは、生のポインタではなくstd :: stringとして処理し、what()メソッドから返す方が適切です。

于 2009-02-23T11:16:36.520 に答える
2

MS VS2K5の例外クラスの宣言を見ると、必要なコンストラクターは次のとおりです。

exception (const char *const&);

したがって、コンストラクターを次のように変更してみてください。

WrongParameterException (const char *const message)

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

于 2009-02-23T11:17:13.023 に答える
1

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

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

   CString m_strError;
};

その後、例外メッセージを自由に使用できます。これは、Exceptionには文字列を除くコンストラクタがないため、自分で文字列を作成する必要があるためです。

于 2009-02-23T11:18:51.820 に答える