0

2 つのクラスがある場合:

class A{
    f();
}

class B{
    f();
};

次のような条件に基づいて、これらのクラスのいずれかをオブジェクトに割り当てる必要があります。

define variable
if condition1
    variable = A
else
    variable = B

そして、割り当てられたvariable.f();

4

3 に答える 3

1

提供されAB無関係な型 (つまり、継承階層の一部ではない) であることを意図している場合、Boost.Variant をboost::static_visitor<>クラスと組み合わせて使用​​して、同様のことを実現できます。

#include <boost/variant.hpp>
#include <iostream>

struct A { void f() { std::cout << "A::f();" << std::endl; } };
struct B { void f() { std::cout << "B::f();" << std::endl; } };

struct f_caller : boost::static_visitor<void>
{
    template<typename T>
    void operator () (T& t)
    {
        t.f();
    }
};

bool evaluate_condition()
{
    // Just an example, some meaningful computation should go here...
    return true;
}

int main()
{
    boost::variant<A, B> v;
    if (evaluate_condition())
    {
        A a;
        v = a;
    }
    else
    {
        B b;
        v = b;
    }

    f_caller fc;
    v.apply_visitor(fc);
}
于 2013-03-11T18:54:45.040 に答える
1

継承と仮想関数に注目する必要があります。コードは次のようになります

class Base
{
    virtual void f() = 0;
};

class A : public Base
{
    virtual void f()
    {
        //class A realization of f
    }
};

class B : public Base
{
    virtual void f()
    {
        //class B realization of f
    }
};

そして、あなたはこれを行うことができます

Base* VARIABLE = 0;
if (*condition*)
{
   VARIABLE = new A();
}
else
{
   VARIABLE = new B();
}

VARIABLE->f();

しかし、継承と仮想関数を使用することは必ずしも良い考えではありません。クラス A と B には、少なくとも関数 f() の意味について共通点があるはずです。

于 2013-03-11T18:54:59.923 に答える
0

あなたがしていることは、デザインパターンでは「ファクトリーパターン」として知られています。上記の回答は、実装方法をカバーしています。詳細については、C++ でファクトリ メソッド パターンを正しく実装する方法と wiki ( http://en.wikipedia.org/wiki/Factory_method_pattern ) を参照してください。

于 2013-03-11T19:00:47.053 に答える