要求定义一类A,其有私有成员name(string类型)及其他成员。请完成类A的定义,使得类A只能被实例化为唯一的一个对象。本题已经完成main函数编写如下,请提交其他相应代码(头文件引用部分,命名空间引用部分,类定义部分): int main() { string name1,name2; cin >> name1; cin >> name2; A* o1 = A::GetObject(name1); o1->Print(); A* o2 = A::GetObject(name2); o2->Print(); if (o1 == o2) { cout << "o1与o2指向的是同一个对象!" << endl; } delete o1; return 0; }
时间: 2024-03-12 12:47:43 浏览: 51
自己参考些资料写的string类(简单的一个类,大家看看然后指点下)
以下为相应的代码实现:
头文件引用部分:
```cpp
#include <iostream>
#include <string>
#include <unordered_map>
```
命名空间引用部分:
```cpp
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::unordered_map;
```
类定义部分:
```cpp
class A {
public:
void Print() { cout << name << endl; }
static A* GetObject(const string& name) {
if (instances.find(name) == instances.end()) {
instances[name] = new A(name);
}
return instances[name];
}
private:
A(const string& name) : name(name) {}
string name;
static unordered_map<string, A*> instances;
};
unordered_map<string, A*> A::instances;
```
在该类中,我们使用了一个私有的构造函数,以保证类只能被实例化为唯一的一个对象。为了实现该类只能被实例化为唯一的一个对象,我们还需要使用一个静态成员变量 `instances`,它是一个用于存储类的实例的无序映射表。在 `GetObject` 函数中,我们首先检查指定名称的实例是否已经存在,如果不存在,则创建一个新的实例并将其存储到 `instances` 中。最后,我们返回该实例的指针。
阅读全文