Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 扩展类而不更改其名称_C++_Oop_Inheritance - Fatal编程技术网

C++ 扩展类而不更改其名称

C++ 扩展类而不更改其名称,c++,oop,inheritance,C++,Oop,Inheritance,我有一种情况:在一个解决方案中,我有两个项目。我需要扩展Project:A中使用的类:Foo,这样我就可以在Project:B中添加所需的新功能,而无需更改其名称。问题是:类:Foo已经包含(即有一个)类:Bar,并且由类:Goo包含在两个项目中:a和项目:B。在项目中:B我将类:Goo继承到类:Goo_Ex;但我还需要扩展这两个类:Class:Foo和Class:Bar,并提供相应的函数 为了更清楚地说明这一点,我可以使用以下粗略的方法: 但这会把我的代码浪费在项目中:A 我能想到的一个可能的

我有一种情况:在一个解决方案中,我有两个项目。我需要扩展Project:A中使用的类:Foo,这样我就可以在Project:B中添加所需的新功能,而无需更改其名称。问题是:类:Foo已经包含(即有一个)类:Bar,并且由类:Goo包含在两个项目中:a和项目:B。在项目中:B我将类:Goo继承到类:Goo_Ex;但我还需要扩展这两个类:Class:Foo和Class:Bar,并提供相应的函数

为了更清楚地说明这一点,我可以使用以下粗略的方法:

但这会把我的代码浪费在项目中:A


我能想到的一个可能的解决方案是使用继承并将类:Foo_Global作为类继承-[仅]作为类:Foo在项目中:A和继承-[扩展]作为类:Foo在项目中:B;类相同:。但是他们的解决方案更直接吗?

我认为您建议的解决方案(将当前的Foo隐藏为其他类名,并在两个项目中的新Foo类中继承)是您应该如何做的。

这是一个真正抽象的问题,如果没有更多细节,很难给出一个好的特定解决方案

处理这个问题的基本方法是继承。但这需要一些预先计划。这意味着,当您在项目A中引用Foo时,应该使用指针或引用。如果您创建了一个Foo(当它是项目B的一部分时,需要从项目a创建Foo_扩展代码),那么您需要一个可配置的Foo工厂,该工厂将根据上下文创建适当类型的对象

另一种处理方法是使用模板。项目A中的代码从未直接引用全局Foo类。相反,它总是引用模板参数。在项目A中,该模板参数最终将解析为Foo,在项目B中,它将解析为具有所需功能的其他类


<>这是C++中处理这个问题的两种通用方法。而您使用什么在很大程度上取决于您使用它们的上下文的细节。

扩展类的方法不是扩展它!只需使用带有合适参数的函数即可。

先生,我寻求编译时解决方案。您的建议似乎在运行时。我说得对吗?@San0013:不,现在是编译时。但这两种解决方案似乎都比我自己提出的已经使用继承的解决方案复杂得多。模板和类工厂都是编译时的,是的。我寻求的解决方案是“源时间”(如果我可以这样称呼的话),即代码在项目a和项目B之间明确分开,并且绝对没有任何重叠。@San0013:耸耸肩哦,好吧。这些特性是专门设计的,以便更容易获得可重用的代码,这样您就可以在项目B中重用项目A的特性,而无需对其进行修改。但是如果你不想用,我就帮不了你。您的需求看起来非常扭曲,专门设计来确保没有一种方法可以实现您想要的。这是最基本的解决方案。但这里的思想是不要用项目中只需要的代码污染项目:A的代码:B。底线:扩展代码不应该出现在项目:A的源代码中。因此,您可以在不包含在不使用该函数的项目中的文件中声明和定义该函数。相应的代码甚至可以进入它自己的库项目中。我想我一定错过了一些明显的东西…问题是这个函数将成为Project:A中使用的同一个类的一部分。你能想出一个解决方案,将class:Foo的上述代码拆分为两个独立的文件,而不重叠代码。全部完成:当你需要时,只需在Project A中包含标题!不要再相信函数必须是任何类的成员了,你们都已经搞定了。我也希望头文件干净。。上面的类::Foo的代码在头文件中。您能澄清一下为什么要这样做吗?我很好奇这是否有一个真实的使用案例。我的具体案例的一个一般的例子将更有成效。因此:我有一个层次结构,父类包含('has')子类。孩子还“包含”了孙子。问题是相同的结构在两个不同的(相互关联的)项目中用于不同的目的。同样,项目B需要额外的功能,但这必须在不破坏原始结构的情况下实现::意思是不改变任何类名。闭包:我使用了建议解决方案中描述的继承。在project:A中,我有:#include而不是#include“FooClass.h”在GooClass.h中,这样每个项目都包含Class:Foo的本地副本,该副本仅在project:A中继承,但在project:B中继承并扩展。对于Class:Bar也是如此。我不得不在编译器设置中添加额外的Include目录。
/* Project:A-Class:Foo */

class Foo
{
    .
    .
    .
# ifdef PROJECT_B
    fnExtended();
# endif
};