1

自从大约 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# 风格接口的正确方法是什么?

4

4 回答 4

6

当然可以,但是您需要传递引用或指针,而不是按值传递(好吧,从迂腐的角度讲,指针也是按值传递的):

void SomeProcedure(IMyInterface& Param)

我认为它在这方面类似于 C#,只是 C# 默认情况下传递对类的引用,而在 C++ 中,你必须明确地说你想通过引用传递它。

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

于 2013-01-31T17:02:56.797 回答
3

但是,在 C++ 中,您不能传递接口......

您可以将指针引用传递给抽象类,例如:

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

或者

void SomeProcedure(const IMyInterface& Param) { ... }
于 2013-01-31T17:03:07.190 回答
1

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

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

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

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

类似地,如果要存储同一基类的一些实现,则存储对基类的引用或指针,然后让它们引用/指向实现类的实际对象。

于 2013-01-31T17:13:30.380 回答
0

问题中的当前代码:

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 )
{
}

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

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

于 2013-01-31T17:49:04.347 回答