Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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++;接口:如何避免键入相同的方法名3次?_C++_Design Patterns_Interface - Fatal编程技术网

C++ C++;接口:如何避免键入相同的方法名3次?

C++ C++;接口:如何避免键入相同的方法名3次?,c++,design-patterns,interface,C++,Design Patterns,Interface,作为后续工作:如果我创建一个纯虚拟接口类并将实现类拆分为头文件和源文件,我将得到以下结果: 接口: class IDemo { public: virtual ~IDemo() {} virtual void OverrideMe() = 0; }; 实现类、头: class Child : public IDemo { public: virtual void OverrideMe(); }; 实现类,来源: void Chil

作为后续工作:如果我创建一个纯虚拟接口类并将实现类拆分为头文件和源文件,我将得到以下结果:

接口:

class IDemo
{
    public:
        virtual ~IDemo() {}
        virtual void OverrideMe() = 0;
};
实现类、头:

class Child : public IDemo
{
    public:
       virtual void OverrideMe();
};
实现类,来源:

void Child::OverrideMe() 
{
    //doStuff
}

因此,我需要对接口中声明的方法的名称进行三次检查——这不仅麻烦,而且容易混淆。有更好的方法吗?

没有,没有更好的方法。
接口必须指定方法,因为它是其合同的一部分。
标头必须指定方法,以声明类将覆盖它。
源文件必须指定方法,以便编译器知道实现属于哪个方法。我不觉得这令人困惑


将出现次数减少到两次的唯一方法是在类的头中实现该方法,但我强烈反对这样做

这是无法避免的(除非像其他人已经建议的那样,将定义写入头文件;正如Botz3000也建议的那样,不要这样做)

这就是做到这一点的方法


根据你的评论,我决定写一个答案:

我:

还有什么让人如此困惑

你:

如果有人查看标头,他如何知道此方法声明实际上是从基类继承的

好吧,有两种方法-留下评论,比如:

/*
 * This overrides Base::OverrideMe
 */
virtual void OverrideMe();
当您将鼠标光标放在注释上时,大多数编辑器都会向您显示此注释

另一种方法是使用
C++11
,在函数后面添加
override
关键字:

class Child : public IDemo
{
    public:
       virtual void OverrideMe() override;
};
这对其他情况也可能有用。你可能想看看


另请参见:

不,没有。还有什么让人如此困惑?因为在接口和头文件中声明了相同的方法。如果有人查看标头,他如何知道此方法声明实际上是从基类继承的?通过将第2个和第3个合并在一起键入两次。@RomanR:我不想合并类的声明及其实现。这就是使用“接口”的最初动机:我不想在“契约”中声明特定于实现的成员。您的编译器可能会支持接口的特殊语法,从而让您获得更多的区别并提高可读性。例如,MSVC++有
\uu接口
-如果你不介意可移植性,你可以使用它而不是纯虚拟类(不过,请仔细阅读文档)我非常喜欢使用override的解决方案!