我可以通过指定 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 必须在当前命名空间之外单独声明。没有什么技巧可以避免我所知道的。因此,并非所有前向声明都可以使用详细的类型说明符来完成。
对于可以通过单独的声明或详细的类型说明符来实现的情况,两者之间的选择取决于个人喜好。
到目前为止,我一直认为在 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 必须在当前命名空间之外单独声明。没有什么技巧可以避免我所知道的。因此,并非所有前向声明都可以使用详细的类型说明符来完成。
对于可以通过单独的声明或详细的类型说明符来实现的情况,两者之间的选择取决于个人喜好。