2017-10-22 14 views
-1

私は、うまく動作するsongというクラスを持っています。今は、曲のセットとそれに関連するメソッドを保持するSongLibraryというクラスを作成しようとしています。私はそれを動作させるのに問題があります。オブジェクトのセットを保持するC++クラス

私はセットを初期化するときに問題があると感じます。私はコンストラクタに何を入れるべきかはかなり分かりません。メインで

SongLibrary.h

#pragma once 
#include <iostream> 
#include <string> 
#include <ostream> 
#include <set> 
#include "Song.h" 

using std::string; 
using std::cout; 
using std::endl; 
using std::ostream; 
using std::istream; 
using std::set; 

class SongLibrary 
{ 
private: 
    set<Song> m_songs; 
public: 
    SongLibrary(); 

#pragma region Getters 

    set<Song> getSongs(); 
#pragma endregion 

#pragma region Setters 

    void setSongs(set<Song> songs); 

#pragma endregion 

#pragma region methods 
    void displaySongs(); 
    void addSong(Song song); 

SongLibrary.cpp

#include "stdafx.h" 
#include "SongLibrary.h" 

SongLibrary::SongLibrary() 
{ 
    m_songs; 
} 

set<Song> SongLibrary::getSongs() 
{ 
    return m_songs; 
} 

void SongLibrary::setSongs(set<Song> songs) 
{ 
    m_songs = songs; 
} 

void SongLibrary::displaySongs() 
{ 
    for (Song song : m_songs) 
    { 
     song.display(); 
    } 
} 

void SongLibrary::addSong(Song song) 
{ 
    m_songs.insert(song); 
} 

私はちょうど曲のインスタンスを作成し、曲を使用して、それにいくつかの曲のオブジェクトを追加します。 addSong()メソッド。次に、表示方法を知らないように表示しようとします。

Iは、現時点で取得していますエラーが ある「バイナリ 『<』:なしオペレータは、タイプ 『CONSTソング』の左オペランドをとる(または全く許容される変換は存在しない)が見つかりません」

+4

'std :: set'は要素をソートするので、クラスに比較演算子のオーバーロードが必要です。 – UnholySheep

+0

ありがとう、私は完全にそれが意味するが、今それを見て何を確認していない。 –

+0

単純な 'std :: vector'を使わないのはなぜですか? – Jepessen

答えて

3

A set<Song>は、独自のコンストラクタを使用して自身を空のセットに初期化するため、SongLibraryコンストラクタは何もする必要はありません。

operator<で表示されている問題は、各セットにはSongの1つのオブジェクトしか保存されていないということです。そうするためには、2曲を比較して、同じかどうかを確認する必要があります。したがって、Songクラスは比較演算子を持つことを期待しています

bool operator<(const Song& Left, const Song& Right); 

2つの曲を比較します。

set<Song>の代わりに、同じ曲が複数回出現し、曲が特定の順序である必要がない場合は気にしない再生リストをvector<Song>としてもよい。

関連する問題