2016-09-26 9 views
-3

Не указывайте ответ, содержащий вектор!указатели на объекты, созданные

У меня очень плохое понимание указателей, и каждый учебник, который я исследую, только смущает меня больше.

В настоящее время моя программа может принимать команду, которая является «вставить». Затем он будет читать строки для имени, url и comment, double для длины и int для рейтинга. Затем он будет создавать объект.

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

Как я:

создать указатель на объект, который создается в основной?

передать указатель на объект, созданный в качестве аргумента, в функции, созданные и определенные в классе vlist?

Вот мой код

main.cpp

#include <iostream> 
#include <string> 
#include "vlist.h" 
using namespace std; 
#include "video.h" 

int main(){ 
    string command; 
    string comment, url, name; // first three getlines 
    double length; // The length for the movie 
    int rating; 

    while (getline(cin,command)){ 
    if (command == "insert"){ 
     getline(cin, name); 
     getline(cin, url); 
     getline(cin, comment); 
     cin >> length; 
     cin >> rating; 
     cin.ignore(); 

     //Video *vid 
     Video = new Video(name, url, comment, length, rating); 

     List list; 
     list.insert(); 
    }} 
    return 0; 
} 

video.h

#ifndef VIDEO_H 
#define VIDEO_H 
#include<iostream> 
#include<string> 
using namespace std; 

class Video{ 

    public: 
    Video(string name, string url, string comment, 
       double length, int rating); 
    void print(); 
    private: 
    string m_comment; 
    string m_url; 
    string m_name; 
    double m_length; 
    int m_rating; 
}; 
void list_length(Video *video[], int num_vids); 
#endif 

video.cpp

#include<iostream> 
#include "video.h" 
using namespace std; 

Video :: Video (string name, string url, string comment, 
       double length, int rating){ 
    m_comment = comment; 
    m_url = url; 
    m_name = name; 
    m_length = length; 
    m_rating = rating; 
} 
void Video :: print(){ 
    cout << m_name << ", " << m_url << ", " << m_comment << ", " 
    << m_length << ", "; 
for(int count = 0; count < m_rating; ++count){ 
    cout << "*"; 
    } 
cout << endl; 
} 

vlist.h

#ifndef VLIST_H 
#define VLIST_H 
#include<iostream> 
#include<string> 
using namespace std; 

class List{ 
    public: 
     List(); 
     void insert (Video *video); 
    private: 
     class Node{ 
      public: 
       Node(string name, string url, string comment, 
         double length, int rating, Node *next){ 
        m_name = name; 
        m_url = url; 
        m_comment = comment; 
        m_length = length; 
        m_rating = rating; 
        m_next = next; 
        } 
      string m_name, m_url, m_comment; 
      double m_length; 
      int m_rating; 
      Node *m_next; 
      }; 
      Node *m_head; 
}; 
#endif 

vlist.cpp

#include<iostream> 
#include<string> 
#include "vlist.h" 
using namespace std; 
List :: List(){ 
    m_head = NULL; 
} 
void List :: insert(Video *video){ 

    m_head = new Node (name, url, comment, length, rating, m_head); 
} 

ответ

0

Вы спутали, что Node есть. Вы выразили, что вы хотите сохранить исходный указатель, как это (обратите внимание на некоторые перестановки - опустить ненужный материал, чтобы сделать его более ясным):

List list; 
while(...) 
{ 
    if(...) 
    { 
     Video video = new Video(name, url, comment, length, rating); 
     list.insert(video); 
    } 
} 

Чтобы сделать этот костюм ваших очевидных намерений, ваш Node класс должен хранить Video указатель вместо того, чтобы дублировать информацию из Video класса:

class Node 
{ 
public: 
    Node(Video *video, Node *next) 
     : m_video(video) 
     , m_next(next) 
    { 
    } 

    Video *m_video; 
    Node *m_next; 
}; 

Это делает вставку списка, как легко, как это:

void List::insert(Video *video) 
{ 
    m_head = new Node(video, m_head); 
} 

Теперь вы можете добавить что-то простое в список как print функции:

void List::print() 
{ 
    for(Node *node = m_head; node != nullptr; node = node->m_next) 
    { 
     Video *video = node->m_video; 
     if(video != nullptr) 
     { 
      video->print(); 
     } 
    } 
} 
+0

Я не уверен, что вы имеете в виду, что я попробовал, и я мог бы иметь неправильное представление о том, что вы говорите. – Badlittlepiggy

+0

Какую часть вы не понимаете? Какую часть вы попробовали? – paddy

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

  • Нет связанных вопросов^_^