假设我们有一个类,比如
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调用构造函数,因为它的构造函数是私有的。
发布于 2012-06-04 06:35:25
,但是我们如何在类中声明相同类的静态对象呢?
static成员变量并不存储在类的每个对象中。因此,如果在定义类之后在类中声明static成员变量或将其声明为命名空间级对象,则仅在访问(Class::var和var)和访问protected和private成员方面有所不同。
还有一件事,因为
e是一个静态对象,静态对象只能调用静态成员函数
我认为你把static函数和static对象混在一起了。在static函数中,您只能调用static函数(除非您在对象上调用它们)。
那么如何在这里为静态对象e调用构造函数呢
与其他对象一样,也必须为static对象调用构造函数。
的构造函数也是私有的。
在C++中,访问控制是在类级别上检查的。因此,由于static对象位于类内部,因此它可以访问private成员。
与其他一些语言不同,在C++中,以下情况是合法的,因为对私有成员的访问是从类内部进行的-即使是在另一个对象上(本例中为other):
class Test {
private:
int i;
public:
Test(const Test &other)
: i(other.i)
{}
};发布于 2012-06-04 07:47:54
,但是我们如何在类中声明相同类的静态对象呢?
通常你需要一个前向引用,但是因为Egg e是静态的,所以它实际上是在类定义之外定义的。如果e不是静态的,你会得到一个错误(类似于"field Egg e has incomplete type")。
,还有一件事,因为e是一个静态对象,静态对象只能调用静态成员函数,那么如何在这里为静态对象e调用构造函数。
这并不完全正确。类中的静态成员函数只能访问静态成员数据。静态蛋类是的一个实例,因此它可以访问常规蛋类可以访问的所有成员和数据。
的构造函数也是私有的。
任何私有成员都可以在类中使用。由于蛋类静态被声明为的成员,因此它可以使用私有构造函数。E的定义在类的外部,因为它是静态的,但它仍然是类的成员。
最后,您的代码不能编译,因为您在这里遗漏了一个分号:
static Egg* instance() {return &e;}https://stackoverflow.com/questions/10874317
复制相似问题