0

主な機能

main(){

    foo x=1, y=1, z=1;

}

ヘッダー/クラス

class foo{

public:
    double a, b, c;
    double fn, val;

    // set a,b, and c
    void set(){
        a=1;
        b=1;
        c=1;
    }

    // constructor
    foo(double &f){
        set();

        // what I want to do here is say if "name of variable f" = "x", then do something
        // else if "name of variable f" = "y", do something else
        // else if "name of variable f" = "z", do something else
    }
};

メイン関数でわかるように、x、y、z はすべて同じ値です。このケースを処理する条件を記述しようとしていますが、変数名を確認するために思いついた方法の 1 つです。「x」という名前のクラスfooのオブジェクトに対して常に同じことをしたいので、それらの値がたまたま何であれ、「y」などに対して常に同じことをしたいからです。

4

3 に答える 3

1

質問で求めていることはできません。同様のことを行う方法がいくつかあります。

継承を使用できます。

class foo{

public:
    double a, b, c;
    double fn, val;

    // set a,b, and c
    void set(){
        a=1;
        b=1;
        c=1;
    }

    // constructor
    foo(double &f){
        set();
    }
};

class X : public foo {
{
public:
    X (double &f) : foo(f) {
        // do stuff for x
    }
};

class Y : public foo {
{
public:
    Y (double &f) : foo(f) {
        // do stuff for y
    }
};

class Z : public foo {
{
public:
    Z (double &f) : foo(f) {
        // do stuff for z
    }
};

main(){

    X x=1;Y y=1;Z z=1;

}

または、列挙型を使用できます

class foo{
public:
    enum Mode{
        Mode_X,
        Mode_Y,
        Mode_Z
    };
    Mode mode;

    double a, b, c;
    double fn, val;

    // set a,b, and c
    void set(){
        a=1;
        b=1;
        c=1;
    }

    foo(Mode m, double &f) : mode(m) {
        set();

        switch(mode) {
        case Mode_X:
            // what I want to do here is say if "name of variable f" = "x", then do something
            break;
        case Mode_Y:
            // else if "name of variable f" = "y", do something else
            break;

        case Mode_Z:
            // else if "name of variable f" = "z", do something else
            break;
        }
    }
};

main(){

    foo x(foo::Mode_X,1), y(foo::Mode_Y,1), z(foo::Mode_Z,1);

}

次のように、列挙型バージョンでプリプロセッサを使用して、変数宣言を最初に求めていたものに近づけることができます。

#define X(value) x(foo::Mode_X,(value))
#define Y(value) y(foo::Mode_Y,(value))
#define Z(value) z(foo::Mode_Z,(value))

main(){
    foo X(1), Y(1), Z(1);
}

私を含め、多くの人は、このようなプリプロセッサを使用しないようにアドバイスします。私はそれが可能であると言っているだけです。

于 2012-11-18T03:35:36.490 に答える
0

コメントで、偏微分を行うクラスを作成していると述べています。推奨される出発点は次のとおりです。

class Differentiator{
public:
    double a, b, c;
    double fn, val;
    void differentiateByX(double &f);
    void differentiateByY(double &f);
    void differentiateByZ(double &f);

    Differentiator(): a(1), b(1), c(1)
    {} // Note the syntax above for initializing members.
};

役に立つと思われる場合は、微分関数の戻り値の型を自由に変更するか、できるようにメンバーを追加してください。

main(){
    Differentiator foo;
    foo.differentiateByX(1);
    // do something with the result
    foo.differentiateByY(2);
    // etc.
}

常に X、Y、Z で微分したいことがわかっている場合はDifferentiator、単一の関数で 3 つすべてdifferentiate(double &x, double &y, double &z)を実行するか、コンストラクターですべての作業を行うことに戻ることができます。Differentiator foo(x, y, z);

于 2012-11-18T06:11:43.567 に答える
0

あなたがやろうとしていることは、リフレクションと呼ばれます (ウィキペディア)。C++ はコンパイルされた非管理言語であるため、リフレクションはサポートされていません。

また、コードが C++ でコンパイルされると、コンパイラーは変数名をマングルするため、作成したと思われる変数 (x、y、z) はまったく名前が付けられず、新しい名前には意味がありません。

残念ながら、変数の名前をチェックして達成しようとしている場合、C++ では実行できません。

于 2012-11-18T03:31:14.533 に答える