要求定义一类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-01-14 15:02:38 浏览: 101
头文件引用部分:
```cpp
#include <iostream>
#include <string>
#include <unordered_map>
```
命名空间引用部分:
```cpp
using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::unordered_map;
```
类定义部分:
```cpp
class A {
private:
string name;
static unordered_map<string, A*> objMap;
A(const string& n) : name(n) {}
public:
A(const A&) = delete;
A& operator=(const A&) = delete;
static A* GetObject(const string& name) {
if (objMap.find(name) == objMap.end()) {
objMap[name] = new A(name);
}
return objMap[name];
}
void Print() const {
cout << "My name is " << name << endl;
}
static void Destroy() {
for (auto it : objMap) {
delete it.second;
}
objMap.clear();
}
};
unordered_map<string, A*> A::objMap;
```
注意到这里我们使用了私有的构造函数和静态成员函数 `GetObject` 来保证只能被实例化为唯一的一个对象,并且使用了静态的成员变量 `objMap` 来维护实例对象的映射关系。在 `GetObject` 函数中,如果该对象还没有被创建,则创建一个新的对象;否则返回已经创建的对象。同时,我们还定义了一个静态的成员函数 `Destroy` 来释放所有创建的对象。
阅读全文