Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++类方法签名在标题文件中的声明和代码I文件中的源文件定义中重复。我发现这种重复是不可取的,并且以这种方式编写的代码会受到引用位置不佳的影响。例如,源文件中的方法经常引用头文件中声明的实例变量;在阅读代码时,您必须不断地在头文件和源文件之间切换_C++_Coding Style_Dry - Fatal编程技术网

有没有一种好方法可以避免C+中方法原型的重复+;? 大多数C++类方法签名在标题文件中的声明和代码I文件中的源文件定义中重复。我发现这种重复是不可取的,并且以这种方式编写的代码会受到引用位置不佳的影响。例如,源文件中的方法经常引用头文件中声明的实例变量;在阅读代码时,您必须不断地在头文件和源文件之间切换

有没有一种好方法可以避免C+中方法原型的重复+;? 大多数C++类方法签名在标题文件中的声明和代码I文件中的源文件定义中重复。我发现这种重复是不可取的,并且以这种方式编写的代码会受到引用位置不佳的影响。例如,源文件中的方法经常引用头文件中声明的实例变量;在阅读代码时,您必须不断地在头文件和源文件之间切换,c++,coding-style,dry,C++,Coding Style,Dry,有人会推荐一种避免这样做的方法吗?或者,我主要是通过不以平常的方式做事来混淆有经验的C++程序员吗? 另请参见某人被告知所有内容都应放在标题中的地方。不要违反惯例。最后,你会制造出一个不太好用的虫子球。另外,编译器会讨厌你。C/C++这样设置是有原因的。有另一种选择,但治疗比疾病更糟糕-在标题中定义所有函数体,甚至在类中内联定义,如C#。缺点是这会大大增加编译时间,这会让老C++程序员感到恼火。它还可能使您陷入一些令人讨厌的循环依赖情况,这些情况虽然是可以解决的,但处理起来却很麻烦 就我个人而言

有人会推荐一种避免这样做的方法吗?或者,我主要是通过不以平常的方式做事来混淆有经验的C++程序员吗?
另请参见某人被告知所有内容都应放在标题中的地方。

不要违反惯例。最后,你会制造出一个不太好用的虫子球。另外,编译器会讨厌你。C/C++这样设置是有原因的。

有另一种选择,但治疗比疾病更糟糕-在标题中定义所有函数体,甚至在类中内联定义,如C#。缺点是这会大大增加编译时间,这会让老C++程序员感到恼火。它还可能使您陷入一些令人讨厌的循环依赖情况,这些情况虽然是可以解决的,但处理起来却很麻烦


就我个人而言,我只是将IDE设置为垂直拆分,将头文件放在右侧,源文件放在左侧

我假设您讨论的是头文件中的成员函数声明和源文件中的定义

如果您已经习惯了Java/Python/etc.模型,那么它可能看起来是多余的。事实上,如果您愿意,可以在类定义(在头文件中)内联定义所有函数。但是,您肯定会打破惯例,每次更改实现中的任何细微更改时,都要付出额外耦合和编译时间的代价

最初为大规模系统设计的C++、Ada和其他语言之所以隐藏定义是有原因的——没有充分的理由让类的用户必须关心它的实现,也没有理由让他们必须反复付费来编译它。如今,对于速度更快的系统来说,这已经不是什么问题了,但对于真正的大型系统来说,这仍然很重要。此外,TDD、存根和其他测试策略通过隔离和更快的编译来实现。

您“可以”绕过这个问题。您定义的抽象接口类只包含外部应用程序将调用的纯虚拟函数。然后在CPP文件中提供从接口派生的实际类,该类包含所有类变量。您现在可以正常执行了。这只需要一种从接口类实例化派生实现类的方法。您可以通过提供一个静态的“Create”函数来实现这一点,该函数的实现在CPP文件中


这样可以有效地对任何外部用户隐藏实现。但是,您不能仅在堆上创建堆栈上的类。。。但它确实解决了您的问题,并提供了更好的抽象层。不过,如果您没有准备好这样做,那么最终需要坚持您正在做的事情。

C++语言支持函数重载,这意味着整个函数签名基本上是识别特定函数的一种方法。因此,只要单独声明和定义函数,就不必再次列出参数。更准确地说,必须列出参数类型并不是多余的。另一方面,参数名称在这个过程中不起作用,您可以在声明中(即在头文件中)随意省略它们,尽管我认为这限制了可读性。

是的,这也是我的直觉。我很好奇是否有人会自愿提出另一种观点。C++将头和实现分离是一种过时的做法,与编译相对简单的程序可能需要很长时间的时代相比(我曾经在一个从头开始构建的系统上工作过12个多小时)。但是,就是这样做的,你通常应该按照设计使用的方式使用工具。有趣的是,这个答案被多次提升,而cdiggins的类似答案被否决。可能是因为他说这是个好主意,而我说这是个坏主意。是的,我编辑了问题文本以澄清我所说的方法声明和定义之间的重复。
InterfaceClass* InterfaceClass::Create()
{
     return new ImplementationClass;
}