C++ 使用多个类和链接列表

C++ 使用多个类和链接列表,c++,class,linked-list,C++,Class,Linked List,目前,我正在尝试使用多个类,每个类都有自己的.cpp和header.h文件,并使用main.cpp链接它们。我想创建一个临时的新视频对象指针,传入参数,将其插入链表,然后删除临时指针。之后,我需要打印列表中的每个节点 目前有4个文件:main.cpp、vlist.cpp、vlist.h、video.cpp和video.h 我使用vlist作为一种构造链表的方法,该链表通过vlist.cpp文件中定义的insert函数在视频对象指针中传递。 第一个问题是,我不确定我做得是否正确。目前,我要做的就是

目前,我正在尝试使用多个类,每个类都有自己的.cpp和header.h文件,并使用main.cpp链接它们。我想创建一个临时的新视频对象指针,传入参数,将其插入链表,然后删除临时指针。之后,我需要打印列表中的每个节点

目前有4个文件:main.cpp、vlist.cpp、vlist.h、video.cpp和video.h

我使用vlist作为一种构造链表的方法,该链表通过vlist.cpp文件中定义的insert函数在视频对象指针中传递。 第一个问题是,我不确定我做得是否正确。目前,我要做的就是在另一个类中传递一个视频对象,就是在vlist.h文件中包含video.h

第二个问题是,我无法确定如何正确访问每个节点中的各个视频对象属性,因为在video.h中定义的getter函数无法工作。它们似乎返回的是地址而不是值。然而,每当我试图解决这个问题时,它告诉我不能像这样使用getter函数

我的第三个也是最后一个问题是,在vlist.cpp中,在创建新节点时,我不能传入m_vid,但可以传入m_head。如果我不在vlist.h中使用myVid作为公开声明的视频对象指针,它将无法编译

文件如下:

main.cpp

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

int main()
{
    //Create temporary video object pointer using Video * temp = new Video(arguments);
    //Pass in the temp video pointer to the list and insert it with VList function

    string firstLine, secondLine, thirdLine = "";
    float fourthLine = 1.1;
    int fifthLine = 2;
    
    VList list;
    
    Video * tempVid = new Video(firstLine, secondLine, thirdLine, fourthLine, fifthLine);
    list.insert(tempVid);
    delete tempVid;
    list.print();
    return 0;
}
第一个问题是,我不确定我做得是否正确。 目前,我所做的一切都是为了能够传入一个视频对象 另一个类是在vlist.h文件中包含video.h

不,您的操作不正确,在文件main.cpp中,您正在创建指向Video的指针,即Video*并将其传递给void VList::insertVideo*myVid函数,在下一行,您将在打印之前删除指针。请记住,当您创建指针并将其传递给一个方法时,它的生命周期不是像魔术一样自动管理的,您自己需要管理指针,这也是初学者面临的最常见的问题,我也是。所以这个问题有两种解决方法

第一次修复 不删除main中的指针,因为它在VList的析构函数中被删除

第二次修复 从C++11开始,您可能希望使用称为智能指针的东西—这些是标准化的!请参阅std::unique_ptr和std::shared_ptr。它们将自动删除指针,并保证没有内存泄漏

第二个问题是,我不知道如何正确访问 每个节点中的单个视频对象属性,因为我的getter video.h中定义的函数不起作用

您的第二个问题与第一个问题有关,因为您在使用指针之前正在删除它,这会导致未定义的行为,并且您可能得到的输出就像一个垃圾。不是吗


为了简单起见,我建议使用简单的视频参考,而不是指针。通过价值传递它们,你所有的问题都会消失。

来回答我自己的问题和任何可能看到这一点的人的问题。我只需要改变一下,在print中设置一个temp对象指针,并在上面设置一个get函数。已经很晚了,如果有任何错误,我道歉。我确实得到了一个像我想的那样的地址


我知道,我也有一个用于vlist类的解构器,但我不确定我是否正确使用了它。到目前为止,我的其他问题是否有解决方案?我不确定我的getter函数是否会那样工作。对于getter函数,有什么需要更改的吗?如何使用视频引用?@Jaskal它应该可以工作,因为以前您是从未定义行为的已删除指针调用这些函数,现在您是从存在的有效指针调用。
#include "video.h"
#include <iostream>

using namespace std;

Video::Video(string title, string URL, string comment, float length, int rating) {
    vidTitle = title;
    vidURL = URL;
    vidComment = comment;
    vidLength = length;
    vidRating = rating;
}

void Video::print(Video *myVid) {
    cout << myVid->getTitle() << endl;
}
#ifndef VIDEO_H
#define VIDEO_H

#include <string>
#include <iostream>

using namespace std;

class Video
{
    public:
        Video(string title, string URL, string comment, float length, int rating);
        int getRating() {
            return vidRating;
        }
        float getLength() {
            return vidLength;
        }
        string getTitle() {
            return vidTitle;
        }
        string getURL() {
            return vidURL;
        }
        string getComment() {
            return vidComment;
        }
        void print(Video *myVid);
    private:
        string vidTitle, vidURL, vidComment, vidPreference;
        float vidLength;
        int vidRating;
};

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


VList::VList() {
    m_head = NULL;
}

VList::~VList() {
    Node *ptr = m_head;
    while (ptr != NULL) {
        Node *temp;
    
        temp = ptr;
        ptr = ptr->m_next;
        delete temp;
    }
}

void VList::insert(Video *myVid) {
    m_head = new Node(myVid, m_head);
}

void VList::print() {
    Node *ptr = m_head; 
    while (ptr != NULL) {
        cout << ptr->m_vid->getTitle();
        ptr = ptr->m_next;
    }
}
#ifndef VLIST_H
#define VLIST_H
#include "video.h"

class VList
{
    public:
        VList();
        ~VList();
        void insert(Video *myVid);
        void print();
        Video *myVid;
        
    private:
        class Node
        {
            public:
                Node(Video *myVid, Node *next) {    
                    m_vid = myVid; 
                    m_next = next;
                }
                Video *m_vid;
                Node *m_next;
        };
        Node *m_head;   
};

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

int main()
{
    //Create temporary video object pointer using Video * temp = new Video(arguments);
    //Pass in the temp video pointer to the list and insert it with VList function

    string firstLine, secondLine, thirdLine = "";
    float fourthLine = 1.1;
    int fifthLine = 2;

    VList list;

    Video * tempVid = new Video(firstLine, secondLine, thirdLine, fourthLine, fifthLine);
    list.insert(tempVid);
    // delete tempVid; // don't delete this pointer right here, since I've found that you are deleting the pointer in the destructor of VList
    list.print();
    return 0;
}
void VList::print() {
    Node *ptr = m_head; 
    while (ptr != NULL) {
        Video *tempPtr = ptr->m_vid;
        cout << tempPtr->getTitle() << endl;
        ptr = ptr->m_next;
    }
}