1

入力パラメーターに依存するタイプのオブジェクトを構築しようとしています。たとえば、私のオブジェクトは「プロセス」と呼ばれ、実行時に 2 から 5 までの整数 (両端を含む) が入力され、次のようなことが起こります。

if (input == 2) TwoJ   process;
if (input == 3) ThreeJ process;
if (input == 4) FourJ  process;
if (input == 5) FiveJ  process;

オブジェクトがすぐに範囲外になるため、明らかに上記は機能しません。これをうまく実装する方法はありますか?乾杯

4

3 に答える 3

8

基底クラスへのスマート ポインターを返すファクトリ関数を使用し、その実装はファクトリ関数に提供される整数値によって決定されます (すべてのクラスが共通の基底を持つ必要があります)。Process

例えば:

class Base_process
{
public:
    virtual ~Base_process() {}
    virtual void do_something() = 0;
};

class TwoJ : public Base_process
{
public:
    void do_something() {}
}
class ThreeJ : public Base_process
{
public:
    void do_something() {}
}

std::unique_ptr<Base_process> make_process(int a_type)
{
    if (a_type == 1) return std::unique_ptr<Base_process>(new TwoJ());
    if (a_type == 2) return std::unique_ptr<Base_process>(new ThreeJ());

    // Report invalid type or return an acceptable default if one exists.
    throw std::invalid_argument("Unknown type:" + std::to_string(a_type));
}
于 2013-07-02T10:36:49.077 に答える
2

一種のファクトリーメソッド

std::unique_ptr<ProcessType> CreateProcess(int input){ 
    if(input == 2) return std::unique_ptr<ProcessType>(new TwoJ());
    .....
}

もちろん、これは、使用するさまざまなクラスに共通の基本クラス hereProcessTypeがあり、基本クラス ポインターを介してそれと対話することに満足していることを前提としています。

于 2013-07-02T10:36:10.753 に答える
0

できますが、これらすべてに対して1つの基本クラスが必要です。

Base* process;

if (input == 2) process = new TwoJ();
if (input == 3) process = new ThreeJ();

次に、これらのクラスにアクセスするために必要なのは次のとおりです。

if (input == 2) (TwoJ*)process->someTwoJMethod();

または dynamic_cast を使用して:

TwoJ* p = dynamic_cast<TwoJ*>(process);
if(p != 0) {
   p->someTwoJMethod();
}

これにより、オブジェクトが範囲外になったら、オブジェクトを削除する責任があります。以前の回答は、std::unique_ptrオブジェクトが範囲外になると自動的に削除されるオブジェクトを使用する cpp の最良の方法です。

于 2013-07-02T10:39:27.903 に答える