Créer des shared_ptr de référence

Je suis en nouvelle C++ et c'coutures comme une question de noob, mais je n'étais pas en mesure de le résoudre avec d'autres ressources sur internet.

Je suis en train de créer un shared_ptr à partir d'une référence. J'ai suivantes Book classe:

#include <memory>
#include "Author.hpp"

class Book
{
   public:
      void setAuthor(const Author& t_author);

   private:
      std::shared_ptr<Author> m_author;
}

Et c'est mon Author classe:

#include <memory>
class Book;

class Author
{
   public:
      void addBook(const Book& t_book);

   private:
      std::vector<std::weak_ptr<Book>> m_books;
}

J'ai fatigué de mettre en œuvre la Book::setAuthor méthode comme suit:

void Book::setAuthor(const Author& t_author)
{
   m_author = std::shared_ptr<Author>(&t_author);
}

Mais si j'essaie de compiler ce que j'obtiens:

Invalid conversion de const Auteur* Auteur*

Invalid conversion de sizeof à const Auteur

Pouvez-vous me dire quel est le problème avec mon code? J'ai aussi essayé la même chose avec le weak mais cela ne fonctionne pas non plus.

Je pense que vous devriez utiliser std::vector<Book> et std::vector<Author>. Pas de pointeur, pas de std::shared_ptr, pas de std::weak_ptr. Gérer la relation entre les livres et les auteurs dans un relationnel de la base de données; c'est ce qu'ils sont pour. Traiter le std::vector<Book> et std::vector<Author> objets que temporairement besoin de résultats de requêtes de base de données.
Vous avez raison et je veux aussi cela, mais je voudrais utiliser un ORM bibliothèque et là, j'ai utiliser vectors de shared_ptr pour représenter plusieurs les relations. Ou est-il un autre moyen pour le faire?
Eh bien, pourquoi utiliser une bibliothèque si il vous oblige à utiliser un défaut de conception? L'ORM n'est pas un but en soi.
Ok merci je vais y réfléchir. Mais ai-je le droit que je dois utiliser std::vector<Book*> ensuite parce que les classes (en-têtes), dépendants les uns des autres et que je dois utiliser avant la déclaration d'une classe (ici Book)?
Oui, si Book contient un std::vector<Author> et un Author contient un std::vector<Book>, alors vous auriez une récursion infinie, de sorte qu'il n'est pas possible. Je pense que d'une question importante n'a pas été posée: Quelles sont les opérations que vous effectuez sur cette structure de données? Si, par exemple, l'objectif est d'afficher une liste de livres avec une liste d'auteurs pour chaque élément, puis il n'est pas nécessaire pour Author pour contenir un std::vector<Book>.

OriginalL'auteur Cilenco | 2017-02-08