Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++;?_C++_Algorithm - Fatal编程技术网

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
,你也可以让类成为朋友。稍后我会编辑这个问题,添加一些链接,但是你应该可以用谷歌搜索细节。