No.3ベストアンサー
- 回答日時:
続きです。
void test()
{
std::list<CObject> l;
CObject a(3, "CObject - 1");
for(std::size_t n = 0; n < a.size(); ++n)
a[n] = CPoint(n, n);
::Print(a);
std::cout << a.GetName() << "を退避" << std::endl;
l.push_back(a);
a = CObject(5, "CObject - 2");
for(std::size_t n = 0; n < a.size(); ++n)
a[n] = a[n] + CPoint(n + 2, n + 1);
::Print(a);
std::cout << a.GetName() << "を退避" << std::endl;
l.push_back(a);
a = l.front();
std::cout << a.GetName() << "を復元" << std::endl;
::Print(a);
}
int main()
{
::test();
//VC++特有
//const int result = ::_CrtDumpMemoryLeaks();
return 0;
}
No.4
- 回答日時:
ディープコピーの話ではないですが。
UNDO/REDOを実装するのは、
処理対象のクラス自体を時系列にそって全て覚えておく
でも、まあいいといえばいいですが
これだと、ものすごくメモリを食います。
普通は、そうではなくて、
処理対象のクラスのインスタンス自体を覚えておくのではなくて、
なんらかの処理そのものを表わすクラス(コマンドクラス)を作って、
これを覚えておきます。UNDOしたいときには、現在の処理対象のクラスに対して、処理を逆に適用します。
つまり、処理対象のクラスの時系列自体を覚えておくのではなくて、その差分だけをおぼえておくというか。
で、プログラムを組んでいると、こういうことをしたくなることはよくあるんで、
デザインパタンという形でまとめられています。
Commandパタンと呼ばれています。
http://www.google.com/search?hl=ja&q=command%E3% …
この回答への補足
回答ありがとうございます。
CommandパターンのUndo/Redoについて検討しましたが、
元々のコーディングがまったくその辺のことを考慮して
いない為、今回は適用を断念しました。
No.2
- 回答日時:
こんばんは。
そのポインタがバッファを割り当てた物であればSTLのvector辺りで代用すれば、悩む必要もなくなるのでは。
以下はディープコピーです。コピーコンストラクタで処理をします。参考程度で。
#include<stdexcept>
#include<iostream>
#include<string>
#include<list>
#include<algorithm>
struct CPoint
{
explicit CPoint(int x = 0, int y = 0) : x(x), y(y){}
int x;
int y;
};
const CPoint operator + (const CPoint& l, const CPoint& r)
{return CPoint(l.x + r.x, l.y + r.y);}
struct CObject
{
explicit CObject(std::size_t size = 1, const std::string& name = std::string("CObject"))
: m_name(name), m_size(std::max(1U, std::min(size, 256U))), m_ppt(new CPoint[m_size])
{}
CObject(const CObject& r)
: m_name(r.m_name), m_size(r.m_size)
{
//ココがディープコピー
this->m_ppt = new CPoint[this->m_size];
std::copy(r.begin(), r.end(), this->begin());
}
CObject& operator = (const CObject& r)
{
if(&r == this)return *this;
this->~CObject();
new (this) CObject(r);
return *this;
}
~CObject()
{
if(this->m_ppt == NULL)return;
delete this->m_ppt;
this->m_ppt = NULL;
}
void SetName(const std::string& name){ this->m_name = name; }
const std::string GetName() const { return this->m_name; }
std::size_t size() const { return this->m_size; }
CPoint* begin(){ return this->m_ppt; }
CPoint* end(){ return this->m_ppt + this->m_size; }
const CPoint* begin() const { return this->m_ppt; }
const CPoint* end() const { return this->m_ppt + this->m_size; }
CPoint& operator [](std::size_t n)
{
return const_cast<CPoint&>(static_cast<const CObject&>(*this)[n]);
}
const CPoint& operator[](std::size_t n) const
{
if(n >= this->m_size)throw std::range_error("error");
return this->m_ppt[n];
}
private:
std::size_t m_size;
CPoint* m_ppt;
std::string m_name;
};
void PrintPoint(const CPoint& p)
{
std::cout << "[x : " << p.x << "][y : " << p.y << "]" << std::endl;
}
void Print(const CObject& a)
{
std::cout << a.GetName() << "を表示" << std::endl;
std::for_each(a.begin(), a.end(), &::PrintPoint);
}
No.1
- 回答日時:
クラス構造がどうなってるか分かりませんが、可変長の文字列が有るなら、ポインタの先とかを何処かメモリ上にコピー展開しておくとか、ストリングスオブジェクトをコピーしておかないといけませんよね。
単純では無いと思いますけど、UNDOするストリングスオブジェクト毎に設計する方が良いんじゃないですか?
http://www.geocities.jp/naosacra/mops/Manual/III …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- Excel(エクセル) Excel 本人の名前だけが入った表を印刷したい。 3 2023/05/10 11:38
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Visual Basic(VBA) 特定の文字を含むシートだけマクロ処理をしたい 1 2023/05/22 01:43
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラーが出ているのですが...
-
空ENTERの判別
-
なぜ、C++の標準ヘッダをインク...
-
【C++】ヘッダ内でstringを格納...
-
#define中の#のエスケープ
-
OpenCVでRAW画像(カラー)を開...
-
指定した文字を削除したい
-
C言語のエラーを修正したい
-
平均値を関数を用いて出力した...
-
JPEGやPNGが読めるLoadImage関数
-
#include "fstream.h"
-
コンパイルできません
-
STLでポインタのリストをsort()...
-
Linux Ubuntu19.10でQt5.14.1の...
-
C言語からgnuplot呼び出し
-
構造体に決められた文字列を入...
-
構造体配列のvectorへの変換と...
-
VC++で文字列から任意の文字を...
-
2重の(?)の#include
-
std::map の const 修飾について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
switch文のエラーについて
-
空ENTERの判別
-
なぜ、C++の標準ヘッダをインク...
-
【C++】ヘッダ内でstringを格納...
-
C++での <iostream.h>と<iostre...
-
#include "fstream.h"
-
#define中の#のエスケープ
-
JPEGやPNGが読めるLoadImage関数
-
リモートデスクトップの接続元I...
-
CStringとString
-
string型のフォーマット書式指...
-
std::map の const 修飾について
-
VHDLのsignedとunsignedの違いは?
-
このプログラミング誰か教えて...
-
構造体配列のvectorへの変換と...
-
指定した文字を削除したい
-
構造体に決められた文字列を入...
おすすめ情報