C++ C++;和UML图

C++ C++;和UML图,c++,design-patterns,C++,Design Patterns,设A类和B类继承C类。所有这些都与主类的main方法一起位于file.cpp中。如果我想创建一个类a的实例,那么 file.cpp class C{ } class A : public C{ } class B : public C{ } class Main{ . . . void main(){ C *c = new A(); } } UML图在哪里 现在,假设我有相同的类,但每个类在不同的文件中。如前所述,如果我想实例化类A,我必须在主类中插入一

设A类和B类继承C类。所有这些都与主类的main方法一起位于file.cpp中。如果我想创建一个类a的实例,那么

file.cpp

 class C{
 }

 class A : public C{
 }

 class B : public C{
 }
 class Main{
 .
 .
 .
 void main(){
    C *c = new A();
 }
 }
UML图在哪里

现在,假设我有相同的类,但每个类在不同的文件中。如前所述,如果我想实例化类A,我必须在主类中插入一个#include A.h指令,这将在我的关系图中显示一个依赖项:

我的问题是:如果我想这样做,哪种情况是正确的?还是我在C++中解释错误UML?? 您需要使用组合关系来显示
Main
有一个
C
的实例

我从未记录过哪些文件需要包含,因为假设您需要另一个文件中的类的功能,您可能需要包含


EDIT:实际上,没有组合,因为您的
Main
类似乎有一个名为
Main()
的方法,该方法创建了
C
类的一个实例,它本身不是一个成员。

我认为不需要像第二个图中那样具有has-a关系,因为它是隐含的

A是-A是-C,B是-A是-C,主要是-A是-C


与其说包含在文件中,不如说包含在设计的结构中。

首先,除非您知道自己在做什么,否则不应该将代码放入.h文件中(请参阅,主要用于速度)

然后在main.h中,您不需要任何对A的引用。但是,在main.cpp中,您需要包含A.h。请记住,UML是语言不可知的,它用于绘制“谁与谁对话”,而不是“谁与谁编译”

<>通常,C++编译器将生成一个输出文件(GCC是这些.o文件,VisualStudio也为每个CPP文件做这个,但是透明)。然后,所有输出文件将在应用程序或库中合并在一起(大多数情况下),只有这样,您的函数才会链接在一起

您可能还想看看。这是为了告诉编译器(不是链接器)“这个类确实存在,你现在可能不知道,但我向上帝发誓,它将存在于链接器输出blob中”

在您的特定情况下,我会像您的第二个示例一样绘制类图,而不管您是只使用一个还是多个cpp文件。你的主要班级确实知道A

现在假设您的C类有如下方法

A* C::createA()
{
    return new A;
}

B* C::createB()
{
    return new B;
}
那么你的主课就有了

int main()
{
    C* instance1 = C::createA();
    C* instance2 = C::createB();
}

在这种情况下,你的主课将失去与你的第一张图表一致的关于A和B的所有知识。当然,这会在A、B和C之间产生更多的耦合,这会带来问题,但在你的问题中更接近于

,“如果我想做同样的事情,哪个是正确的?或者我在C++中解释错误UML关系?”,请尝试使用适当的名词而不是“一个”或“正确的”或“做同样的”。因为它们是模糊的和/或模棱两可的。通过冗长,它有助于我们快速理解您试图查找的内容。请你修改一下好吗?另外,你能把问题标题更新得更具体一些吗?@Juan UML纯粹描述类之间的关系,而不是基于这些类的物理位置。请理解,在你的回答中“需要存在于另一个文件中的类的功能,你可能需要包含”。然后我会创建一个UML箭头关联,或者不一定?就像前面的句子,“我从来没有记录过哪些文件需要包含”任何人,基于任何规则,请告诉我们,在C++的UML图中,包含C++文件需要依赖关系吗?理解,但是如果我想对响应链模式进行建模。我将能够使用第一张图表?责任链通常包括某种自我参考。是的,我看到了第一张和第二张图表:C类破折号指向C类。但我的疑问是:我使用第一个或第二个图表?我真的不理解你的问题对不起。。。是(责任链通常包括某种自我引用)在第一个和第二个图中重新标记关联:C类破折号指向C类。但我的疑问是:我使用第一个或第二个图表来模拟责任链模式?