C ++中的因变量?

时间:2011-07-29 05:26:19

标签: c++ function nested

我之前尝试过询问,但我不是很清楚,所以我重新询问它。

我希望有一个变量取决于另一个变量的值,例如本例中的b:

int main(){
    int a;
    dependent int b=a+1; //I'm just making this up
    a=3;
    cout << b; //prints 4
    a=4;
    cout << b; //prints 5
}

当然,这在C ++中不存在,但这就是我想要的。

所以我试着创建一个函数:

int main(){
    int a;
    int b(){ return a+1; } //error
    a=3;
    cout << b(); //would print 4 if C++ allowed nested functions
    a=4;
    cout << b(); //would print 5 if C++ allowed nested functions
}

上述方法不起作用,因为C ++不允许嵌套函数。

我只能在main()之外创建函数,如下所示:

int b(){
    return a+1; //doesn't work because a is not in scope
}

int main(){
    int a;
    a=3;
    cout << b();
    a=4;
    cout << b();
}

但这不起作用,因为a与b()的范围不同,所以我必须传递一个参数,我不想这样做。

是否有任何技巧可以获得类似于使用C ++工作的因变量?

9 个答案:

答案 0 :(得分:9)

您需要的是closure。如果你可以使用C ++ 0x功能,那么你很幸运。否则,您可以手动定义一个:

#include <iostream>
using namespace std;
struct B
{
    const int & a;

    B(const int & a) : a(a) {}

    // variable syntax (Sean Farell's idea)
    operator int () const { return a + 1; }

    // function syntax
    int operator () () const { return a + 1; }
};
int main()
{
    int a;
    B b(a);
    a = 3;
    cout << b << '\n'; // variable syntax
    a = 4;
    cout << b() << '\n'; // function syntax
}

您也可以在B内定义main,但有些编译器不喜欢它。

C++ 0x lambda语法如下所示:

auto b = [&]() { return a + 1; }

[&]表示lambda通过引用捕获局部变量。

答案 1 :(得分:6)

如果您使用的是C ++ 0x(GCC 4.5 +,Visual C ++ 2010),则可以使用lambdas:

int a = 5;
auto b = [&a]{ return a + 1; };

std::cout << b() << std::endl;

根据你正在做的事情,可能有更清晰的解决方案 - 可能是一些经典“方法的变体,它接受'a'并返回'b'”

答案 2 :(得分:3)

您可以定义一个具有成员a的类,然后定义一个返回值+ 1的函数b()。基本实现类似于:

class Dependent {
public:
    Dependent(void) { m_value = 0; }
    void set(int value) { m_value = value; }
    int b(void) { return(m_value + 1); }
private:
    int m_value;
};


int main(){
    Dependent a;
    a.set(3);
    cout << a.b();
    a.set(4);
    cout << a.b();
}

如果您愿意,可以根据需要添加运算符重载,使其更像普通整数。

答案 3 :(得分:2)

如果你使用lambda函数(c ++ 0x),这是可能的,因为它们可以捕获局部变量。

示例:

int main()
{
  int a;
  auto f = [&] () -> int { return a + 1; };
  a = 3;
  std::cout << f() << std::endl;
  a = 4;
  std::cout << f() << std::endl;
  return 0;
}

结果:

4
5

(见http://ideone.com/MlzX7提供证明)

答案 4 :(得分:2)

一种简单的方法是使用预处理器宏,但没有特定于C ++的具体内容:

#define b ((a)+1)

int main(){
    int a;
    a=3;
    cout << b;
    a=4;
    cout << b;
}

#undef b

答案 5 :(得分:1)

你还可以使用C ++ 0x吗?如果是的话,

int main()
{
    int a = 10;
    auto b = [&a]() -> int { return a + 1; };
    cout << b() << endl;
}

因为它没有用c ++ 0x标记,所以可以使用嵌套类而不是嵌套函数。 Herb sutter的这一专栏将帮助您使用现有的c ++。 http://www.gotw.ca/gotw/058.htm

答案 6 :(得分:0)

  

上述方法不起作用,因为C ++不允许嵌套函数。

您可以使用嵌套结构模拟它。在C ++ 0x中,您可以使用lambda函数,它在函数内提供相同的函数方法。

答案 7 :(得分:0)

定义一个名为LinkedInt的类或行为类似于int的类,但它本身具有一个RelatedTo关系,另一个成员是一个函数指针,指向计算整数值时要求的函数。非常直截了当。如果你需要关于编码的一些指示,请告诉我。

简短的回答是,OOP足以掩盖这个问题。

答案 8 :(得分:0)

  

我想要一个取决于另一个值的变量   变量,如本例中的b:

我看到你只需要一个参考变量:

int a;
int &b =a;
a=10;
cout << b; // 10

为什么C ++ 0x lambdas会为此而来,我不明白。