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
    }
};

正如您在 main 函数中看到的那样,x、y 和 z 都具有相同的值。我正在尝试编写一个处理这种情况的条件,以及我想出的一种方法来检查变量名。因为我总是想对名为“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用一个函数来做这三个,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 回答