2016-02-17 3 views
0

Это мой первый пост, так голый со мной!Возникли проблемы с доступом к массиву объектов с помощью указателей

Я работаю над программой, которая содержит класс фильма, в котором есть заголовок, критика и аудитория. У меня есть статический массив, и я создаю функцию PrintMovies, которая выведет массив фильмов в красивую таблицу. У меня возникли проблемы с доступом к другим элементам, кроме первого элемента массива, который нужно распечатать в таблице.

Любая помощь очень ценится!

Вот то, что я до сих пор:

#include <iostream> 
#include <string> 
#include <iomanip> 

using std::cout; 
using std::endl; 
using std::string; 
using std::setw; 

struct Movie { 
    std::string title; 
    int criticRating; // from 0 to 100 
    int audienceRating; // from 0 to 100 

    Movie(string t, int c, int a) { 
     title = t; 
     criticRating = c; 
     audienceRating = a; 
    } 

    Movie() {      // Default constructor 
     title = "DEFAULT TITLE"; 
     criticRating = 0; 
     audienceRating = 0; 
    } 


}; 

void PrintMovies(Movie* movies, int numMovies) { 

    cout << "Movies" << endl; 
    cout << "Critic Audience Title" << endl; 
    for (int i = 0; i < numMovies; i++) { 
     cout << setw(6) << (movies->criticRating) << setw(12) << (movies->audienceRating) << " " << (movies->title) << endl; 
    } 

} 

int main() { 

    Movie TenMovies[10] = { Movie("Star Wars: Episode VII - The Force Awakens",92,90), 
     Movie("Deadpool",83,95), Movie("Donnie Darko",85,80), 
     Movie("2001: A Space Odyssey",96,89), Movie("Spaceballs",54,83), 
     Movie("The Matrix",87,85), Movie("Inception",86,91), 
     Movie("The Martian",92,92), Movie("Toy Story",100,92), 
     Movie("Monty Python and the Holy Grail",97,95) }; 

    PrintMovies(TenMovies, 10); 

} 

ответ

0

Лучший способ подумать об этом как строка стиля c.

Если вы хотите напечатать индивидуальный характер, вы могли бы сделать что-то вроде этого -

char *myStr = "Hello world!"; 
std::cout << myStr[1] << std::endl; 

Вы уже догадались, что бы напечатать «е», так как «е» имеет индекс 1.

Теперь, что произойдет, если вы говорите это (обратите внимание на разыменовываются *) -

std::cout << *myStr << std::endl;

что бы напечатать 'H'. Это потому, что H находится в начале массива, и всякий раз, когда вы создаете новый массив, адрес этого массива/указателя имеет первый элемент.

Проверьте это -

0x4050e0 H 
0x4050e1 e 
0x4050e2 l 
0x4050e3 l 
0x4050e4 o 
0x4050e5 
0x4050e6 w 
0x4050e7 o 
0x4050e8 r 
0x4050e9 l 
0x4050ea d 
0x4050eb ! 
0x4050ec 

Это пример того, что строка может выглядеть в памяти по разным адресам.

Адрес myStr: 0x4050e0, то же, что и H! Если вы скажете myStr ++, который переместит адрес в e или 0x4050e1. Пример -

char *myStr = "Hello world!"; 
myStr++; 
std::cout << myStr << std::endl; 

Это будет печатать "Элло мир!" вместо «Hello world!», так как мы увеличили указатель. Указатели указывают на местоположения (или адреса) в памяти, поэтому для увеличения один перемещает вас на следующий адрес.

С учетом этого существует несколько способов сделать это.

Один, как доступ отдельных символов в строке с стилем, используя переменный цикл я как индекс массива:

for (int i = 0; i < numMovies; i++) { 
    cout << setw(6) << (movies[i].criticRating) << setw(12) << (movies[i].audienceRating) << " " << (movies[i].title) << endl; 
} 

В противном случае вы могли бы сделать это так, и это позволяет понять, почему указатели так называемые указатели:

for (int i = 0; i < numMovies; i++) { 
    cout << setw(6) << (movies->criticRating) << setw(12) << (movies->audienceRating) << " " << (movies->title) << endl; 

    //Increment movies' address to the next Movie in memory. 
    movies++; 
} 
0

Для доступа к полю «criticRating» в пункте #i массива объектов «кино», используйте следующий синтаксис:

movies[i].criticRating 
0
cout << setw(6) << ((*(movies + i)).criticRating) << setw(12) << ((*(movies + i)).audienceRating) << " " << ((*(movies + i)).title) << endl;**You are using array for not travesring with array of Movies use this syntax** 
+0

Wow! Спасибо вам, ребята, за все быстрые ответы! Я думаю, что некоторые вещи, которые я пытался раньше, не имели правильных круглых скобок ... Я должен был проверить множество этих решений, и все они отлично работали!Еще раз спасибо –

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