使用构造函数初始化类中的指针

时间:2014-12-24 13:53:41

标签: c++ class pointers constructor

我在" album.h"中有一个Album课程。像这样:

#include "song.h

class Album
{
public:
Album(string _id, string _title, string _singer, float _price, vector<Song> _songs) : id(_id), title(_title), singer(_singer), price(_price), songs(_songs), availableAlbums(10) {}
void add_song(Song s){ songs.push_back(s); }
void add_availableAlbums(int added){ availableAlbums += added; }
string get_id(){ return id; }
string get_singer(){return singer;}

private:
string id;
string title;
string singer;
float price;
vector <Song> songs;
int availableAlbums;
};

和&#34; song.h&#34;中的Song课程像这样:

#include "album.h"

class Song
{
public:
Song(string _numOfSong, string _title, string _singer, string _duration, float _price): 
numOfSong(_numOfSong), title(_title), singer(_singer), duration(_duration), price(_price){}

private:
string numOfSong;
string title;
string singer;
string duration;
float price;
Album* album;
};

我们知道每个Song都有一个Album(每个Song都必须指向其Album)我这样做是为每个Album*初始化一个Song error C2061: syntax error : identifier 'Album' error C2065: '_album' : undeclared identifier error C2143: syntax error : missing ';' before '*' error C2614: 'Song' : illegal member initialization: 'album' is not a base or member error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 我在这里遇到了一些错误:

{{1}}

感谢

2 个答案:

答案 0 :(得分:3)

好吧,由于我的声誉,我不能发表评论,而是写了答案

您的Song类有一个构造函数,它指向Album类,因此假设您有以下代码:

Album* album = new Album();
Song song = new Song(album);

在第一行中创建一个新专辑,在第二行中使用最近创建的专辑创建一首新歌。

Album* album1 = song->album; // This is how you can access song's album

但是,请注意,无论何时使用new创建对象,在使用该对象完成释放用于该对象的内存时,都应使用delete关键字。

< p>

因此,您的代码中没有问题,或者至少我找不到任何问题。

答案 1 :(得分:0)

代码是正确的,您只需确保在Album实例的生命周期内存在Song实例。 如果Song::album指针没有被更改,则使用引用可能会更加干净。这意味着album无法在构建后指向另一个专辑。

class Song {
public:
    Song(Album& _album) : album(_album) { }
private:
    Album& album;
}

但是默认Song无法分配operator=。需要重载以检查其他Song的相册是否相同,并且只分配其他属性。

如果Song没有修改Album对象,则可以使用const Album*(或const Album&)作为成员变量类型来强制执行const-correctness。建设论证。

如果Album对象的生命周期未被手动控制,则可以使用std::shared_ptr<Album>