我有一个笨重设计的对象组合。 类X和Y是这样的设计,其中Y是X的分量为C++类设计撤消对其他类成员的修改
class Y {
public:
std::string _name;
Y(std::string name) : _name(name) {}
};
class X {
Y _y;
public:
X(std::string name) : _y(name) {}
Y getY() { return _y; }
Y* getYPtr() { return &_y; }
};
注意std::string _name
在Y
是公共的示意性表示。
我想要做的是通过X
的实例访问Y::_name
,为其写入新的值,并有可能在程序的其他部分轻松地撤消写操作。
我尝试如下:我使用Undo
对象包含三个信息:
- 的字符串指针在其上撤消生效
- 含有使用oldName
- 的字符串的字符串包含新名称
。
class Undo {
std::string _oldName;
std::string _newName;
std::string *_internalName;
public:
Undo(std::string *name) : _internalName(name) {}
void setOldName(std::string oldName) {
_oldName = oldName;
}
void setNewName(std::string newName) {
_newName = newName;
}
void undoToOldName() {
*_internalName = _oldName;
}
};
如果我想撤销写操作,我只需要调用undoToOldName()
方法Undo
对象。
例子:
X x("firstName");
Y *y = x.getYPtr();
// Prepare the undo object
Undo undo(&(y->_name));
undo.setOldName(y->_name);
undo.setNewName("secondName");
// Set new name
y->_name = "secondName";
// Output: secondName
std::cout << x.getY()._name << std::endl;
// Undo
undo.undoToOldName();
// Output: firstName
std::cout << x.getY()._name << std::endl;
我不同意这种设计喜欢的东西是必要的Y *
吸气。
作为一个约束,我无法改变作曲的设计。
您能否为此建议其他设计?
谢谢。
是否允许使用'X :: setY()'方法?如果是这样,它将允许移除'getYPtr()'和实现'X :: rollbackY()'方法。 – hmjd 2012-03-19 11:12:41
也许让你的Undo类成为Y的朋友,所以它可以设置'_y._name'?如果你想撤销记住哪个X或Y工作,它可以在构造函数中引用并使用初始化列表记录它以备后用。避免指针。坦率地说,尽管......:( – 2012-03-19 11:16:25
@hmjd谢谢你的评论,不过,这是不可能的,因为一个'X'有许多类似于'Y'的对象,其中只有一个是有效的,这是由一个Enumerate决定的,一旦我发现要编辑哪个'Y',我不想再遍历Enumerates了,另外,'Y'有很多'_y's,并不是所有的都是有资格申请撤消,我承认设计很丑陋,但那是我拥有的图书馆:)。 – 2012-03-19 11:26:12