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 に答える