2015-02-11 4 views
-2

Не могли бы вы объяснить, как принести значение из переменной в одну функцию в другую функцию. Я знаю, что как только функция завершит это значение переменной, функция будет очищена. Но как я могу сказать это не делать этого.Как передать значение переменной из одной функции в другую?

Я пытаюсь привести значение int ppl; от функции кандидатов в функцию голосов. Но, как вы можете видеть, это не будет сделано само по себе.

void candidates() 
{   
    int ppl; 
    cout << "Hello please how many candidates are there?: "; 
    std::cin >> ppl; 
    string *cans = new string[ppl]; 
    for (int i = 0; i < ppl; i++) 
    { 
     cout << "Please type in the last name of candidate number: " << i + 1 << endl; 
     cin >> cans[i];cout << endl << endl; 
    } 

    for (int a = 0; a < ppl; a++) 
    { 
     cout << cans[a] << endl << endl; 
    } 
} 

void votes() 
{    
    int *vote = new int[ppl]; 

    // ... 
} 
+0

Посмотрите на возвращаемые значения и ссылочные переменные. [Этот сайт должен много помогать, пока вы учитесь!] (Http://www.learncpp.com/) – Conduit

+1

Вы должны посмотреть, как передать ** аргументы ** на функции и использовать ** return ** значения. – CoryKramer

+0

'void candidates (int & ppl)' и 'void votes (int const ppl)' – 101010

ответ

0

Использование return:

int candidates() 
{ 
    int ppl; 
    std::cin >> ppl; 
    ... 
    return ppl; 
} 

кандидатов() в настоящее время получает int так что теперь вы можете сделать это:

void votes() 
{ 
    int *vote = new int[candidates()]; 
} 

Вы также можете использовать глобальные переменные, или передать переменную ppl как int& для функции candidates() как аргумент, поэтому ppl необходимо было создать (скажем, в основной функции), поэтому он доступен для каждой функции, которая вам нужна.

1

Узор вы хотите, вероятно:

std::vector<string> gather_data() {...} 

void use_data(std::vector<string> data) { ... } 

И тогда вы можете сделать:

auto data = gather_data(); 
use_data(data); 

Было бы лучше практика, чтобы убедиться, что use_data не может изменить свой аргумент, и что этот аргумент передается по ссылке. Итак:

void use_data(const std::vector<string>& data) { ... } 

Более продвинутая модель будет использовать класс:

class Foo { 
    std::vector<string> data; 
public: 
    void gather() {...} 
    void use() {...} 
} 

Foo myFoo; 
myFoo.gather(); 
myFoo.use(); 

В этом случае вы можете увидеть, что методы экземпляра Foo «s имеют доступ к его data.

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

Однако, если вы задаете вопрос на этом базовом уровне, это означает, что вам нужно read a book.

Вы найдете нецелесообразным попытаться узнать, что является одним из самых сложных языков, просто задавая вопросы. Каждый ответ поднимет еще 10 вопросов.

+0

Почему бы вам не использовать указатели на указатели 'string'? – juanchopanza

+0

@juanchopanza: исправлено. Основной вопрос, который я пытаюсь решить, заключается в том, что независимо от ответа, это будет иметь мало значения. Существует более непосредственная проблема, чем * «непонимание параметров» *, а именно * «отсутствие структурированного подхода к обучению» *. –

Смежные вопросы