Зависимые переменные в C ++? - PullRequest
7 голосов
/ 29 июля 2011

Я пытался спросить раньше, но я не очень ясно, поэтому я переспрашиваю.

Я хочу иметь переменную, которая зависит от значения другой переменной, например, 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 (), поэтому мне придется передать a в качестве параметра, и я не хочу этого делать.

Есть ли какие-нибудь хитрости, чтобы получить что-то похожее на зависимую переменную, работающую в C ++?

Ответы [ 9 ]

9 голосов
/ 29 июля 2011

Что вам нужно, это замыкание .Если вы можете использовать функции 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 лямбдаСинтаксис выглядит следующим образом:

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

[&] означает, что лямбда-выражение захватывает локальные переменные по ссылке.

6 голосов
/ 29 июля 2011

Если вы используете C ++ 0x (GCC 4.5+, Visual C ++ 2010), вы можете использовать лямбда-выражения:

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

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

В зависимости от того, что вы делаете, хотя, возможно, есть более чистыерешения - возможно, некоторая вариация классического «метода, который принимает« a »и возвращает« b »»

3 голосов
/ 29 июля 2011

Вы можете определить класс, в котором есть член a, а затем функцию b (), которая возвращает значение a + 1.Базовая реализация будет выглядеть примерно так:

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

Вы можете добавить перегрузку операторов, если это необходимо, чтобы она работала больше как обычные целые числа, если вы этого хотите.

2 голосов
/ 29 июля 2011

Простой подход заключается в использовании макросов препроцессора, но в C ++ нет ничего особенного:

#define b ((a)+1)

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

#undef b
2 голосов
/ 29 июля 2011

Это возможно, если вы используете лямбда-функции (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 для доказательства)

1 голос
/ 29 июля 2011

Вы в порядке, используя 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

0 голосов
/ 29 июля 2011

Я хочу иметь переменную, которая зависит от значения другого переменная, как b в этом примере:

Я вижу, вам просто нужна ссылочная переменная:

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

Почему C ++ 0x лямбды приходят для этого, я не понимаю.

0 голосов
/ 29 июля 2011

Определите класс с именем LinkedInt или что-то, что ведет себя как int, но имеет отношение к себе RelatedTo и дополнительный член, который является указателем на функцию для оценки при вычислении целочисленного значения.Довольно просто.Дайте мне знать, если вам нужны некоторые указатели по кодированию.

Краткий ответ: ООП более чем достаточно, чтобы похоронить эту проблему.

0 голосов
/ 29 июля 2011

Выше не работает, потому что C ++ не допускает вложенные функции.

Вы можете смоделировать это, используя вложенную структуру. В C ++ 0x вы можете использовать лямбда-функцию, которая обеспечивает те же средства внутри функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...