具有静态成员的 class 的前向声明
forward declaration of a class having static member
我在下面的代码中做错了什么吗?我收到以下编译错误:
ERROR: Invalid use of incomplete type classSample
但我已经转发声明了class Sample
。
class Sample;
int Sample::objCount = 0;
class Sample
{
public:
static int objCount;
Sample()
{
Sample::objCount++;
std::cout<< "creating object = "<<Sample::objCount<<std::endl;
}
~Sample()
{
Sample::objCount--;
std::cout<< "destroying object = "<<Sample::objCount<<std::endl;
}
};
int main()
{
Sample obj;
return 0;
}
前向声明 class 是对编译器的承诺,它会在稍后的某个时间点提供定义。在 return 中,编译器允许您在不需要 class 内容的其他声明中使用前向声明的 class,例如声明指针或引用。
定义 class 的成员依赖于对 class 内容的了解。因此,简单的前向声明不再足够:必须定义您的 class 以便编译器正确处理其成员定义。
在您的示例中,不需要前向声明。您应该将 class 定义移动到头文件中,将其包含在您的 main
文件中,然后将 Sample::objCount
移动到 main
文件或单独的 sample.cpp
文件。
我在下面的代码中做错了什么吗?我收到以下编译错误:
ERROR: Invalid use of incomplete type
classSample
但我已经转发声明了class Sample
。
class Sample;
int Sample::objCount = 0;
class Sample
{
public:
static int objCount;
Sample()
{
Sample::objCount++;
std::cout<< "creating object = "<<Sample::objCount<<std::endl;
}
~Sample()
{
Sample::objCount--;
std::cout<< "destroying object = "<<Sample::objCount<<std::endl;
}
};
int main()
{
Sample obj;
return 0;
}
前向声明 class 是对编译器的承诺,它会在稍后的某个时间点提供定义。在 return 中,编译器允许您在不需要 class 内容的其他声明中使用前向声明的 class,例如声明指针或引用。
定义 class 的成员依赖于对 class 内容的了解。因此,简单的前向声明不再足够:必须定义您的 class 以便编译器正确处理其成员定义。
在您的示例中,不需要前向声明。您应该将 class 定义移动到头文件中,将其包含在您的 main
文件中,然后将 Sample::objCount
移动到 main
文件或单独的 sample.cpp
文件。