假设我们有一个类
class Egg
{
static Egg e;
int i;
Egg(int ii):i(ii) {}
Egg(const Egg &); //Prevents copy-constructor to be called
public:
static Egg* instance() {return &e}
};
Egg Egg::e(47);
此代码保证我们不能创建任何对象,但只能使用静态对象。但是我们如何在类中声明同一类的静态对象。
还有一件事,因为e是静态对象,静态对象只能调用静态成员函数,所以如何在静态对象e中调用构造函数,其构造函数也是私有的。
答案 0 :(得分:7)
但是我们如何在类中声明同一个类的静态对象。
static
成员变量未存储在类的每个对象中。因此,如果在定义类之后在类中声明static
成员变量或作为命名空间级别对象,则仅在访问(Class::var
和var
)和访问{时有所不同{1}}和protected
成员。
还有一件事,因为
private
是静态对象,而静态对象只能调用静态成员函数
我认为您正在混合e
个函数和static
个对象。在static
函数内部,您只能调用static
个函数(除非您在对象上调用它们)。
那么如何在静态对象
中调用构造函数static
与其他每个对象一样,也必须为e
个对象调用构造函数。
它的构造函数也是私有的
在C ++的类级别上检查访问控制。因为static
对象在类中,所以它可以访问static
个成员。
与其他一些语言不同,以下内容在C ++中是合法的,因为对私有成员的访问来自类内部 - 即使是在另一个对象上(在这种情况下为private
):
other
答案 1 :(得分:2)
但是我们如何在类中声明同一个类的静态对象。
通常你需要一个前向引用,但由于Egg e是静态的,它实际上定义了类定义的外。如果e不是静态的,则会出现错误(例如“ field Egg e的类型不完整”)。
还有一件事,因为e是一个静态对象,静态对象只能调用静态成员函数,所以如何在静态对象e中调用构造函数。
这不是真的。类中的静态成员 function 只能访问静态成员数据。 static Egg e 是Egg的实例,因此它可以访问普通Egg可以访问的所有成员和数据。
它的构造函数也是私有的。
可以在类中使用任何私有成员。由于 static Egg e 被声明为Egg的成员,因此它可以使用私有构造函数。 e的定义是在之外的类,因为它是静态的,但它仍然是类成员。
最后你的代码没有编译,因为你在这里遗漏了一个分号:
static Egg* instance() {return &e;}