使用私有构造函数将 Class 成员指向 class
Pointers to Class Members into a class with a private constructor
假设我有一个带有私有构造函数的 class,并且 class 将用于表示单个对象。假设我有一些非静态成员,我想在不使用范围解析运算符的情况下访问它们。我注意到我可以通过创建一个指向 class 类型的指针来实现这一点。我想知道为什么我可以声明指向 class 的指针,即使默认构造函数是私有的?这是一个示例程序。
// Example program
#include <iostream>
#include <string>
class OnlyOne{
public:
void Location(){
std::cout<<10<<std::endl;
}
private:
OnlyOne();
};
int main()
{
//does not work Location() is not a static member
//OnlyOne::Location();
// doesn't work because default constructor is private.
//OnlyOne one;
//one.Location();
OnlyOne* two=nullptr;
two->Location();
}
我一直在网上寻找是否可以找到答案,但一直找不到我要找的东西。
当您声明某种类型的指针时,该类型不必是可构造的。事实上,该类型甚至不必是完整的。所以,这一行:
OnlyOne* two = nullptr;
完全没问题。
注意这一行:
two->Location();
调用未定义的行为,因为 two
没有指向任何对象,因此没有可以调用 Location
成员函数的对象。
事实上,由于此类型不可构造,two
永远无法指向有效对象。您必须提供一种构造此类对象的方法,方法是提供 public 构造函数,或具有构造和 returns 此类对象的静态成员函数。
您可以使用单例模式来实现具有私有构造函数的 类:
// Example program
#include <iostream>
#include <string>
class OnlyOne{
public:
static OnlyOne* instance() {
static OnlyOne obj;
return &obj;
}
void Location(){
std::cout<<10<<std::endl;
}
private:
OnlyOne() { }
};
int main()
{
//does not work Location() is not a static member
//OnlyOne::Location();
// doesn't work because default constructor is private.
//OnlyOne one;
//one.Location();
OnlyOne* two=OnlyOne::instance();
two->Location();
}
假设我有一个带有私有构造函数的 class,并且 class 将用于表示单个对象。假设我有一些非静态成员,我想在不使用范围解析运算符的情况下访问它们。我注意到我可以通过创建一个指向 class 类型的指针来实现这一点。我想知道为什么我可以声明指向 class 的指针,即使默认构造函数是私有的?这是一个示例程序。
// Example program
#include <iostream>
#include <string>
class OnlyOne{
public:
void Location(){
std::cout<<10<<std::endl;
}
private:
OnlyOne();
};
int main()
{
//does not work Location() is not a static member
//OnlyOne::Location();
// doesn't work because default constructor is private.
//OnlyOne one;
//one.Location();
OnlyOne* two=nullptr;
two->Location();
}
我一直在网上寻找是否可以找到答案,但一直找不到我要找的东西。
当您声明某种类型的指针时,该类型不必是可构造的。事实上,该类型甚至不必是完整的。所以,这一行:
OnlyOne* two = nullptr;
完全没问题。
注意这一行:
two->Location();
调用未定义的行为,因为 two
没有指向任何对象,因此没有可以调用 Location
成员函数的对象。
事实上,由于此类型不可构造,two
永远无法指向有效对象。您必须提供一种构造此类对象的方法,方法是提供 public 构造函数,或具有构造和 returns 此类对象的静态成员函数。
您可以使用单例模式来实现具有私有构造函数的 类:
// Example program
#include <iostream>
#include <string>
class OnlyOne{
public:
static OnlyOne* instance() {
static OnlyOne obj;
return &obj;
}
void Location(){
std::cout<<10<<std::endl;
}
private:
OnlyOne() { }
};
int main()
{
//does not work Location() is not a static member
//OnlyOne::Location();
// doesn't work because default constructor is private.
//OnlyOne one;
//one.Location();
OnlyOne* two=OnlyOne::instance();
two->Location();
}