2009-07-08 7 views
3

クラスそのものに依存する型を返すクラスメンバ関数を宣言したいという状況があります。C++のクラスを前もって宣言する

class Substring { 
    private: 
     string the_substring_; 
    public: 
     // (...) 
     static SubstringTree getAllSubstring(string main_string, int min_size); 
}; 

そして、次のようにSubstringTreeが定義されます:私はあなたに例を挙げましょう

typedef set<Substring, Substring::Comparator> SubstringTree; 

私の問題は、私はサブストリングの定義の後SubstringTree定義を置けば、静的メソッドは、それはdoesnの言うことですSubstringTreeを知っている。私が宣言を逆にすると、typedefはSubstringを知らないと言っています。

どうすればいいですか?前もって感謝します。

+3

"事前宣言"は実際に "前方宣言"と呼ばれていますが、あなたはもっと幸運になり、正しい用語を使ってより良い結果を得ることができます。 – arul

+1

申し訳ありませんが、私は実際にその用語が何かを忘れました。それについて考えるようになりました。私はその言葉が何であるかを知っていましたが、私が求めていたことをどうやって行うのか分かりません。 =) –

+0

これは、私たちが答えやコメントに "前方宣言"を含める必要があるので、あなたは知っているだろうし、この質問に来る他のC + +の初心者は知っておく必要があります。 –

答えて

5

あなたは、クラス内でそれを定義することができます。

class Substring { 
    private: 
     string the_substring_; 
    public: 
     // (...) 
     typedef set<Substring, Substring::Comparator> SubstringTree; 
     static SubstringTree getAllSubstring(string main_string, int min_size); 
}; 
+0

しかし、あなたは 'Substring :: SubstringTree' – Zifre

+2

でそれを参照しなければなりません。それは全く悪い考えではないかもしれません。これは、グローバル名前空間の宣言に役立ちます。私はSubstring :: Treeと一緒に行くだろう。 –

+0

しかし、クラス外で別のtypedefを追加すると、グローバルスコープ内でそれを再定義することができます – shoosh

3

あなたはこれでクラスを先行宣言することができます

class Foo; 

クラスが実際に定義される前に、あなただけのポインタを宣言することができますことを心に留めておいてくださいインスタンスではなく、それに接続します。それはしかしサブストリングの非ポインタの用途のために働くかどうかはわからない

+0

典型的な円形の包含。 – dborba

0

前方宣言

class Substring; 

+0

一般的にそうではありません。 –

7

あなたが書いたとおり、短い答えはできません。あなたは使用することができます)

class Substring; 
class SubstringComparator; 
typedef set< Substring, SubstringComparator> SubstringTree; 

class Substring { 
public: 

private: 
    string the_substring_; 
public: 
    // (...) 
    static SubstringTree getAllSubstring(string main_string, int min_size); 
}; 

3:サブストリングの外にコンパレータを定義します)

class Substring { 
public: 
    class Comparator; 
    typedef set< Substring, Comparator> Tree; 

private: 
    string the_substring_; 
public: 
    // (...) 
    static Tree getAllSubstring(string main_string, int min_size); 
}; 

typedef Substring::Tree SubstringTree; 

2サブストリングで

1)SubstringTreeを宣言します。

あなたは、いくつかの密接な選択肢を持っていますより多くの宣言があるまで参照を延期するテンプレート:

template <typename String> 
struct TreeHelper 
{ 
    typedef set< String, typename String::Comparator> Tree; 
}; 

class Substring { 
public: 
    class Comparator; 

private: 
    string the_substring_; 
public: 
    // (...) 
    static TreeHelper<Substring>::Tree getAllSubstring(string main_string 
              , int min_size); 
}; 

typedef TreeHelper<Substring>::Tree SubstringTree; 
関連する問題