我可以通过指定 struct 或 class 来避免前向声明吗

Can I avoid forward declarations by specifying struct or class

到目前为止,我一直认为在 class 定义中使用它们之前必须转发声明类型,直到我发现详细的类型说明符。因此,与其转发声明所有内容,不如:

struct Banana;
struct Apple;
struct Kiwi;
struct Orange;
struct Mango;
struct Lemon;
struct Plum;

我能做到:

struct FruitStuff
{
    struct Banana* banana;
    struct Apple returnApple();
    void eatKiwi(const struct Kiwi& kiwi);
    void peelOrange(struct Orange orange);
    std::vector<struct Mango> mangos;
    static struct Lemon* lemons[10];
    void pickPlum(const struct Plum *const plum);
};

在适当的 cpp 或其他内容中定义这些,而不必转发声明任何内容。我想我更喜欢这种方式,但这在任何方面都是不可取的还是一个坏主意?

另外,我注意到这个技巧对命名空间不起作用,因为:

namespace FruitNamespace
{
    void pickPlum(struct Plum * plum) {}; // The compiler thinks that the Plum argument 
                                           // here is FruitStuff::Plum*
}
// so
struct Plum {int a;}

int main()
{
    Plum plum;
    FruitNamespace::pickPlum(&plum); // argument of type "Plum *" is incompatible
                                     // with parameter of type "FruitNamespace::Plum *" 

}

有趣的是,如果我在结构内指定一个结构,它只需要该名称的任何结构,但在命名空间中,它需要该命名空间内的结构。这并不重要,但出于好奇,我想知道是否有办法解决这个问题。

详细的类型说明符声明 class 就像单独的声明一样。没有技术原因可以避免使用精心设计的类型说明符声明 class - 它们是语言的一部分,它们的使用定义明确并且没有被弃用。

当然,人们必须意识到——就像你一样——详细的类型说明符将 class 声明到当前命名空间中,如果不需要,则 class 必须在当前命名空间之外单独声明。没有什么技巧可以避免我所知道的。因此,并非所有前向声明都可以使用详细的类型说明符来完成。

对于可以通过单独的声明或详细的类型说明符来实现的情况,两者之间的选择取决于个人喜好。