C++ 如何创建一个;经理;对于C++;?
我正在实现一个编码算法,每一步都涉及到许多不同的类。比如:C++ 如何创建一个;经理;对于C++;?,c++,algorithm,C++,Algorithm,我正在实现一个编码算法,每一步都涉及到许多不同的类。比如: void MagicAlgorithm(Class1 c1, Class2 c2, ..., Classn cn){ //step 1 c1.doSomething(); //step 2 c2.doSomething(); ... //step n cn.doSomething(); } 所有这些n类都是抽象的,不同的实现用于性能比较。请注意,方法调用的顺序很重要 我正在定义M
void MagicAlgorithm(Class1 c1, Class2 c2, ..., Classn cn){
//step 1
c1.doSomething();
//step 2
c2.doSomething();
...
//step n
cn.doSomething();
}
所有这些n
类都是抽象的,不同的实现用于性能比较。请注意,方法调用的顺序很重要
我正在定义MagicAlgorithm
,因为n
很大,用户可能会以错误的顺序调用doSomething()
。因此,MagicAlgorithm
以正确的顺序为用户完成肮脏的工作
但是,没有任何东西可以阻止用户在MagicAlgorithm
之外调用doSomething
(它只需要启动Classk ck
,然后调用ck.doSomething()
)。这是我想避免的事情
是否可以只在
MagicAlgorithm()
内部调用doSomething()
而不在其外部调用 使doSomething
方法私有并添加
friend MagicAlgorithm(Class1, Class2, ..., Classn);
到相关的类声明。当像这样做friend
时,MagicAlgorithm
可以调用类的私有函数
您可能希望更改函数签名以使用引用或指针(
const
如果doSomething
是const
,但它可能不是):
因为这样就可以转发声明(
class Class1;class Class2;…class Classn;
)所有的类,并且避免了在每个.h文件中包含所有内容的需要。将doSomething
方法设为私有并添加
friend MagicAlgorithm(Class1, Class2, ..., Classn);
到相关的类声明。当像这样做friend
时,MagicAlgorithm
可以调用类的私有函数
您可能希望更改函数签名以使用引用或指针(
const
如果doSomething
是const
,但它可能不是):
因为这样就可以转发所有类(
class Class1;class Class2;…class Classn;
)了,并且可以避免在每个.h文件中包含所有内容。不要避免太多内容。用户仍然需要阅读文档并以适当的方式使用类。也许用户知道他在做什么,他想以其他顺序调用.doSomething()
,以完成一些你没有想到的事情。你可以让它成为朋友,但这些是抽象类,这意味着用户可以给你他想要的任何东西。那么,隐藏用户可以定义的用户函数的目的是什么呢?这些是抽象类,因为我给用户提供了一组不同的实现,所以用户可以选择自己喜欢的实现,然后利用多态性调用doSomething()
,而不必关心实际的实现。他可以给出抽象类的自己的实现,但作为库的设计者,这对我来说是“意想不到的”。不过我明白你的意思。那么,为什么你不要求枚举,而不是类呢?如果用作参数的类不具有用户可自定义的状态,并且您仅将它们用于virtual.doSomething()(顺便说一句,您必须通过引用获取它们,否则多态性不起作用),那么您还可以获取N个不同的枚举,然后使用私有开关函数将枚举值映射到执行此任务的函数。在运行时,它应该和调用虚拟函数一样快(在这两种情况下,您都必须访问包含要调用的函数地址的表的条目)。不要避免太多内容。用户仍然需要阅读文档并以适当的方式使用类。也许用户知道他在做什么,他想以其他顺序调用.doSomething()
,以完成一些你没有想到的事情。你可以让它成为朋友,但这些是抽象类,这意味着用户可以给你他想要的任何东西。那么,隐藏用户可以定义的用户函数的目的是什么呢?这些是抽象类,因为我给用户提供了一组不同的实现,所以用户可以选择自己喜欢的实现,然后利用多态性调用doSomething()
,而不必关心实际的实现。他可以给出抽象类的自己的实现,但作为库的设计者,这对我来说是“意想不到的”。不过我明白你的意思。那么,为什么你不要求枚举,而不是类呢?如果用作参数的类不具有用户可自定义的状态,并且您仅将它们用于virtual.doSomething()(顺便说一句,您必须通过引用获取它们,否则多态性不起作用),那么您还可以获取N个不同的枚举,然后使用私有开关函数将枚举值映射到执行此任务的函数。在运行时,它应该与调用虚拟函数一样快(在这两种情况下,您都必须访问包含要调用的函数地址的表项)。好的,谢谢您的建议,我从来没有听说过friend
函数!但是如果MagicAlgorithm
是一个类的方法MagicClass
,你也可以让类成为朋友。稍后我会编辑这个问题,添加一些链接,但是你应该可以在谷歌上搜索详细信息。好的,谢谢你的建议,从来没有听说过friend
函数!但是如果MagicAlgorithm
是一个类的方法MagicClass
,你也可以让类成为朋友。稍后我会编辑这个问题,添加一些链接,但是你应该可以用谷歌搜索细节。