如何实现A到B和B到A(不创建循环)? 我正在学习C++,我正在尝试创建一个在线商店,在那里你可以发表文章并评论他们,评论属于文章,文章可以有很多评论,但我现在不知道如何编写它而不创建循环< /p>

如何实现A到B和B到A(不创建循环)? 我正在学习C++,我正在尝试创建一个在线商店,在那里你可以发表文章并评论他们,评论属于文章,文章可以有很多评论,但我现在不知道如何编写它而不创建循环< /p>,c++,C++,我尝试过使用Article.h->include Comment.h,反之亦然,但当我尝试编译时,它会创建一个循环,其中a导入B,B导入a 评论.h 第h条 使现代化 谢谢大家,我的问题用你们给我的解决了 这个问题已经解决了,我可以删除这个帖子吗?你需要后退一步 你需要先分析你想做什么,然后想想你能做什么。然后你会做它,写代码,然后你会测试它。实际上,还有更多的步骤 让我们从什么开始。你有一些实体有关系。你有吗 网上商店 文章及 对文章的评论 这些是您的实体或对象。这些实体之间有一种联系 在线商

我尝试过使用Article.h->include Comment.h,反之亦然,但当我尝试编译时,它会创建一个循环,其中a导入B,B导入a

评论.h 第h条 使现代化 谢谢大家,我的问题用你们给我的解决了


这个问题已经解决了,我可以删除这个帖子吗?

你需要后退一步

你需要先分析你想做什么,然后想想你能做什么。然后你会做它,写代码,然后你会测试它。实际上,还有更多的步骤

让我们从什么开始。你有一些实体有关系。你有吗

网上商店 文章及 对文章的评论 这些是您的实体或对象。这些实体之间有一种联系

在线商店有0、1或多篇文章 现有文章可以有0条、1条或多条评论 所以,您想要存储0、1或许多东西。为了存储这样的东西,C++在STL提供容器。例如std::vector或std::list。您需要了解这些容器的属性,并选择最适合您的容器。在这种情况下,它肯定是一个std::vector。它可以包含0个或多个元素,并且可以动态增长

<>对于C++和面向对象语言的关系,大多称为A或OR是一个属性。is a关系通过派生进行建模,并通过所谓的包含进行a类型的is模型

例如:

#include <string>
#include <vector>

// "Is a"-relation. Done by deriving from base class Shape
struct Shape
{
  std::string name;
};
// A line is a shape
struct Line : public Shape
{
  int length;
};

// "Has a"-relation. Done by containment. Class online Shop contains articles
struct Article
{
  std::string articleName;
};
struct OnlineShop
{
  std::string shopName;
  std::vector<Article> article;
};


int main()
{
  Line line{ "long line",12345 };

  std::string myShopName{ "My Shop" };
  std::vector<Article> myArticles{ Article{ "Apple"}, Article{"Banana"} };
  OnlineShop myOnlineShop{ myShopName, myArticles };

  return 0;
}
现在你可能会明白一点了

因此,对于您的解决方案,在考虑实体和关系之后,您可能会得出一个可能的解决方案:

您将创建一个类OnlineStore 您将创建一个类文章 还有课堂评论 由于可能有许多文章和评论,您将把它们放在std::vector中。而在线商店类将包含类评论的类文章

因此,将不存在循环依赖关系。在大多数情况下,循环引用是设计缺陷的指示器

下面显示了此类实施的框架:

#include <string>
#include <vector>

struct Comment 
{
   std::string commentText{};
   std::string commentAuthor{};
};
struct Article
{
   std::string articleName{};
   std::vector<Comment> comment{};
};
struct OnlineShop
{
   std::vector<Article> article{};
};

int main()
{
   OnlineShop onlineShop{};
   return 0;
}
请基于此方法定义您的类。然后添加所需的功能

还请阅读面向对象编程的原理


希望这有点帮助

你需要后退一步

你需要先分析你想做什么,然后想想你能做什么。然后你会做它,写代码,然后你会测试它。实际上,还有更多的步骤

让我们从什么开始。你有一些实体有关系。你有吗

网上商店 文章及 对文章的评论 这些是您的实体或对象。这些实体之间有一种联系

在线商店有0、1或多篇文章 现有文章可以有0条、1条或多条评论 所以,您想要存储0、1或许多东西。为了存储这样的东西,C++在STL提供容器。例如std::vector或std::list。您需要了解这些容器的属性,并选择最适合您的容器。在这种情况下,它肯定是一个std::vector。它可以包含0个或多个元素,并且可以动态增长

<>对于C++和面向对象语言的关系,大多称为A或OR是一个属性。is a关系通过派生进行建模,并通过所谓的包含进行a类型的is模型

例如:

#include <string>
#include <vector>

// "Is a"-relation. Done by deriving from base class Shape
struct Shape
{
  std::string name;
};
// A line is a shape
struct Line : public Shape
{
  int length;
};

// "Has a"-relation. Done by containment. Class online Shop contains articles
struct Article
{
  std::string articleName;
};
struct OnlineShop
{
  std::string shopName;
  std::vector<Article> article;
};


