- 1 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 00:00:47 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.49【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1203478421/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 40 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 02:52:15 ]
- superのコンストラクタは初期化子で呼べるけど、何か別のことを言ってる?
- 41 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 03:10:10 ]
- 多重継承可能な言語でsuperはありえないな
- 42 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 03:21:07 ]
- むしろECMAScript風に配列を返せば
- 43 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 03:58:10 ]
- 他人が書いた基底クラスに、こんな書き方がありました
class Base { public: virtual void f() = 0; protected: Base() {} ~Base() {} }; 基底クラスのデストラクタは仮想にするべきなんですよね?でも、この基底クラスのデストラクタは仮想じゃない… 単なる書き忘れか?とか思ったんですが、よく見ると、デストラクタはprotectedになってます。ということは、 Base *p = new Derived(); delete p; // Base::~Base() はprotectedでアクセスできないのでコンパイルエラー となると思います。ちょっと混乱したんですが、こうすると、 「派生クラスをnewして基底クラスでdeleteができなくなる代わりに、仮想デストラクタにしなくても問題ない」ということでしょうか。 わざわざこうして仮想デストラクタにしない理由は、速度の理由でしょうか (それとも、new/deleteなんてしないで、普通にスタックに置いて使って欲しいっていう意味が込められてる?
- 44 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 04:04:40 ]
- あってる。
既定クラスでdelete出来なくなるかわりに、いちいち仮想関数が呼び出されるオーバーヘッドがなくなる。
- 45 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 04:21:20 ]
- Baseのポインタからインスタンスの破棄をしなくてもいい場合は処理速度を優先してそうする。
基本的に仮想関数を使うというのは、基底クラスからは静的には“見えない”関数を実行時に扱えるようにする為のもの。
- 46 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 07:27:51 ]
- C++のプログラムだけでラジオは作れますか?
AMとかFMの?
- 47 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 08:01:34 ]
- プログラムを走らせるハードによるんでないかい?
- 48 名前:デフォルトの名無しさん [2008/03/15(土) 11:17:00 ]
- ローカルでポインタのポインタを作る場合って、
2回newしないといけないのでしょうか? 例えば、下のようなことをしないといけないですか? int** getPointerPointer() { int i = 123; int* p = new int;//int値のためのメモリをロック(1回目) *p = i; int** pp = new int*;//intポインタのためのメモリをロック(2回目) *pp = p; return pp; } それともポインタのポインタだけnewすれば、 必要なメモリを全部ロックしてくれるんでしょうか?
- 49 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 11:42:53 ]
- >>41
単一継承している時だけ使えるのなら問題はない。
- 50 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 11:45:09 ]
- >>48
>ローカルでポインタのポインタを作る場合って、 >2回newしないといけないのでしょうか? ローカル変数としてポインタのポインタを作りたいだけなら、int **p; と宣言するだけでいい。 >それともポインタのポインタだけnewすれば、 >必要なメモリを全部ロックしてくれるんでしょうか? そんなことはない。自分でnewしたものしか確保されない。 そもそも>>48のコードを見ると、newしているとのはintとint*だけで、ポインタのポインタ(int**)はnewしていないが。 自分がやろうとしていることをうまく説明できていない、または 自分がその関数のなかで何をしたいのか整理できてないでしょ。
- 51 名前:50 mailto:sage [2008/03/15(土) 11:46:16 ]
- >そもそも>>48のコードを見ると、newしているとのはintとint*だけで、ポインタのポインタ(int**)はnewしていないが
なんか変なこといってた。ゴメン、無視して。
- 52 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:00:24 ]
- 何をやりたいのかよく分からないという点に間違いは無いから
完全に無視されても困るかな。 こういう関数があった場合、 void show(const int* const* array_2dim, int i_size, int j_size) { for(int i = 0; i < i_size; ++i) { for(int j = 0; j < j_size; ++j) { std::cout << array_2dim[i][j] << ", "; } std::cout << std::endl; } } こういう風に使うなら new なんて要らないし、 const int array0[] = { 1, 2, 3 }; const int array1[] = { 4, 5, 6 }; const int array2[] = { 7, 8, 9 }; const int* const array_2dim[] = { array0, array1, array2 }; show(array_2dim, 3, 3); こういう風に使うなら new を2回使う。 int** array_2dim = new int*[3]; for(int i = 0, n = 1; i < 3; ++i) { array_2dim[i] = new int[3]; for(int j = 0; j < 3; ++j, ++n) { array_2dim[i][j] = n; } } show(array_2dim, 3, 3);
- 53 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:06:01 ]
- ていうかロックってどこから出てきたの?
- 54 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:08:31 ]
- メモリの確保のことをロックとか俺用語使ってる気がする。
- 55 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:12:30 ]
- というと、もしかしてmalloc()はマ・ロック?
- 56 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:27:11 ]
- マルロック
- 57 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:35:57 ]
- えむ あ ろっく
- 58 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:42:53 ]
- memory allocation lock
それをロックするなんてとんでもない!
- 59 名前:デフォルトの名無しさん [2008/03/15(土) 16:03:21 ]
- マルチスレッド処理を勉強してます。
現在、別スレッドからメインスレッドで処理するときはPostMessageを使ってますが、 他によい方法はありますか。
- 60 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 16:13:35 ]
- 良いかどうかわからないけど、自前で処理キューを作って
メインループをMsgWaitForMultipleObjectsでまわすとか・・・
- 61 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 16:37:13 ]
- >>60
よくこの文章の意味が判ったなぁ。 >別スレッドからメインスレッドで処理する
- 62 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 16:41:21 ]
- 普通に解るけど
- 63 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 17:53:54 ]
- マルチスレッドスレか Win32API スレに行った方がいいと思うが。
- 64 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:02:32 ]
- とあるメソッドの中で
オブジェクトを生成してあれこれする時 newして操作するのと 一時オブジェクトとして生成して操作するのは どちらのほうが一般的なんでしょうか?
- 65 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:07:18 ]
- new する必然性があるなら new するし、
そうする必然性が無いなら積極的には new しない。
- 66 名前:デフォルトの名無しさん [2008/03/15(土) 21:12:33 ]
- vectorで、循環しているやつをつくりたいときはどうすればよいですか?
つまり、 vector<int> a(10); のとき、 a[10]と書いてa[0]の意味になってくれるとうれしいんですが。 いまは添字をif文で判定してます。
- 67 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:13:55 ]
- i が必ず正なら a[i % 10] でいける。
- 68 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:14:01 ]
- 継承してoperator[]をオーバーライドすればいいんじゃね。
イテレータはしらね
- 69 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:18:42 ]
- 仮想デストラクタでない vector の継承は危険だな。
内包して似たクラスを作った方がいい。
- 70 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:21:36 ]
- もしかしたらboost.circular_bufferでいいのかもしれない
- 71 名前:48 mailto:sage [2008/03/15(土) 21:38:34 ]
- >>50
ありがとうございます。 ポインタのポインタはローカル変数で使うのでなく、 関数内で作った後、関数外の色んな場所で使います。 色んな場所で使うんですが、 中身を一括で変更しないといけない時があったので、 ポインタのポインタにしました。
- 72 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:40:36 ]
- 52 は無視か・・・。
- 73 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 22:22:23 ]
- >>72
まあそういうこともある。
- 74 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 22:46:55 ]
- 某RPGの白魔法風にメアロケとかなんかそういう呼び方ないの?w
- 75 名前:48 mailto:sage [2008/03/15(土) 22:54:31 ]
- いや、無視したわけじゃないんですが。
イマイチ言わんとしていることがよく分かりませんでした。 下の用途でも、 int** array_2dim = new int*[3]; ←は、 int* array_2dim[3]; ←でいいんじゃなかと思うんですが。
- 76 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:00:23 ]
- >>74
ねぇよw 一瞬何のことかとw
- 77 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:04:13 ]
- >>75
配列のサイズがコンパイル時に決まるならそれでいいし、 コンパイル時に決まらないなら new するしかない。
- 78 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:08:10 ]
- new するしないかはやりたいことによって決まるのであって、
int** を使うから new を使うとかそういうことで決まるものではない。
- 79 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:11:52 ]
- コンストラクタの中で冷害が起きるとデストラクタは呼ばれるの?
- 80 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:12:40 ]
- オブジェクトの生成が終わってないのでデストラクタは呼ばれない。
- 81 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:12:57 ]
- >>79
冷害がおきると米が不作になります
- 82 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:13:05 ]
- まだできてないモノの後始末をどう付けろというのだ
- 83 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:13:19 ]
- でも構築済みのメンバ変数のデストラクタは呼ばれる。
- 84 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:13:23 ]
- >>79
構築済みの基本クラスとメンバ変数の分は呼ばれる 自分のは呼ばれない
- 85 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:26:08 ]
- 一次元配列のアドレスを関数に渡して手を加えたいんだけど、
できれば例文を使ってやり方を示していただけませんか
- 86 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:27:37 ]
- >>79
他の人が書いてる通り、構築済みメンバのみ呼ばれる。 あと、コンストラクタから例外を出してはいけないという迷信を信じないようにね。
- 87 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:31:58 ]
- >>85
#include <iostream> void add(int* x, const int* y, int size) { for(int i = 0; i < size; ++i) { x[i] += y[i]; } } void show(const int* x, int size) { for(int i = 0; i < size; ++i) { std::cout << x[i] << ", "; } std::cout << std::endl; } int main() { int a[5] = { 1, 2, 3, 4, 5 }; int b[5] = { 5, 4, 3, 2, 1 }; add(a, b); show(a); }
- 88 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:35:15 ]
- >>87
ありがとうございます。メモ帳に保存して勉強します。
- 89 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:36:24 ]
- サイズ渡すの忘れてたよw
add(a, b, 5); show(a, 5); な。
- 90 名前:デフォルトの名無しさん [2008/03/15(土) 23:41:30 ]
- >>67-69
ありがとうございます。とりあえず67さんの方法でやってみようと思いますが、68と69さんの方法って どうやればいいですか?いちおうこんな感じに書いてみたのですが、template <class T> class cvector : public std::vector<T> { T operator[](int n) { return this[n % this->size()]; } };
- 91 名前:デフォルトの名無しさん [2008/03/15(土) 23:43:06 ]
- pc11.2ch.net/test/read.cgi/streaming/1202224933/
740 :ゴキ ◆KBolwFjGFs :2008/03/02(日) 16:10:33 ID:XSKtFMSK0 いつになったら五期鬼太郎43・44・46・47話うpしてくれるんですか>< 750 :ゴキ ◆KBolwFjGFs :2008/03/02(日) 17:10:36 ID:XSKtFMSK0 いつになったら五期鬼太郎43・44・46・47話うpしてくれるんですか>< 762 :ゴキ ◆KBolwFjGFs :2008/03/02(日) 23:15:47 ID:XSKtFMSK0 いつになったら五期鬼太郎43・44・46・47話うpしてくれるんですか>< 772 :ゴキ ◆KBolwFjGFs :2008/03/03(月) 02:23:17 ID:FCp+FnG70 いつになったら五期鬼太郎43・44・46・47話うpしてくれるんですか>< 811 :ゴキ ◆KBolwFjGFs :2008/03/04(火) 00:55:53 ID:4/B+VsKZ0 いつになったら五期鬼太郎43・44・46・47話うpしてくれるんですか><
- 92 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:46:06 ]
- assert(n >= 0); がないと危険だな。
まあそれはいいとして、 vector を継承すると std::vector<T>* v = new cvector<T>; とした場合に delete v; の動作が未定義だし、 vector<T>& に渡せるけど、 operator[] が仮想関数じゃないから危険だな。
- 93 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:47:10 ]
- this 使うなら (*this)[n % size()] だし、
operator[](n % size()) でもいいな。
- 94 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:51:04 ]
- いくらなんでも std::vector<T>* は無いだろw
- 95 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:52:04 ]
- int -> size_t
public -> private
- 96 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:55:57 ]
- n に負の数を渡した場合のチェックが出来ないのが size_t の悩みどころだな。
リングバッファだと 「範囲外のインデックス」 ってのが存在しないから 0 <= n && n < size() なら有効・・・とかできないし。
- 97 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:00:29 ]
- リングバッファならむしろ負の数サポートが欲しいところ。
v[-1] == v[size()-1]
- 98 名前:デフォルトの名無しさん [2008/03/16(日) 00:26:29 ]
- >>92-97
ありがとうございます。 アドバイスを総合して実装してみたのですが、コンパイルが通りません。 #include <iostream> #include <vector> using namespace std; template <typename T> class cvector : public std::vector<T> { T operator[](const int n) const { int index = (n >= 0) ? n : this->size()-n; // assert(n >= 0); return (*this)[index % this->size()]; } }; int main(){ cvector<int> vec; vec.push_back(11); cout << vec[0]; return 0; } コンパイルエラーはこうです。 test.cpp:6: error: 'T cvector<T>::operator[](int) const [with T = int]' is private//T operator[](const int n) const {の行です。 test.cpp:15: error: within this context // cout << vec[0]; の行です。 どうかもうすこし教えてください。
- 99 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:28:34 ]
- >>98
エラーメッセージそのまんまだろ。何がわからないんだ?
- 100 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:30:18 ]
- private ってのは危険だから private 継承しろって意味じゃないのか
- 101 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:43:03 ]
- operator[]の前行にpublic:
- 102 名前:デフォルトの名無しさん [2008/03/16(日) 00:45:09 ]
- >>100
private継承しようとするとpush_backが使えなかったので、public継承にしました。 >>99 これってどう継承してもよびだせないということですか?
- 103 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:51:53 ]
- class cvector -> struct cvector
>int index = (n >= 0) ? n : this->size()-n; this->size()-nだとリングにならないよ (n >= 0) ? n : (size() - (-n % size())); あと、 と書くとレスに連続した半角空白を入れられる
- 104 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:53:38 ]
- operator[] が private だから呼べねーよ!
ってコンパイルエラーだな。
- 105 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:05:00 ]
- 負の数を認めない型の値の最上位ビットが立っているかどうかなら、
1 << (sizeof(type) * 8 - 1) とand取ってifすれば得られるぜ。
- 106 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:10:48 ]
- そこまでして符号無しにこだわる必要は無いと思うというか、
その時点で引数を符号無しにするべきではないと思うというか。
- 107 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:26:05 ]
- 符号なしにしないとオーバーライドできない、っていうか、
operator[]はvirtualじゃないからオーバーライドできない。
- 108 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:26:55 ]
- ならオーバーロードで
- 109 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:32:28 ]
- そもそも vector を public 継承しようとしている時点であれというか。
vector とは性質的に別ものだから内包して自分でメンバ定義していくのが正しい。 単純な委譲で済む関数はインライン関数にしとけばインライン展開されるだろうし。 どうしても継承したいなら private 継承して、 size() とかそのままでいい関数は using する。
- 110 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:34:09 ]
- つうか普通このケースでは包含だよなぁ
- 111 名前:デフォルトの名無しさん [2008/03/16(日) 01:42:27 ]
- 質問よろしいですか?
0 1 2 3 4 5 6 7 8 このようになっている時にクラーメルの公式のように(掛け算ではありませんが) 1+5+6というふうにするにはfor文でどのようにすればいいのでしょうか?
- 112 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:57:23 ]
- int data[3][3]; とするならば
int sum = 0; for(int i=0; i<3; i++) { int x = data[i][(i + 1) % 3]; sum += x; } // sum = 1+5+6 = 12
- 113 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:01:02 ]
- 3つしかあり得ないならハードコーディングするのも手だと思う。
for 使うなら % だろうけど、逆向きの時は少し注意が必要(i が負になるとマズい)。
- 114 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:05:16 ]
- 配列アクセス用のインデクステーブルを作るとか
- 115 名前:デフォルトの名無しさん [2008/03/16(日) 02:05:33 ]
- >>112,113
すいません、言葉が足りてませんでした 配列は固定ではなくN×N行列で ポインタを*paとする時 pa pa+1 pa+2 pa+3 pa+4 pa+5 pa+6 pa+7 pa+8 でどう求めるかということでお願いします
- 116 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:12:47 ]
- [i][(i + 1) % 3] を [i * N + (i + 1) % N] にするだけでしょ。
- 117 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:14:36 ]
- for 使うなら % だろうけど、逆向きの時は少し注意が必要(i が負になるとマズい)。
- 118 名前:デフォルトの名無しさん [2008/03/16(日) 02:21:37 ]
- >>116
i=0 0*3+(0+1)%3 = 0 i=1 1*3+(1+1)%3 = 3 i=2 2*3+(2+1)%3 = 7 こうなるんじゃないんですか?
- 119 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:23:30 ]
- >>118
頭大丈夫か
- 120 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:26:40 ]
- 小学生からやりなお(ry
- 121 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:26:50 ]
- >>118
とりあえず今日はもう寝とけ
- 122 名前:デフォルトの名無しさん [2008/03/16(日) 02:26:54 ]
- >>119
すいません勘違いしてました どうもありがとうございました
- 123 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 11:30:09 ]
- ∧∧
/ 中\ ( `ハ´) いつになったら福田康夫は日本人が犯人だと認めるアルか ( ⊃┳⊃ c(_)ヘ⌒ヽフ 【中国産・毒ギョーザ】日本人が“犯人”? 共同通信の日本人記者拘束で中国のネット世論沸騰★5 (朝日(-@∀@) mamono.2ch.net/test/read.cgi/newsplus/1204264902/ ≡≡≡ ◎―◎⊃⊃ キコキコ
- 124 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 11:40:32 ]
- 毒餃子は中国工場内での混入がほぼ間違いなくなったよな。
濃度は3000ppmって。。漬け置きレベルらしいな。 シナはどこまでも外道。オリンピック開催させるなよ。
- 125 名前:デフォルトの名無しさん [2008/03/16(日) 11:41:33 ]
- 102です。以下のように実装してみて、動作することを確認しました。でも2点質問させてください。
(1)vectorを継承した方で、size()はusingsしておけばいいといわれましたが、やり方がわかりません。 でも知りたいのでどうか教えてください。 (2)同じくvectorを継承した方で、public継承するのはよくないと言われましたが、(繰り返しになりますが) private継承するとpush_back等のvectorクラスの機能が使えないと思います。ここはどうするべきなのでしょうか? template <typename T> class ring_vector { public: T operator[](const int n) const { int index = (n >= 0) ? (n % v.size()) : (v.size()-(-n % v.size())); return v[index]; } std::vector<T> v; }; template <typename T> class ring_vector2 : public std::vector<T> { public: T operator[](const int n) const { int index = (n >= 0) ? (n % this->size()) : (this->size()-(-n % this->size())); return std::vector<T>::operator[](index); } };
- 126 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 12:00:48 ]
- >>125
(1)レスを追ってないから知らん (2)転送関数
- 127 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:00:00 ]
- Linux+gccでCPUの型番や周波数などを取得する方法を教えてください
- 128 名前:103 mailto:sage [2008/03/16(日) 13:00:16 ]
- >int index = (n >= 0) ? (n % v.size()) : (v.size()-(-n % v.size()));
>>103のは元のソースがreturn [index % size()];なので、それを前提としてたんだけど・・・。 return v[index];にするなら、負の数の方も、もう一度%しないと、 n == -size() のとき、return v[size()]; になっちゃうよ。
- 129 名前:103 mailto:sage [2008/03/16(日) 13:02:20 ]
- return v[index];
を return v[index==size()?0:index]; にするのでも良いけど。
- 130 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:04:24 ]
- >>125
ring_vectorの方で良いよ。 継承するの変だと思うし。
- 131 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:04:53 ]
- system("cat /proc/cpuinfo");
- 132 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:12:54 ]
- クラスで場合によっては定義しない変数は宣言できますか?
ありましたら、どうすればいいか教えてください。
- 133 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:17:07 ]
- template <typename T>
class ring_vector3 : private std::vector<T> { typedef std::vector<T> parent; public: T operator[](const int n) const { int index = (n >= 0) ? (n % this->size()) : (this->size()-(-n % this->size())); return parent::operator[](index); } using parent::push_back; }; みたいな。
- 134 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:24:34 ]
- >>132
質問をもう少しkwsk
- 135 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:26:44 ]
- >>132
使わなければ
- 136 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:32:21 ]
- 使わなくても定義は必要じゃね
- 137 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:38:31 ]
- だから、仮想デストラクタを持たないvectorを継承すんなよw
- 138 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:40:56 ]
- そろそろvirtualから離れようぜ
- 139 名前:133 mailto:sage [2008/03/16(日) 13:48:13 ]
- 何か問題が?
- 140 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:53:31 ]
- >>139
使い方によってはvectorのデストラクタが呼ばれないことがある。
|

|