【问题标题】:How to add song to playlist program using classes如何使用类将歌曲添加到播放列表程序
【发布时间】:2014-11-10 02:19:23
【问题描述】:

我正在尝试修复我的“addSongtoPlaylist”功能。截至目前它不起作用,我不确定我的陈述是否在函数中是错误的,但我现在有点卡在那个部分。该程序使用 GUI 从歌曲列表中创建播放列表。我应该能够加载歌曲列表,添加,删除和播放表单中的歌曲。对于该功能,我们将不胜感激。

#include "globals.h"  //some global variables are included here
#include <cstdlib>  //standard c library
#include "mediaItem.h"  //the mediaItem class  (you need to write a class that extends this class)
#include "song.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;


ifstream infile;
song mySong[MAX_SONGS];
int NumberOfSongs;
int myPlaylist[MAX_PLAYLIST];
int PlaylistSize; //counter for size of playlist in array
song *newPlaylist[MAX_PLAYLIST];

bool loadSongList(string filename)
{
    infile.open(filename);
    string tempArtist, tempTitle, tempLocation;
    int i = 0;

    if (infile.fail())
    {
        cout << "The file could not be opened." << endl;
        return false;
    }
    else
    {
        cout << "File opened successfully." << endl;

        infile >> NumberOfSongs;
        infile.ignore(1);

        while (!infile.eof())
        {
            getline(infile, tempArtist);
            getline(infile, tempTitle);
            getline(infile, tempLocation);
            mySong[i].setArtist(tempArtist);
            mySong[i].setTitle(tempTitle);
            mySong[i].setLocation(tempLocation);

            i++;
        }
        infile.close();

        return true;
    }
}

int getNumberOfSongsInSongList()
{
    return NumberOfSongs;
}

string getSongNameFromSongList(int songNum)
{
    string tempArtist, tempTitle;

    tempArtist = mySong[songNum].getArtist();
    tempTitle = mySong[songNum].getTitle();

    return tempArtist + " - " + tempTitle;
}

string getSongNameFromPlaylist(int playlistSpot)
{
    string tempArtist, tempTitle;

    tempArtist = mySong[myPlaylist[playlistSpot]].getArtist();
    tempTitle = mySong[myPlaylist[playlistSpot]].getTitle();

    return tempArtist + " - " + tempTitle;
}

void addSongToPlaylist(int songNum)
{
    mySong[myPlaylist[PlaylistSize]].setArtist(mySong[songNum].getArtist());
    mySong[myPlaylist[PlaylistSize]].setTitle(mySong[songNum].getTitle());
    mySong[myPlaylist[PlaylistSize]].setLocation(mySong[songNum].getLocation());

    mySong[myPlaylist[PlaylistSize]] = mySong[songNum];
    newPlaylist[PlaylistSize] = &mySong[songNum];
    PlaylistSize++;

}

int getNumberOfSongsInPlaylist()
{
    return PlaylistSize;
}

void moveSongDownInPlaylist(int playlistSpot)
{
    int temp;
    if (playlistSpot >= PlaylistSize - 1)
        return;

    temp = myPlaylist[playlistSpot + 1];
    myPlaylist[playlistSpot + 1] = myPlaylist[playlistSpot];
    myPlaylist[playlistSpot] = temp;
}

void removeSongFromPlaylist(int playlistSpot)
{
    for (int i = playlistSpot; i < PlaylistSize; i++)
        moveSongDownInPlaylist(i);

    myPlaylist[PlaylistSize - 1] = 0;
    PlaylistSize--;
}

void clearPlaylist()
{
    for (int i = 0; i < PlaylistSize; i++)
        myPlaylist[i] = 0;

    PlaylistSize = 0;
}

void moveSongUpInPlaylist(int playlistSpot)
{
    int temp;

    if (playlistSpot == 0)
        return;

    temp = myPlaylist[playlistSpot - 1];
    myPlaylist[playlistSpot - 1] = myPlaylist[playlistSpot];
    myPlaylist[playlistSpot] = temp;
}

void playSongFromPlaylist(int playlistSpot)
{
    mySong[myPlaylist[playlistSpot]].playMedia();
}

void pauseSongFromPlaylist(int playlistSpot)
{
    mySong[myPlaylist[playlistSpot]].pauseMedia();
}

void stopSongFromPlaylist(int playlistSpot)
{
    mySong[myPlaylist[playlistSpot]].stopMedia();
}

【问题讨论】:

  • "it's not working" 不是一个有用的声明。 什么不起作用?应该做什么而不是做什么?您是否在编译时或运行时收到任何错误消息?您是否尝试过使用调试器单步执行您的代码? Visual Studio 具有出色的内置调试工具。如果您不知道如何使用它们,现在是学习的时候了。
  • 代码太多,无法解决问题。
  • 它应该将歌曲添加到 GUI 表单窗口中的播放列表中,我的歌曲列表会加载,但是当我选择一首歌曲并尝试按下按钮时没有任何反应。我会收到一条错误消息,提示“对象引用未设置为对象的实例。”
  • 与其创建任意大小的hardset数组,不如使用可以根据需要调整大小的std::vector
  • 我的老师想使用一个类数组,我只是在输入时将 infile 设为全局,因为起初我在其他函数中使用过它。不过这真的不是问题。

标签: c++ visual-studio-2010 file class playlist


【解决方案1】:

我怀疑您的addSongToPlaylist 函数只需将songNum 添加到myPLaylist 的末尾即可。

看起来myPlaylist 应该只是int 的数组而不是int *。注意:此时您正在分配一个指针数组,但没有为指针分配内存。

列表中的每个int 都是引用mySong 中现有条目的歌曲编号。

我的建议:

  • myPlayList 更改为int 数组并修复所有取消引用它的代码(* 无处不在)。
  • addSongToPLaylist 更改为仅将歌曲编号添加到数组的末尾,由(混淆命名)PlayListSize 表示。

如果之后有问题,请询问。

编辑: 由于myPlaylist 必须是song *myPlaylist[MAX_SONGS],您仍然可以执行上述相同操作,但不是将歌曲编号添加到列表末尾,而是在mySong 数组中添加指向歌曲的指针。比如:

void addSongToPlaylist(int songNum)
{
    // TODO: Check PlaylistSize is less than MAX_PLAYLIST
    myPlaylist[PlaylistSize] = &mySong[songNum];
    PlaylistSize++;
}

【讨论】:

  • PlaylistSize 只是数组的大小,不过我会尝试一下。
  • 这就是我的意思 - PlaylistSize 不是数组的大小。 MAX_PLAYLIST 是数组的大小。 PlaylistSize 是您当前使用的阵列数量。我认为它以大写字母开头是使它令人困惑的原因。使它看起来更像一个常量或enum
  • 好的,我明白你的意思了。我按照你的方式尝试了代码,我不再收到错误,但是当我按下表单中的“将歌曲添加到播放列表”按钮时,仍然没有发生任何事情。
  • 表单如何知道用新数据重新显示自己?也许在调试器中单步执行以确认添加正在发生。您确实记得在添加新歌曲时将 PlaylistSize 的值增加 1 吗?
  • 表单知道要显示我们老师为按钮/列表等编写的背景代码。我希望他能向我们解释它,因为我们必须围绕已经创建的东西编写代码,并且它并没有让我们的班级几乎没有任何空间来做不同的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多