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

时间:2018-02-14 14:54:34

标签: c++ class namespaces forward-declaration

到目前为止,我认为在类定义中使用它们之前必须转发声明类型,直到我发现了详细的类型说明符。因此,而不是向前宣布像:

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 *" 

}

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

1 个答案:

答案 0 :(得分:2)

详细的类型说明符声明该类就像单独的声明一样。没有技术上的理由可以避免使用精心设计的类型说明符来声明一个类 - 它们是语言的一部分,它们的用法定义明确并且不会被弃用。

当然,必须要注意 - 就像你一样 - 精心设计的类型说明符将类声明为当前命名空间,如果不需要,则必须在当前命名空间之外单独声明该类。没有什么可以避免我所知道的诀窍。因此,并非所有前向声明都可以使用精心设计的类型说明符来完成。

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