gpt4 book ai didi

c++ - 为什么允许拥有一个自身具有不完整类型静态成员的类?

转载 作者:搜寻专家 更新时间:2023-10-31 00:06:29 24 4
gpt4 key购买 nike

我很难理解为什么一个类本身可以有一个不完整类型的静态成员。

例如在我下面的代码中。为什么类A内部允许有自身的不完整类型静态成员,而类类型B的全局静态变量为不完整类型时却报错?

class B {
public:
B(int a) {
}
};

static B test2; //error


class A {

public:
static A test; //accepted

A(int d) {
}
};

有人可以向我解释一下在幕后发生的事情是什么给了全局静态变量一个错误,以及为什么类 A 中的静态变量被接受了吗?

最佳答案

在这里合并几个不同的问题

static B test2; //error

失败是因为 B 的构造函数需要尚未提供的参数并且是 private 因此无法在类外部访问。更正这些,B 就可以开始了。

class B {
public: // added for outside access to constructor
B(int a) {
printf("%d\n", a);
}
};

static B test2{1}; // added arguments

至于Astatic成员不是类实例的一部分,因此编译器不需要它是完整的。它不占用任何空间,此时它还没有被用于任何事情。这只是一个声明。你可以在编译器不生气的情况下声明各种各样的东西(只要声明的语法是好的)。当您尝试使用没有定义的东西时,您会遇到麻烦。

例子:

void testfunc(const A &)
{

}

int main(){
testfunc(A::test);
}

链接器失败,因为从未定义 A::test。如果您尝试使用

class A {

public:

static A test{1}; // let's try to define it inline!
int a;
int b;
int c;

A(int d, int e) : a(d), b(e), c(15) {

}

A(int d) :A(d, 10) {
printf("%d %d %d", a, b, c);
}
};

现在编译器非常关心地报告该类不完整。我们必须将定义移到类之外完成的地方

class A {

public:

static A test; //declared
int a;
int b;
int c;

A(int d, int e) : a(d), b(e), c(15) {

}

A(int d) :A(d, 10) {
printf("%d %d %d", a, b, c);
}
};
A A::test{1}; // defined

现在

void testfunc(const A &)
{

}

int main(){
testfunc(A::test);
}

将编译和链接。

Documentation on the care and feeding of static members .

关于c++ - 为什么允许拥有一个自身具有不完整类型静态成员的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57642444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com