在std列表中查找对象并将其添加到另一个列表中

时间:2016-05-27 21:41:18

标签: c++ list casting

我正在尝试创建一个书店管理系统,允许我将以前创建的作者添加到数据库,创建书籍,然后将作者从数据库(这是一个std :: list)分配给一本书。 FindAdd函数应该迭代数据库中的作者列表并在其中查找给定对象(临时作者),然后将此对象添加到书籍的作者列表中。

我正在尝试将迭代器强制转换为一个对象,所以我可以添加作者,但是这行不允许我编译这个程序(没有匹配函数来调用Book :: AddAuthor(作者) *))。我试了没有铸造,但当然它不会起作用。我怎样才能解决这个问题?或者也许有一种更简单的方法来完成我在这里尝试做的事情?

class Author
{
private:
    string name, lname;
public:
    bool operator==(const Author & a) const
    {
        bool test=false;
        if(!(this->name.compare(a.name) && this->lname.compare(a.lname)))
            test=true;
        return test;
    }
    Author(string namex, string lnamex)
    {
        name=namex;
        lname = lnamex;
    }
};
class Book
{
public:
    list <Author> Authorzy;
    string tytul;

    void AddAuthor(Author & x)
    {
        Authorzy.push_back(x);
    }
    Book(string tytulx)
    {
        tytul = tytulx;
    }
};

class Database
{
    protected:
    list <Author> authors;
    public:
    void AddAuthor(Author x)
    {
    authors.push_back(x);
    }
    list <Author> getAuthors
    {
    return authors;
    }
};

void FindAdd(Author & x, Book &y, Database & db)
{
  list <Author>:: iterator xx;
        xx = find(db.getAuthors().begin(), db.getAuthors().end(), x);
        if (xx != db.getAuthors().end())
        y.AddAuthor(&*xx);
        else cout << "Author not found";
}

int main(){
Author testauthor("test", "test");
Database testdb;
testdb.AddAuthor(testauthor);
Book testbook("Mainbook");
FindAdd(Author notfound("Another", "Guy"), testbook, testdb);
FindAdd(testauthor, testbook, testdb);
}

1 个答案:

答案 0 :(得分:1)

AddAuthor只需要Book参考,所以你不需要做任何奇特的事情:

if (xx != db.getAuthors().end()) {
    y.AddAuthor(*xx); // Just dereference the iterator and pass it 
                      // in, c++ takes care of the rest
} else {
    cout << "Author not found";
}