你如何只分配给一个指针在c#为我的撤消重做类

How do you assign only to a pointer in C# for my undo redo class

本文关键字:指针 我的 重做 撤消 一个 分配      更新时间:2023-10-16

我试图创建一个撤消管理器,不管你传递什么对象。但是我不知道如何在c#中做到这一点。我想做一些事情,比如一个指向原始对象的指针,只改变指针指向的位置。

c#代码
public class UndoableObject<T> : IUndoableAction
{
    private T UndoObject;
    private T ClonedObject;
    private readonly string _name;
    public string Name
    {
        get { return _name; }
    }
    public UndoableObject(ref T ObjectToUndo, string name)
    {
        _name = name;
        UndoObject = ObjectToUndo;
        ClonedObject = ObjectExtensions.Copy<T>(ObjectToUndo);
    }
    public void Redo()
    {
        T temp = ObjectExtensions.Copy<T>(UndoObject);
        UndoObject = ClonedObject;
        ClonedObject = temp;
    }
    public void Undo()
    {
        T temp = ObjectExtensions.Copy<T>(UndoObject);
        UndoObject = ClonedObject;
        ClonedObject = temp;
    }
}

我想要发生的事情的c++实现

template<typename T>
public class UndoableObject : IUndoableAction
{
    private T *UndoObject;
    private T *ClonedObject;
    private string _name;
    public string GetName
    {
        return _name;
    }
    public UndoableObject(T *ObjectToUndo, string name)
    {
        _name = name;
        UndoObject = ObjectToUndo;
        ClonedObject = &ObjectExtensions.Copy(*ObjectToUndo);
    }
    public void Redo()
    {
        T *temp = &ObjectExtensions.Copy(*UndoObject);
        delete UndoObject;
        UndoObject = ClonedObject;
        ClonedObject = temp;
    }
    public void Undo()
    {
        T *temp = &ObjectExtensions.Copy(*UndoObject);
        delete UndoObject;
        UndoObject = ClonedObject;
        ClonedObject = temp;
    }
}

我知道可能有内存泄漏,但我写了c++没有编译它。

看一下以下内容:

//using System;
//using Sytem.Collections.Generic
public class UndoableObject<T>
{
    List<T> _list = new List<T>();
    string _name;
    int _step = 0;
    public UndoableObject(T source, string name)
    {
        _list.Clear();
        _list = new List<T>();
        _list.Add(source);
        _name = name;
        _step = 0;
    }
    public string GetName
    {
        get { return _name; }
    }
    public void Record(T item)
    {
        _list.Add(item);
        _step++;
    }
    public T Undo()
    {
        _step--;
        if (_step >= 0)
        {
            return _list[_step];
        }
        else
        {
            _step = 0;
            return _list[_step];
        }
    }
    public T Redo()
    {
        _step++;
        if (_step < _list.Count)
        {
            return _list[_step];
        }
        else
        {
            _step = _list.Count - 1;
            return _list[_step];
        }
    }
}

基本用法:

var pictureBox1 = new PictureBox();
var _bitmap = new Bitmap(300, 300);
var uo = new UndoableObject<Bitmap>(_bitmap, "bitmap");

撤销:

pictureBox1.Image = uo.Undo();

记录:

uo.Record((Bitmap)pictureBox1.Image);

重做:

pictureBox1.Image = uo.Redo();