2015-04-24 2 views
2

Цель состоит в том, чтобы пользователь вводил некоторую информацию о фильме для двух фильмов.
Затем две функции выводят данные фильмов
Проблема заключается в том, что я пытаюсь использовать функции вне операторов if, которые они не могут быть добавлены больше.C++ stucts не могут быть доступны за пределами оператора if

#include <iostream> 
#include <string> 
using namespace std; 

struct MovieData // the stuct 
{ 
    string Title, // required varibles 
     Director; 
    int yearReleased, 
     runTime; 

    MovieData(string TITLE, string DIRECTOR, int YearReleased, int RunTime) // constructors 
    { 
     Title = TITLE; 
     Director = DIRECTOR; 
     yearReleased = YearReleased; 
     runTime = RunTime; 
    } 
    string getTitle() // getters 
    { return Title; } 
    string getDirector() 
    { return Director; } 
    int getYear() 
    { return yearReleased; } 
    int getLength() 
    { return runTime; } 
}; 

void printMovie1(MovieData movieprint1) // fucntion that outputs movie 1 
{ 
    cout << "Title of movie " << movieprint1.getTitle() << endl; 
    cout << "Director is " << movieprint1.getDirector()<< endl; 
    cout << "Movie release year " << movieprint1.getYear()<< endl; 
    cout << "Movie length " << movieprint1.getLength() << endl; 
} 

void printMovie2(MovieData movieprint2) // function that outputs movie 2 
{ 
    cout << "Title of movie " << movieprint2.getTitle() << endl; 
    cout << "Director is " << movieprint2.getDirector() << endl; 
    cout << "Movie release year " << movieprint2.getYear() << endl; 
    cout << "Movie length " << movieprint2.getLength() << endl; 
} 

int main() 
{ 
    string Title, // local varibles 
     Director; 
    int yearReleased, 
     runTime; 

    for (int i = 0; i < 2; i++) // forward loop to enter movie info 
    { 
     cout << "Please enter the movie " << (i + 1) << " title "; 
     getline(cin, Title); 

     cout << "Now the director "; 
     getline(cin, Director); 

     cout << "What year was " << Title << " releasted "; 
     cin >> yearReleased; 

     cout << "Lastly the length "; 
     cin >> runTime; 
     cin.ignore(); 

     if (i == 0) 
     { 
      MovieData movie1(Title, Director, yearReleased, runTime); 
      // I know function works when placed here 
      // printMovie1(movie1); 
     } 
     else if (i == 1) 
     { 
      MovieData movie2(Title, Director, yearReleased, runTime); 
     // I know function works when placed here 
      // printMovie2(movie2); 
     } 
    } 
    // these functions now dont work 
    enter code hereprintMovie1(movie1); 
    printMovie2(movie2); 
    return 0; 
} 
+4

Переменные 'movie1' и' movie2' объявляются в области блока if. Если вы хотите использовать их снаружи, объявите их снаружи. – jsantander

ответ

0

Вы имеете вопрос с области действия Когда вы пишете:

if (i == 0) 
     { 
      MovieData movie1(Title, Director, yearReleased, runTime); 
      // movie1 starts living 

     } // Aaand he's dead. 

Ваш movie1 живет только внутри thoses скобки. Именно поэтому вы должны объявить movie1 в том же объеме, который вы хотите распечатать.

Другое дело, так как это c++, попробуйте глядя, как class работа, я думаю, что в вашей общей Approch проблемы class бы сделать гораздо лучше работать, чем struct.

И, кстати, почему бы не поставить функцию printMovie1() внутри вашей структуры?

О, и вам не нужна функция печати 2, так как они выполняют ту же работу.

Попробуйте, например, назвать:

printMovie1(movie1); 
printMovie1(movie2); 

См? это будет тот же результат. Продолжайте работать, вы приближаетесь к хорошему!

+2

Я согласен с тем, что «класс» подойдет ему лучше (просто концептуально), но на самом деле нет никакой разницы между «классом» и «структурой», кроме того, что прежние дефолты его членов являются «частными», а последние значения по умолчанию его члены в 'public' – Kvothe

+0

@ Kvothe Я сказал, что только потому, что он объявил геттеры своей структуре, таким образом, мое отражение. Но да, спасибо за разъяснение разницы в сфере возможностей между классом и структурой! – Mekap

+1

Не забудьте прокомментировать, когда вы используете downvote, если вы думаете, что в моем ответе есть вещи, которые нужно улучшить – Mekap

0

Это связано с scope объектов. Вы объявили оба объекта внутри своих операторов if. Проще говоря, объект всегда существует только внутри немедленном блока (думаю { и }), что он объявлен в

В вашем случае:.

if (i == 0) 
    { 
     MovieData movie1(Title, Director, yearReleased, runTime); 
     //movie1 exists only inside this if statement. 
    } 
    //no movie1 from here on 

Так лет должен сделать что-то вроде:

MovieData movie1; 

if (i == 0) 
    { 
     movie1 = MovieData(Title, Director, yearReleased, runTime); 

    } 
//movie1 is accessible here. yay 
0

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

MovieData movie; //default construction 
    if (i == 0) 
    { 
     movie = MovieData(Title, Director, yearReleased, runTime); 
     // I know function works when placed here 
     // printMovie1(movie1); 
    } 
    else if (i == 1) 
    { 
     movie= MovieData(Title, Director, yearReleased, runTime); 
    // I know function works when placed here 
     // printMovie2(movie2); 

    } 
    //you can now use movie 
-2

C/C++ использует блок-локальные переменные. Ради интереса, это не универсально среди языков программирования; R и JavaScript - заметные языки, которые используют функционально-локальные переменные. Другими словами, в R и JavaScript, когда вы объявляете (в JavaScript) или назначаете (в R) локальную переменную, она становится частью «объекта активации» функции (в JavaScript) или «среды оценки» (в R). Впоследствии он может быть доступен из любой точки внутри функции, даже вне области объявления/назначения, которые его создали.

Поскольку вы используете C++, вы должны быть осторожны в своих блоках. Вы не можете объявить переменную внутри блока, а затем получить доступ к ней за пределами блока. Это обеспечивается компилятором.Таким образом, чтобы решить вашу проблему, вы должны перенести свои объявления movie1 и movie2 из сильно вложенных блоков и в самый внешний блок, внутри которого будут доступны эти переменные. Вам нужно будет определить нулевой конструктор и метод присваивания, чтобы это могло работать (поскольку вам нужно разветвляться по назначению) или, альтернативно, вы можете выделить динамически (т.е. с new) внутри if-ветвей, и в этом случае вы бы назвали конструктор в то время.

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