int main()
{
  Line line{ "long line",12345 };

  std::string myShopName{ "My Shop" };
  std::vector<Article> myArticles{ Article{ "Apple"}, Article{"Banana"} };
  OnlineShop myOnlineShop{ myShopName, myArticles };

  return 0;
}
现在你可能会明白一点了

因此,对于您的解决方案,在考虑实体和关系之后,您可能会得出一个可能的解决方案:

您将创建一个类OnlineStore 您将创建一个类文章 还有课堂评论 由于可能有许多文章和评论,您将把它们放在std::vector中。而在线商店类将包含类评论的类文章

因此,将不存在循环依赖关系。在大多数情况下,循环引用是设计缺陷的指示器

下面显示了此类实施的框架:

#include <string>
#include <vector>

struct Comment 
{
   std::string commentText{};
   std::string commentAuthor{};
};
struct Article
{
   std::string articleName{};
   std::vector<Comment> comment{};
};
struct OnlineShop
{
   std::vector<Article> article{};
};

int main()
{
   OnlineShop onlineShop{};
   return 0;
}
请基于此方法定义您的类。然后添加所需的功能

还请阅读面向对象编程的原理


希望这有点帮助

这是个好问题!使用对文章的引用和转发声明可能是您想要做的,尽管我不认为评论有什么理由了解文章,特别是因为文章可能使用std::vector拥有其所有评论

现在,您的comentario.h文件如下所示:

// comentario.h
class Comment {
public:
  ...
private:
  Article article;
  [other implementation details for an Article]
}
因为你的评论 nitely不应该拥有一篇文章,我们可以这样重写comentario.h:

// comentario.h
class Article; // this is a forward declaration in order to reference an Article

class Comment {
public:
  Comment(Article& article) // a Comment constructor--requires an Article
  ... // other Comment implementation details
private:
  Article& article;  // reference an existing Article
  ...
  // no need for Article implementation details at all in Comment
}

// comentario.cpp
#include "include/comentario.h"

#include "include/article.h" // we can include article.h now since we're outside the header

Comment::Comment(Article& article)  // the Comment constructor
: article(article) { // initialize the reference to an Article

}
这是一种方法。我个人不会给评论任何关于这篇文章的知识,但如果有必要,我会为文章的详细信息(如标题)创建一个只读包装,然后在评论中引用它


旁注:许多程序员不鼓励在标题中使用名称空间xx。

这是一个很好的问题!使用对文章的引用和转发声明可能是您想要做的,尽管我不认为评论有什么理由了解文章,特别是因为文章可能使用std::vector拥有其所有评论

现在,您的comentario.h文件如下所示:

// comentario.h
class Comment {
public:
  ...
private:
  Article article;
  [other implementation details for an Article]
}
既然你的评论绝对不应该拥有一篇文章,我们可以这样重写comentario.h:

// comentario.h
class Article; // this is a forward declaration in order to reference an Article

class Comment {
public:
  Comment(Article& article) // a Comment constructor--requires an Article
  ... // other Comment implementation details
private:
  Article& article;  // reference an existing Article
  ...
  // no need for Article implementation details at all in Comment
}

// comentario.cpp
#include "include/comentario.h"

#include "include/article.h" // we can include article.h now since we're outside the header

Comment::Comment(Article& article)  // the Comment constructor
: article(article) { // initialize the reference to an Article

}
这是一种方法。我个人不会给评论任何关于这篇文章的知识,但如果有必要,我会为文章的详细信息(如标题)创建一个只读包装,然后在评论中引用它


旁注:许多程序员不鼓励在标题中使用名称空间xx。

建议阅读:您已经朝一个可能的方向走了:仅按索引引用注释。另一种方法是存储指向注释的指针,这些注释需要阅读链接的文章。就目前而言,没有必要在文章中包含Commentario.h。但是,不要这样做,这样会很好。这不是代码中的拼写,这是故意破坏:您解决了问题。@LightnessRacesinOrbit抱歉,我认为让读者看看我的代码现在是什么样子以及新问题是什么会有帮助,我并没有在代码StackOverflow中将其标记为拼写,而是为meThe包含文件Article.h不需要包含Comentario.h。h文件仅引用std::map和std::string。我建议您在头文件中使用std::prefix,而不是依赖于使用名称空间std;的某些文件;。尽量使头文件自给自足,不要依赖标准库以外的其他头文件。建议阅读:您已经朝一个可能的方向前进:仅按索引引用注释。另一种方法是存储指向注释的指针,这些注释需要阅读链接的文章。就目前而言,没有必要在文章中包含Commentario.h。但是,不要这样做,这样会很好。这不是代码中的拼写,这是故意破坏:您解决了问题。@LightnessRacesinOrbit抱歉,我认为让读者看看我的代码现在是什么样子以及新问题是什么会有帮助,我并没有在代码StackOverflow中将其标记为拼写,而是为meThe包含文件Article.h不需要包含Comentario.h。h文件仅引用std::map和std::string。我建议您在头文件中使用std::prefix,而不是依赖于使用名称空间std;的某些文件;。尽量使头文件自给自足,不要依赖标准库以外的其他头文件。