你不能做你在问题中要求的事情,有几种方法可以做类似的事情。
您可以使用继承。
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);
}
包括我自己在内的许多人都建议不要使用这样的预处理器。我只是说这是可能的。