在C++中转发"预先声明"一个类

Raf*_*ida 3 c++ substring class

我有一个情境,我想声明一个类成员函数返回一个依赖于类本身的类型.让我给你举个例子:

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

而SubstringTree的定义如下:

typedef set<Substring, Substring::Comparator> SubstringTree;
Run Code Online (Sandbox Code Playgroud)

我的问题是如果我在Substring定义之后放置SubstringTree定义,静态方法说它不知道SubstringTree.如果我反转声明,那么typedef表示它不知道Substring.

我该怎么做?提前致谢.

Ric*_*den 8

正如你所写,简短的回答是你不能.

你有几个接近的选择:

1)在子串中声明SubstringTree

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;
Run Code Online (Sandbox Code Playgroud)

2)在子串外定义比较器:

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);
};
Run Code Online (Sandbox Code Playgroud)

3)您可以使用模板来延迟查找,直到您有更多声明:

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;
Run Code Online (Sandbox Code Playgroud)


Boj*_*nik 6

你可以在类中定义它:

class Substring {
    private:
        string the_substring_;
    public:
        // (...)
        typedef set<Substring, Substring::Comparator> SubstringTree;
        static SubstringTree getAllSubstring(string main_string, int min_size);
};
Run Code Online (Sandbox Code Playgroud)

  • ......根本不是一个坏主意.它有助于整合全局命名空间.我甚至会使用Substring :: Tree. (3认同)