在C++中正确使用"interfaces"?

Properly using "interfaces" in C++?

本文关键字:interfaces C++      更新时间:2023-10-16

自从大约 5 年前切换到 C# 以来,我还没有在 C++ 中进行过硬核开发。 我非常熟悉在 C# 中使用接口,并且一直使用它们。 例如

public interface IMyInterface
{
   string SomeString { get; set; }
}
public class MyClass : IMyInterface
{
   public string SomeString { get; set; }
}
// This procedure is designed to operate off an interface, not a class.
void SomeProcedure(IMyInterface Param)
{
}

这一切都很棒,因为您可以实现许多类似的类并传递它们,并且没有人比您实际使用不同的类更明智。 但是,在C++中,您无法传递接口,因为当它看到您尝试实例化未定义所有方法的类时,您会收到编译错误。

class IMyInterface
{
public:
   ...
   // This pure virtual function makes this class abstract.
   virtual void IMyInterface::PureVirtualFunction() = 0;
   ... 
}

class MyClass : public IMyInterface
{
public:
   ...
   void IMyInterface::PureVirtualFunction();
   ... 
}

// The problem with this is that you can't declare a function like this in
// C++ since IMyInterface is not instantiateable.
void SomeProcedure(IMyInterface Param)
{
}

那么,在C++中感受 C# 风格接口的正确方法是什么?

当然

可以,但你需要传递引用或指针,而不是按值传递(好吧,从学究的角度来看,指针也是按值传递的):

void SomeProcedure(IMyInterface& Param)

我认为在这方面与 C# 相似,只是 C# 默认将引用传递给类,而C++您必须明确表示要通过引用传递它。

传递值将尝试创建对象的副本,而抽象类型(接口)的对象没有意义,因此会出现错误。

但是,在C++中,您无法传递接口...

您可以传递指向抽象类的指针或引用,例如:

void SomeProcedure(IMyInterface& Param) { ... }

void SomeProcedure(const IMyInterface& Param) { ... }

不能将抽象(接口类)传递给函数的原因是,在进行复制时需要知道对象的大小。

如果所有类的大小相同,这显然不会有什么不同,但是编译器通常无法知道您的意图是什么,并且实现实际上具有基/接口类中不存在的成员变量是很常见的[事实上,干净的实现根本不应该包含任何数据]。

为了避免知道大小,我们传递一个指针或引用。现在编译器只需要知道指针的大小 - 这是编译器可以随时知道的。

因此,正如其他答案所说,您传递引用、const 引用或指向接口的指针,并且可以传入实现对象,而无需确切知道它是哪一个。

同样,如果要存储同一基类的某些实现,请存储指向基类的引用

或指针,然后让它们引用/指向实现类的实际对象。

问题中的当前代码:

class IMyInterface
{
public:
   ...
   // This pure virtual function makes this class abstract.
   virtual void IMyInterface::PureVirtualFunction() = 1;
   ... 
}
这实在

是太不对劲了。

  • IMyInterface::是一种语言扩展,如果它使用任何编译器进行编译(类似于用于使用 Visual C++ 进行编译的内容)。

  • = 1是语法错误。可能作者的意思是= 0.

  • 不带分号的}将导致以后的分析错误。

因此,在后面的代码中诊断特定事物是导致OP问题的原因,就像到目前为止的现有答案一样,纯粹是猜测。似是而非,是的。但是,嘿,当OP写道

问题是

"因为你会得到一个编译错误"

他或她已经通过上述幻想代码得到了这一点。

继续问题的代码:

class MyClass : public IMyInterface
{
public:
   ...
   void IMyInterface::PureVirtualFunction();
   ... 
}
// The problem with this is that you can't declare a function like this in
// C++ since IMyInterface is not instantiateable.
void SomeProcedure(IMyInterface Param)
{
}

应用超长距离迭代收敛心灵感应电路,我猜代码可能意味着:

class IMyInterface
{
public:
   // ...
   virtual void pureVirtualFunction() = 0;
};
class MyClass
    : public virtual IMyInterface
{
public:
   // ...
   void PureVirtualFunction();
};
void SomeProcedure( IMyInterface const& param )
{
}

然后,纠正了无数的语法错误等,只是为了让代码编译,没有明显的问题需要处理:毫无疑问。

免责声明:未被编译器的手所触及。另外,既然没有问题,就没有讨论。我只是提出编程需要智能,它不能简化为适合机器的规则,因此不要将上述内容作为绝对规则来遵循。