2009-06-13 12 views
4

このインスタンスをパラメータとして関数に渡すにはどうすればよいですか?名前のないクラスを関数に渡す

class 
{ 
    public: 
    void foo(); 
} bar; 

クラスに名前を付ける必要はありますか?
私はクラスのコピーctorをプライベートにしていないのでコピー可能です。
それでは、どうすれば可能ですか?

答えて

6

もしあなたがしたいことを明示すればもっと良いかもしれません。なぜ名前のないクラスを作成したいのですか?それはインターフェイスに適合していますか?名前のクラスは今、あなたがインターフェイスをimplmentingしている場合、あなたはそのインターフェイスへの参照を渡すことができ

...彼らは関数へのパラメータとして使用することはできません、彼らはテンプレート型パラメータとして使用することはできません、非常に限られている:

class interface { 
public: 
    virtual void f() const = 0; 
}; 
void function(interface const& o) 
{ 
    o.f(); 
} 
int main() 
{ 
    class : public interface { 
    public: 
     virtual void f() const { 
     std::cout << "bar" << std::endl; 
     } 
    } bar; 
    function(bar); // will printout "bar" 
} 

注:テンプレート引数をオプションと見なすすべての回答では、名前のないクラスをテンプレート型引数として渡すことはできません。

C++標準。 14.3。1、第2項:

2 A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.

あなたはcomeauコンパイラ(リンクはオンライントライアウトのためである)次のエラーを取得するとテストする場合:コモコンパイラは、サイドノートとして

error: a template argument may not reference an unnamed type

私が知っている最も標準的な準拠のコンパイラですが、私が試した最も有用なエラー診断を持つものです。

注:Comeauとgcc(g ++ 4.0)は上記のコードでエラーを返します。インテルコンパイラ(および他の人からのコメントMSVS 2008)は、名前のないクラスをテンプレートパラメータとして標準に対して使用することを認めています。

+0

私はほとんど使用していないC++の機能のいくつかを調べているので、私は尋ねています。 名前のないクラスとシングルトンの違いは何ですか? –

+1

彼らは共通点がありません。シングルトンパターンは、要素の単一性(どこからでもアクセス可能な単一のオブジェクト)を扱います。名前付きクラスでシングルトン(他のメンバーと同様に)を実装できます。 –

+1

FYI:テンプレートパラメータとしてのローカルクラスと名前のない型のこの不要な制限は、C++ 0xから解消されました。 –

0

はい、クラスに関数のインスタンスを渡す必要があります。独自のコピーを提供していないので、ctorコンパイラは独自のコンパイラを生成して使用します。

-1

Hmmm、無名クラス。

void *としてポインタを渡すことができます。

名前で参照することはできないため、1インスタンス以外のコンストラクタ、コピーコンストラクタ、またはデストラクタを呼び出すことはできません。そのため、コピーできません。

EDIT:まだコピーできるテンプレート関数に渡すことができます。

REEDIT:編集が間違っていました。

+1

いいえ、できません。 14.3.1テンプレート型の引数: '2ローカル型、リンケージのない型、名前のない型、またはこれらの型から複合化された型は、テンプレート型パラメータのテンプレート引数として使用できません。 –

2

匿名クラスを関数に渡すときに匿名クラスを作成する理由は何ですか?

だけで明示的にクラスを宣言:

class Foo { 
    // ... 
}; 

void Method(Foo instance); 

int main() { 
    Foo bar; 
    Method(bar); 
} 

第二の可能性は、テンプレート機能を使用することになり、その型を推論うコンパイラは、(これは標準互換性がないことに注意!)

#include <iostream> 

using namespace std; 

template <typename T> 
void SayFoo(T& arg) { 
    arg.Foo(); 
} 

int main() { 

    class { 
    public: 
     void Foo() { cout << "Hi" << endl; } 
    } Bar; 

    Bar.Foo(); 

    SayFoo(Bar); 

    return 0; 
} 

コンパイラが自動的にコピーコンストラクタを生成したので、クラスのコピーに問題はなく、タイプを明示的に参照しないように、boost::typeofのようなツールを使用できます。

BOOST::AUTO(copy, Bar); 

もう1つは、(比較的遅い)ランタイムポリモーフィズム(インターフェイス/継承)を使用しています。

+0

boost :: typeofの使用例を教えてください。 BOOST :: AUTOは私にあまり言わない。 新しい標準ではまだ必要ですか? –

+1

オプション2はオプションではありません。標準の14.3.1テンプレート型の引数から: '2ローカル型、リンケージのない型、名前のない型、またはこれらの型から複合化された型は、テンプレート型引数-a' –

+1

@the_drow: いいえ、C++ 0xは自動的にタイプを推論するauto-keywordを導入します。 boost :: typeofを使用するにはboostをインストールする必要があります – Dario

関連する問題