C++相談室 part56
..
239:デフォルトの名無しさん
07/08/07 07:50:42
>>236
なんでバイナリを扱う必要があったら istringstream を見送るの?
240:デフォルトの名無しさん
07/08/07 09:01:36
stringという名前が付いてるからバイナリは扱えないと思っているんだろうな
241:デフォルトの名無しさん
07/08/08 20:13:23
義務教育もしっかり受けてるのに
x = x +1
が疑問でもなんでもない俺は負け組
242:デフォルトの名無しさん
07/08/08 20:15:25
柔軟な思考は大事
固定観念はよくない
243:デフォルトの名無しさん
07/08/08 21:16:13
もう疑問を持ったかどうかすら覚えてないわ
244:デフォルトの名無しさん
07/08/08 21:57:28
>>241
x = x * x + Cならマンデルブロ集合なんだけどね。
245:デフォルトの名無しさん
07/08/09 10:46:54
>>241
むしろそのへんの切り替えが高速にできない子は算数のできない子
246:デフォルトの名無しさん
07/08/09 19:51:16
リアル演算子オーバーロードだよな。
247:デフォルトの名無しさん
07/08/09 19:59:43
要は「今まで習った常識・ルール」に囚われてしまっていて、
新しいルール、新しい前提の上でのゲームには一歩も踏み出せないってことだからな
その程度の頭の柔軟性が無いのでは算数やプログラミングに限らず
何やってもだめ
248:デフォルトの名無しさん
07/08/10 09:40:31
何でも受け入れるのもあれだけどな。
そこに疑問を持ち、考察し、納得する、というプロセスをだな・・・
249:身の程知らず
07/08/10 12:01:33
C++の文法に疑問を持つのは、よほどの天才か身の程知らずのどちらかだろ。
もちろんもっと人間にもコンパイラにも分かりやすくて、すばらしい文法は作れただろうが、
今のような位置を占めているかどうかは疑問だ。
以下、俺様演算子を定義できる機能とか、
Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
↓禿のお気に入りだったマルチメソッドなどについて語ろう↓
250:デフォルトの名無しさん
07/08/10 12:04:48
>以下、俺様演算子を定義できる機能とか、
演算子オーバロードではお気に召しませんか?
>Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
C99のプリプロセッサではお気に召しませんか?
それならDをどうぞ。
251:デフォルトの名無しさん
07/08/10 12:06:05
Lispじゃねぇの
252:デフォルトの名無しさん
07/08/10 12:10:18
開発当時はのんびり言語仕様考えるヒマなかったんだろう。
シェア争いを制するために時間を惜しんだんだろ
結局当時は高級言語に負けたが。
253:デフォルトの名無しさん
07/08/10 12:11:29
俺様演算子っていうと、Prolog みたいなやつか。
254:デフォルトの名無しさん
07/08/10 14:42:56
俺様演算子っていうと、Haskell みたいなやつか。
255:デフォルトの名無しさん
07/08/10 14:58:06
Forth なら何でもありだな
256:デフォルトの名無しさん
07/08/10 15:05:03
禿は演算子オーバーロードは必要最小限に抑えたほうが良いと言ってなかったか
257:デフォルトの名無しさん
07/08/10 15:54:28
おまいは禿が死ねって言ったら死ぬのか?
258:デフォルトの名無しさん
07/08/10 16:32:06
詭弁のガイドライン
259:デフォルトの名無しさん
07/08/10 17:05:23
おまいは「おまいは禿が死ねって言ったら死ぬのか?」ってレスを見たら詭弁だと短絡的に思うのか?
260:デフォルトの名無しさん
07/08/10 17:07:20
次の相談者の方、どうぞ↓
261:デフォルトの名無しさん
07/08/10 17:10:30
禿はC++に関しての第一人者だけど、死に関しての第一人者じゃない。
詭弁じゃないと言うなら、何をもって
「禿は演算子オーバーロードは必要最小限に抑えたほうが良いと言ってなかったか」
「おまいは禿が死ねって言ったら死ぬのか?」
というのが同じ重みがあるとするのかを明確化しろ。
262:デフォルトの名無しさん
07/08/10 17:44:52
物事の良し悪しは他人任せにせずに自分で考えましょう、
と注意する場合の定型句だと思うが。
263:デフォルトの名無しさん
07/08/10 18:16:58
ならそう書けばいいんじゃないかなw
264:デフォルトの名無しさん
07/08/10 18:21:40
なんでも平たく書き下すんじゃなく、
慣用句等あれば使うのが文化って奴だろ
その点APLなんかすごいぞ
265:デフォルトの名無しさん
07/08/10 18:26:07
論点ずらしの天才
266:デフォルトの名無しさん
07/08/10 18:34:21
演算子と人の生死を結びつけるところが正直よく分からん
267:身の程知らず
07/08/10 18:45:10
禿があれほどD&Eで多くのページを割いて、規格に入らなかったことを悔しがっているのに、
一言も突っ込まれないマルチメソッド哀れ。
まあ、正直言ってまず使わないと思うけど。
268:デフォルトの名無しさん
07/08/10 19:05:50
(動的)マルチメソッドマジ欲しい。
Lokiにもマルチディスパッチの実装あるけど、さすがに面倒だ。
でも、コンパイラの実装大変そうだよね。
演算子オーバーロードはPEGとかEBNFを実装するためにあると思うんだ。
269:デフォルトの名無しさん
07/08/11 12:00:15
質問があります。
class A
class B
class C
があるとして、class Cをclass AとBのメンバに持たす時、
class AとBのインスタンスを複数作った場合、メンバであるclass Cも
複数作成されてしまうと思います。
そこで、classA、B共に一つずつしかclass Cを作らないようにしたいのですが、
こういう場合はstaticメンバ変数にするしかないのでしょうか?
ていうのも、static変数はクラス外に宣言を書かないといけないためclass A,Bみたいなクラスを
たくさん作ると大変なんですよね・・・。
class A,Bの基底クラスに持たすことはできませんし・・・
良い方法があればご教授ください。
270:デフォルトの名無しさん
07/08/11 12:27:32
つ 静的局所変数
271:デフォルトの名無しさん
07/08/11 12:45:41
>>269
CRTP が使える場面かもしれない。
でも、そんなに静的変数が要るのかどうかが疑わしい。
クラス外に定義が必要なのが嫌だというのも理解しかねる。
272:デフォルトの名無しさん
07/08/11 16:51:02
template<UINT nID>.
class Base
{
static C s_c;
};
template<UINT nID>
C Base<nID>::s_c;
class A : public Base<0>
{};
class B : public Base<1>
{};
273:269
07/08/11 19:13:13
>>270-272
返事が遅れてしまい申し訳ありませんでした。
レスありがとうございます。
CRTPってデザインパターンの一種みたいですね。
>>272のソースがCRTPなのでしょうか?
面白そうなので試してしみようと思います。
274:デフォルトの名無しさん
07/08/11 19:43:47
それは全然違う。
CRTPはベースクラスが、継承クラスの型を知ること
275:269
07/08/11 19:55:41
>>274
なるほど。どもです。
ちょっとググって来ます。
276:デフォルトの名無しさん
07/08/11 23:40:11
CRTPてこんなの
template<class derived_t>
class TLogPolicy {
public:
void log() { log_ += (static_cast<derived_t*>(this))->data_ + "\n"; };
protected:
TLogPolicy() {};
private:
std::string log_;
};
class TManager : public TLogPolicy<TManager> {
public:
void test() { log(); };
private:
std::string data_;
friend TLogPolicy<TManager>;
};
けっこう有名なテクニックだとおもうけど?
277:269
07/08/12 02:50:34
>>276
ありがとうございます。
まだ、実装はしてませんが、>>276さんのソースを弄った感じ私が求めてたモノかもしれませんw
ただ、1行目のtemplate<class derived_t>って言うのがよく分からないのですがなんなのでしょうか??
278:デフォルトの名無しさん
07/08/12 03:00:57
>>277
ごく普通のテンプレート宣言だよ。これぐらいは調べてくれ。
279:デフォルトの名無しさん
07/08/12 03:03:18
>>278
あ、なるほど、template<class T>みたいなもんですかw
てっきり、特殊なことやってるのかと思いましたw
すいません。
280:269
07/08/12 15:09:02
また、質問させていただきたいのですが、>>276さんのソースを簡易化して、
template<class derived_t>
class TLogPolicy {}
class TManager : public TLogPolicy<TManager> {};
class UManager : public TLogPolicy<UManager> {};
class Cont {
std::list<TLogPolicy *> cont;
template <class derived_t>
void add(TLogPolicy<derived_t> *hoge) {
cont.push_back(hoge);
}
};
として、TManager,UManagerのインスタンスを複数作り、
Contクラスのcontに格納したいのですがどうすればいいのでしょうか?
とりあえず、1つのコンテナで管理したいのです。
実際、追加しようとすると、変換できないなどとエラーがでます。
TManagerの適当なメンバ関数から、Cont::add<TManager>(this);
よろしくお願いします。
281:デフォルトの名無しさん
07/08/12 15:15:38
>>280
コンテナに入れたいだけならもういっこ基底クラスを置くだけでいいだろう。
コンテナの要素に対して何をしたいのかによっては、それじゃ不満だろうが。
ソース貼るなら、ちゃんと問題(エラー)が再現できるコード作れよ。
282:デフォルトの名無しさん
07/08/12 15:50:20
どうもtemplateとclassの関係を判っていないようだな。
テンプレートのポインタ(TLogPolicy *)なんてのは無いよ。
TLogPolicy<TManager>とTLogPolicy<UManager> は別の型だから、
同じ基底クラスとして扱うことは出来無いし。
面倒だから簡単にboost::anyのコンテナ使う手もあるかね。
283:269
07/08/12 19:54:07
>>281-282
レスありがとうございます。
>ソース貼るなら、ちゃんと問題(エラー)が再現できるコード作れよ。
申し訳ありません。以後気を付けます。
templateとclassの関係などもうちょっと勉強し、
レスを参考に少し考えてみることにします。
284:デフォルトの名無しさん
07/08/12 23:02:30
>>283
多分コンパイル通そうと尋常じゃない時間を割くと思われるので一つ教えてあげる。
テンプレート関数はこう書く。
template <class T> void foo( T param ) { ... }
テンプレートクラスはこう書く。
template <class T> class bar { T member; };
しかし、クラスにテンプレートの関数(これをメンバテンプレートという)
を書くことはできない。
class hoge {
template <class T> void f( T param ) { ... } // ←コンパイルエラー
}
つまり 280 のコードでやろうとしていることは、そもそも不可能なんだよ。
285:デフォルトの名無しさん
07/08/12 23:16:39
>>284
メンバテンプレートって呼び名が付いてるのに書くことはできないんだ。ふーん。
コンパイラ何使ってるの?
286:デフォルトの名無しさん
07/08/12 23:19:40
たしかVC5か6かなんかでは出来なかっただけ。
287:デフォルトの名無しさん
07/08/12 23:45:41
vc6 では出来る。
が、一部文法が通らないな。
hoge h;
h.f(1); // OK
h.f<float>(1); // NG
vc5 は知らん。
288:284
07/08/12 23:46:09
あ゛ぅ、手元のコンパイラでやってみたらできた・・・
>>283 すまん、284 は全くのマチガイ。忘れてくれ m(_ _)m
>>285 VC2005。
>>286 今試したら VC6 ではできた。VC 5 以前はわからんけど。
いぢめないで。。。
289:デフォルトの名無しさん
07/08/12 23:59:00
ちょっと興味が湧いたので実装してみた。
template<class derived_t>
class TClassData {
private:
template<typename T>
string& data(T* t) {
static string data;
return data;
}
friend derived_t;
};
class TManager : TClassData<TManager> {
public:
void set(string const& s) { data(this) = s; };
string& get() { return data(this); };
};
…………しかし、継承使われたりすると危なっかしくてしょうがないな。
TManagerはクラス内クラスにしてファイナル化しといた方が安全そうだ。
290:289
07/08/13 00:01:46
というよりもVC5,6はステだろ。
未だに保守でVC5,6使わされているプログラマは可哀想でしょうがない。
291:デフォルトの名無しさん
07/08/13 00:03:03
class TLogPolicy { public: void foo() { ::std::cout << "Hello"; } };
class AbstractTLogPolicyHolder { public:
TLogPolicy& policy;
AbstractTLogPolicyHolder( TLogPolicy& policy ) : policy( policy ) {}
};
template < class T >
class TLogPolicyHolder : public AbstractTLogPolicyHolder {
static TLogPolicy policy;
public: TLogPolicyHolder() : AbstractTLogPolicyHolder( policy ) {}
};
template <class T> TLogPolicy TLogPolicyHolder<T>::policy;
class Cont { ::std::list< AbstractTLogPolicyHolder* > cont;
public: void add( AbstractTLogPolicyHolder* holder ) { this->cont.push_back( holder ); }
void callAllFoo();
};
void Cont::callAllFoo() {
::std::list< AbstractTLogPolicyHolder* >::iterator i = this->cont.begin();
for( ; i != this->cont.end(); ++i ) { ( *i )->policy.foo(); }
}
class TManager : public TLogPolicyHolder< TManager > {};
class UManager : public TLogPolicyHolder< UManager > {};
void main() {
Cont cont;
TManager t1, t2, t3; // TManager::policy は 1 個だけ存在
UManager u1, u2, u3; // UManager::policy も 1 個だけ存在
cont.add( &t1 );
}
292:デフォルトの名無しさん
07/08/13 00:05:41
>>290
この前、VC3の案件が回ってきて笑った。
293:289
07/08/13 00:15:30
うわ……ありゃc++とは言えないだろう……
良く良く考えたらテンプレートメンバ関数要らんな。
ただ危険にしているだけだった。
template<class derived_t>
class TClassData {
protected:
TClassData() {};
string& data() {
static string data;
return data;
}
};
class TManager : public TClassData<TManager> {
public:
void set(string const& s) { data() = s; };
string& get() { return data(); };
};
294:デフォルトの名無しさん
07/08/13 08:35:29
>>293
TLogPolicyとContはどこいった?
295:デフォルトの名無しさん
07/08/13 11:17:36
規格読んでたらよく分かんなくなってきた。
std::complex<double> c = std::complex<double>(1, 2);
とした時、コピーコンストラクタが呼ばれるかどうかに関する規定がよく分からない。
これは「コピー初期化」であって「std::complex<double>(1, 2)がcにコピーされる」らしいんだが、
実際やってみると、どうもコピーコンストラクタは呼ばれない。
この「コピー」というのがコピーコンストラクタを呼ぶことを意味していないのか、
それともコピーコンストラクタを呼ばない最適化が規格で許されてるのか、
どうもよく分からない。
このあたりどうなってるのか詳しく知ってる人はいる?
296:デフォルトの名無しさん
07/08/13 11:22:35
>>295
URLリンク(www.kmonos.net)
297:デフォルトの名無しさん
07/08/13 11:27:38
1)T a = T(...)
2)T a(...)
は同じじゃなかったっけ
298:デフォルトの名無しさん
07/08/13 11:45:31
>>295
つまり、これも戻り値最適化に含まれる、というわけ?
299:デフォルトの名無しさん
07/08/13 12:05:27
>>297
いいえ。前者はコピーコンストラクタが呼ばれる可能性があります。
# >296参照。
300:デフォルトの名無しさん
07/08/13 12:06:17
>>298
正しく、RVOですね。
301:デフォルトの名無しさん
07/08/13 12:07:59
規格には何箇所かコピーコンストラクタの省略を許す箇所が挙げられている。
戻り値最適化もコピー初期化時の省略もそのひとつ。
って、他にあったっけ?
302:デフォルトの名無しさん
07/08/13 12:09:56
>>300-301
これで安心して眠れます。
まだ寝ないけど。
303:デフォルトの名無しさん
07/08/13 12:10:44
>>295
これかしらん?
URLリンク(web.archive.org)
ここの最後の方
> -15- Whenever a temporary class object is copied using a copy constructor, and this object and the copy have the same cv-unqualified type,
an implementation is permitted to treat the original and the copy as two different ways of referring to the same object and not perform a copy at all,
even if the class copy constructor or destructor have side effects.
304:デフォルトの名無しさん
07/08/13 12:22:55
>>303
おおー。それですね。完璧ですね。
305:デフォルトの名無しさん
07/08/13 12:31:03
規格 8.5.14 内のここは?
if the function is a constructor, the call initializes a temporary of the
destination type. The result of the call (which is the temporary for the
constructor case) is then used to direct-initialize, according to the rules above,
the object that is the destination of the copy-initialization. In certain cases,
an implementation is permitted to eliminate the copying inherent in this
direct-initialization by constructing the intermediate result directly into the
object being initialized;
306:デフォルトの名無しさん
07/08/13 13:07:44
>299
ええ? >297の通りじゃ……と思ってC++STDを確認しました。
8.5 Initializers
(snip)
initializer:
= initializer-clause
( expression-list )
initializer-clause:
assignment-expression
{ initializer-list ,opt }
{ }
initializer-list:
initializer-clause
initializer-list , initializer-clause
ということで、>297の通りじゃね?良くわからないけど。
307:デフォルトの名無しさん
07/08/13 13:12:39
>>306
「ということで」じゃねーよ。何を確認したんだよ。
= に続けて置かれた初期値の型が同じなら、動作上は direct-initialization と
同じに最適化されるが、意味上は依然として copy-initialization なので、
たとえばコピーコンストラクタが private になってたりすると >>297 の 1 は
コンパイルエラーになる。
308:306
07/08/13 14:06:53
あれ?そうだっけ? ということでもうちょっと調べてみました。
過去ログにあった。
URLリンク(ir9.jp)
条件付きで同じになるっつうのが正解かしらん?
copy-initializationとdirect-initializationについて纏まっている資料は無いのかね?
More Exceptional C++に載っているみたいだけど……
309:デフォルトの名無しさん
07/08/13 14:56:26
ためになるなあ
310:デフォルトの名無しさん
07/08/14 01:11:10
おもしろいな、copy constructorへのaccess checkがかかるけど、
実際にはdirect-initializationが行われる(よばれる)のか
class Nurupo
{
private:
//public:
Nurupo(const Nurupo&) {
*(int*)0 = 0;
}
public:
Nurupo(int nurupo1, int nurupo2, int nurupo3) {
;
}
};
void foo() {
Nurupo nurupo = Nurupo(1,2,3);
}
private:だとコンパイルエラーになるが、
public:にして実行しても落ちるわけではない
でさ、これもRVOって呼ぶの?returnしてないのに?
311:デフォルトの名無しさん
07/08/14 01:53:47
>>310
これは RVO とは呼ばない。
312:デフォルトの名無しさん
07/08/14 01:55:03
>>308
規格のドラフトでいいんじゃないの? >>2
313:デフォルトの名無しさん
07/08/14 02:39:08
JIS に行けばドラフトじゃなくてちゃんとしたのを一応読める。色々と不便ではあるけど。
314:デフォルトの名無しさん
07/08/14 02:45:47
日本の未来に絶望する配布形式
315:デフォルトの名無しさん
07/08/14 08:29:54
不要なものは使いにくくなっている
C++的には正しい配布形式
316:デフォルトの名無しさん
07/08/14 10:19:47
const int i[10];
という配列をメンバーに持っていた場合、どうやって初期化すればよいのでしょうか?
317:デフォルトの名無しさん
07/08/14 10:21:52
>>316
できません。 const 外すか、パフォーマンスに問題なければ std::vector を使うか。
318:デフォルトの名無しさん
07/08/14 10:23:08
int i[10]; という配列をメンバーに持つクラス X を作って、
const X x; として、その x のコンストラクタで初期化する。
319:デフォルトの名無しさん
07/08/14 10:40:09
残念ながらコンストラクタ内で代入することになるね。
320:デフォルトの名無しさん
07/08/14 23:11:20
ご意見伺いたいです。
C++にてシングルトンを実装するに当たって、インスタンスの解放を明示的に実装しますか?
私は、実装します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。
実装しないという人の理由が、解放される順番が難しい、
というのですがそれは理由にはならないのではと。
解放しない派で、もっとこう積極的な理由があるなら教えてください。
321:デフォルトの名無しさん
07/08/14 23:19:43
明示的な解放が必要ってことは
static HogeClass *s = new HogeClass;
return s;
とかするのか?
322:デフォルトの名無しさん
07/08/14 23:25:57
Modern C++ Design読め。
言語に頼れるのならば任せるのがベターだろうと思うよ。
それができない(例外的な)ケースのときだろうね。明示的に実装することを考えるのは
323:デフォルトの名無しさん
07/08/15 02:20:59
mallocしたメモリは確実に解放しますか?
私は、解放します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。
324:デフォルトの名無しさん
07/08/15 03:29:48
だからModern C++ Design読めって。そもそもmallocなんか使わないよ。
ローカル関数内のstaticオブジェクトを使うのが簡単じゃない?
325:デフォルトの名無しさん
07/08/15 04:20:38
「リソースは解放する」「順序は守る」「両方」やらなくちゃならないのがのC++のつらいところだな。
326:デフォルトの名無しさん
07/08/15 05:39:13
シングルトンの解放に関する話は結構ややこしいからな。
Modern C++ Design 読め、で済ますしかない。
327:デフォルトの名無しさん
07/08/15 07:29:15
機械翻訳のような妙な日本語。
328:デフォルトの名無しさん
07/08/15 08:00:51
>>323
C++でmalloc()使う方がどうかしている。
329:デフォルトの名無しさん
07/08/15 08:43:20
>>324>>328
有名な「malloc/free論争」と同じ
不毛な議論だということを述べているのだと思うが
330:デフォルトの名無しさん
07/08/15 08:46:56
不毛も何も、C++ならnew/deleteがあるのだからmalloc()なんて使わないだろって話だが。
そんなに毛が欲しければCを使っていればいいだけのことだ。
331:デフォルトの名無しさん
07/08/15 09:25:19
論点はmallocかnewか、ではなく
newしたものは必ずdeleteする必要があるか、という点なのだけど。
「mallocではなくnew」などというのは、本質を外れた揚げ足取りに過ぎないと
気が付いているんだろうけど、引っ込みがつかないんだろうね。
332:デフォルトの名無しさん
07/08/15 09:33:22
相手が呆れて去っていきさえすれば勝ちだから、そりゃあ頑張るさ。
「勝者とは強い者のことを言うのではない、戦場に最後まで立っていた者のことを言う」
と、妖魔司教ザボエラ様も仰ってる。
333:デフォルトの名無しさん
07/08/15 09:48:46
deleteするか否かは時と場合による。
334:デフォルトの名無しさん
07/08/15 10:04:49
placement new なら delete しない代わりにデストラクタ呼ぶ、という話か?
335:デフォルトの名無しさん
07/08/15 10:34:09
時と場合で移り気なの
336:デフォルトの名無しさん
07/08/15 10:34:36
スマートポインタ使えよ
RAIIの原則に従っておけば何も考えなくていいんだから
337:デフォルトの名無しさん
07/08/15 10:41:01
newしたらdeleteするのは当たり前だが、mallocしたものはfreeしないと言うこともあるかも知らん。
338:デフォルトの名無しさん
07/08/15 11:10:57
あーあ、mallocやっちゃった。スレタイ読めない馬鹿発見。
339:デフォルトの名無しさん
07/08/15 11:13:18
というのは、レスが読めてない馬鹿の言うことなんだけどね、この場合。
340:デフォルトの名無しさん
07/08/15 11:20:33
delete はデストラクタ呼ぶから、free とは問題が別だよという話だろう。
341:デフォルトの名無しさん
07/08/15 12:09:46
newしたメモリは確実に解放しますか?
私は、解放します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。
342:デフォルトの名無しさん
07/08/15 12:15:10
あーあ、newやっちゃった。スレタイ読めない馬鹿発見。
343:デフォルトの名無しさん
07/08/15 12:31:17
ティンコティンコティンコ
344:デフォルトの名無しさん
07/08/15 12:38:33
デストラクタでOSが自動でやる以上に何か意味のある仕事をするんなら
勿論deleteすべきだろうな
345:デフォルトの名無しさん
07/08/15 12:48:37
RAIIとかリソース所有の概念を知らないやつが混ってるな。
C++必須の概念のはずなのに、知らないやつってホント多いよな。
346:デフォルトの名無しさん
07/08/15 12:52:51
>>345
決め付けは良くないですyo
347:デフォルトの名無しさん
07/08/15 12:53:03
解放しないとデバッガがメモリリークを報告しまくってうっとうしい
348:デフォルトの名無しさん
07/08/15 12:53:52
>>347
それはデバッガがクソ
349:デフォルトの名無しさん
07/08/15 13:01:34
いずれにせよnewしたメモリは全部スマートポインタに突っ込むのが常識だろ。
今時手動deleteとかありえねえ
350:デフォルトの名無しさん
07/08/15 13:04:15
今時ガベコレも無い言語なんて時代遅れもはなはだしい
351:デフォルトの名無しさん
07/08/15 13:25:50
ライブラリでいくらでも実装できるLispとC++は最高、ということですね?
352:デフォルトの名無しさん
07/08/15 13:40:39
スマートポインタが万能だとでも思ってるんだろうか
353:デフォルトの名無しさん
07/08/15 13:42:58
RAIIあれば大抵は処理できるよ。 >350
ガベコレも結局無限リソース(メモリ)しか上手く処理できないしな……
354:デフォルトの名無しさん
07/08/15 13:44:47
循環参照があっただけでおしまいじゃん
355:デフォルトの名無しさん
07/08/15 14:01:29
シングルトンどうしが循環参照してても解放すべきです。
私はそう考えます。
356:デフォルトの名無しさん
07/08/15 14:29:38
おまえいいこと言うな
357:デフォルトの名無しさん
07/08/15 14:48:33
>354
ちゃんとリソース所有権を考えれば循環参照はめったにおこらない。
まあ、考えるのが面倒だからガベコレに頼りたくなるんだけどね。
>355
どういう状況だよ。シングルトンわかってないだろ。
358:デフォルトの名無しさん
07/08/15 14:49:34
>>355
そんなシングルトンが存在すること自体、設計が変だと思わないか
359:デフォルトの名無しさん
07/08/15 14:51:45
寝具るddd
360:デフォルトの名無しさん
07/08/15 14:57:57
>>357-358
可哀相なくらい行間が読めないコンビだな。
361:デフォルトの名無しさん
07/08/15 15:35:05
読む気ねぇ。ここはマ板じゃねぇし。なんで技術的な部分以外を気にしなきゃいかんのかね?
いい加減夏厨相手にするのも飽きたなぁ
362:デフォルトの名無しさん
07/08/15 15:51:47
馬鹿を晒すぐらいなら書かなきゃいいのに
363:デフォルトの名無しさん
07/08/15 15:54:14
行間なんてものは要するに書き漏らしただけ
ちゃんと伝えたきゃ書け
364:デフォルトの名無しさん
07/08/15 15:56:26
行間っつーか、ギャグだろ。
365:デフォルトの名無しさん
07/08/16 06:38:10
>>361
日本語でコミュニケーションする能力が
技術的な部分と両輪で機能してない間抜けなぞ問題外。
366:デフォルトの名無しさん
07/08/16 14:56:08
(゚ー゚*)ダッコ♪
367:デフォルトの名無しさん
07/08/16 15:29:53
reddit 経由「透過的プログラマ指向ガベコレ for C++」
URLリンク(www.open-std.org)
Boehm らによる言語機能としてのガベコレ提案。ちょっと期待。
368:デフォルトの名無しさん
07/08/16 18:15:46
class SUBCLASS {
public:
LPSTR& operator[](LPCSTR);
};
class SUPERCLASS{
public:
SUBCLASS *subclass;
};
SUPERCLASS aaa;
int main()
{
aaa.subclass = new SUBCLASS(hogehoge);
return aaa.subclass["bbb"];
}
わけあってmapが使えないので上のようにしているのですが
「error C2107: ポインタでない式に、添字が使われました。」
というエラーが出てしまいます
どのようにすれば解決できますでしょうか?
開発環境はVS2005です
よろしくお願いします
369:デフォルトの名無しさん
07/08/16 18:30:39
あんまり真面目に読んでないけど、とりあえずこうじゃね?
return (*aaa.subclass)["bbb"];
370:368
07/08/16 18:44:26
>>369
どうもー
やってみましたがだめでした
371:デフォルトの名無しさん
07/08/16 18:53:11
>>370
エラーメッセージが変わっただろ。ちゃんとその辺を書けよ。
で、戻り値の型がLPSTRなんだから、らreturn文で呼ばずに単独で呼んでみな。
372:368
07/08/16 19:00:40
>>371
うーんエラーメッセージは変化なしです
373:デフォルトの名無しさん
07/08/16 19:06:17
aaa.subclass->operator[]("bbb")
374:368
07/08/16 19:08:45
>>373
コンパイル通りました
ありがとうございました
375:デフォルトの名無しさん
07/08/16 19:11:26
意味があるかは知らんが、(*aaa.subclass)["bbb"] でコンパイルは通るぞ。
376:デフォルトの名無しさん
07/08/16 19:11:34
>>373
俺もそうだと思ったけど、関数形式で呼ぶのがなんか嫌だから書かなかった
なんか解決策ないかね
377:371
07/08/16 19:13:21
>>372
そうか? 前者は引き数が合わなくて関数が見つからないが、後者は戻り値の型が合わなくてエラーになると思うのだが。
つーか、なんでまたmain()のreturnなんかで試すんだ? >371の後半は読んでないのか?
378:376
07/08/16 19:13:31
ああそうか、違和感の理由が分かった。
連想配列にしたくて添え字をオーバーロードしているはずなのに
opreator[]で呼んだら意味を成さなくなっちゃうからだ。
379:376
07/08/16 19:15:59
つうことで解決案
subclassをカプセル化して、参照越しにoperator[]を呼ぶ
380:デフォルトの名無しさん
07/08/16 19:23:44
(*aaa.subclass)["bbb"] でコンパイル通らず、
aaa.subclass->operator[]("bbb") でコンパイル通るってあり得ないと思うんだが。
381:368
07/08/16 19:28:22
>>375
あわわ間違って(*aaa.subclass["bbb"])としちゃってたようです
>>377
エラー部分だけ抜き出そうとして型違いのreturnになってました、ごめんなさい…
>>379
単語の意味がわかってないので検索してやってみます、ありがとうございました
382:デフォルトの名無しさん
07/08/16 19:35:38
でもなんでchar *じゃなくて、char * &なんだろう。
constでないということは、こういうことがやりたいんだろうか。
(*aaa.subclass)[''bbb"] = new char[10] ;
いや、ひょっとしたらこういうことがしたいのか
char * & ptr = (*aaa.subclass)[''bbb"] ;
ptr = static_cast<char *>( realloc(ptr) ) ;
383:デフォルトの名無しさん
07/08/16 20:59:50
class Base
{
public:
Base(int n) {}
};
class Derived : Base
{
public:
Derived(int n) {}
};
これがどうしてダメで、Base::Base()が必要なのか教えてください。
384:デフォルトの名無しさん
07/08/16 21:06:38
親クラスに n を渡すなら、それをちゃんと書かなきゃいけない。
public:
Derived(int n) :Base(n) {}
385:デフォルトの名無しさん
07/08/16 21:06:53
はい?
386:デフォルトの名無しさん
07/08/16 21:07:27
>>383
その例のDerived のコンストラクタは結局 Derived(int n) : Base() {} の省略形だから
387:デフォルトの名無しさん
07/08/16 21:21:45
そのnは親に渡さずに別に使うnかもしれないし。
388:デフォルトの名無しさん
07/08/16 23:12:17
>>383
Derived クラスのインスタンスを生成するときに
Base クラスのコンストラクタを呼び出すからなんだと思います。
コンストラクタを定義していないときはデフォルトコンストラクタが呼び出されるけど
定義してると定義されたものを呼び出すから
この場合は引数のいらないコンストラクタを定義するか
Derived クラスのコンストラクタで
Derived(int n) : base(100) {}
みたいに Base(int n) を呼び出して
引数を渡さないとだめだと思うんです。
初心者なんで間違ってるかもしれません。
っていうか STL 難しすぎでうっ!
389:デフォルトの名無しさん
07/08/16 23:20:25
Baseのコンストラクタにデフォルト値を書いておくのもいいかも
っていうか STL 関係ねー
390:デフォルトの名無しさん
07/08/17 00:01:01
>>388
>っていうか STL 難しすぎでうっ!
でうっ?
391:デフォルトの名無しさん
07/08/17 00:20:57
唐突にこれを思い出した
URLリンク(www.karakuri-box.com)
392:デフォルトの名無しさん
07/08/17 00:41:05
すいません。釣りではありません。
C++ってどんな局面で使うんですか?
WinアプリならC#使ったほうが圧倒的に楽
393:デフォルトの名無しさん
07/08/17 01:00:07
脳みそ沸かしたいとき
394:デフォルトの名無しさん
07/08/17 01:24:19
Cで先頭アドレスと要素数がわかってるのですが
ForループじゃなくてC++のiteratorに変換してくれるtemplateとかないんですか?
ない場合どのiterator継承すればいいんでしょうか
395:デフォルトの名無しさん
07/08/17 01:40:46
T*head; size_t element;が既知なんでそ?
なら、&head[0]〜&head[element]がiteratorの要件を満たしてくれるでそ?
396:デフォルトの名無しさん
07/08/17 01:48:01
>>392
楽かどうかなら C# が楽だろうが、
C# は Windows にしか優しくないし、
速度も C++ に劣るし、
そういうのが必要な時には C++ が圧倒的有利。
397:デフォルトの名無しさん
07/08/17 02:19:58
速度が必要になるようなミッションクリティカルな場面に出会ったことがない
最近は全部C#。
398:デフォルトの名無しさん
07/08/17 02:21:20
サーバーアプリだとC#?ハァ?
399:デフォルトの名無しさん
07/08/17 02:38:29
?
400:デフォルトの名無しさん
07/08/17 03:59:53
つかここ#かんけーねーし
401:デフォルトの名無しさん
07/08/17 05:58:45
>>392
C#を実装するのに使います
402:デフォルトの名無しさん
07/08/17 12:37:18
>>401が良い事言った
403:デフォルトの名無しさん
07/08/17 21:16:42
なぜ想像力がデスクトップとサーバー位にしか働かないんだ
プログラムが必要な場面はいろいろあるぞ
404:デフォルトの名無しさん
07/08/17 21:39:47
class CFUNC a;
の2次元配列を動的に確保する場面があって、
CFUNC ***pppa;
として使いたいですが、
pppa = new CFUNC**[y_len];
でまずy要素を確保して
pppa[0] = new CFUNC*[x_len];
各y要素のx要素を確保して
pppa[y][x] = new CFUNC();
で、各要素をインスタンス化して
(*(pppa[y][x])).hoge();
みたいに使おうと思うのですが、このpppaを破棄する場合に
deleteはどう書いたらいいのかわからなくなってしまいました。。。どなかたpppaをdeketeしてもらえませんか?
ちなみによくしらないのですが、delete[]ってなんで配列の要素数がわかるんですか?
405:デフォルトの名無しさん
07/08/17 22:15:50
typedef CFUNC*** PPPCFUNC
typedef CFUNC** PPCFUNC
typedef CFUNC* PCFUNC
と整理してやると
PPPCFUNC pppa = new PPCFUNC[y_len]
pppa[0] = new PCFUNC[x_len]
pppa[y][x] = new CFUNC
になるんで
deleteとdelete[]で困る局面はなくなると思ってみたり
要素数は実装によるけどもコンパイル時には決められないからどっかで一元管理してんでないすか多分
俺はそうする
406:デフォルトの名無しさん
07/08/17 22:53:53
VC++では先頭の手前に要素数が格納されてた希ガス
407:404
07/08/17 22:59:04
なるほど、typedefを忘れてました。
ではこれで確保したpppaはdelete[] pppaで破棄できるんですねっ!
要素数は、
int pppa_len_y;
int *pppa_len_x = new int[ pppa_len_y ];
でnew時に一緒に初期化しています。
もっと手軽な方法ありますか?
408:404
07/08/17 23:02:44
>406
それじゃぁmallocするときに、必要size+1とってfreeのときにそれ利用してるんですねぇ。
ってことは要素数を保持しなくても、ポインタの手前の要素数使えってこと?
ちなみにc++の規定ですか?処理系依存ですか?
409:デフォルトの名無しさん
07/08/17 23:17:52
処理系依存。
410:404
07/08/18 00:17:58
>>405
PPPCFUNC pppa = new PPCFUNC[y_len];
でnewしようとすると、PPFUNC*からPPPFUNCに変換できません
と怒られてしまいました。
PPPCFUNC pppa = (PPPFUNC)( new PPCFUNC[y_len] );
でキャストして大丈夫なのでしょうか?
411:404
07/08/18 00:36:14
すいません、勘違いです。typedefミスってました。OTL
412:383
07/08/18 11:08:57
>>384-389
ありがとうございました。よくわかりました。
最近C++を勉強しているのですが、Java育ちのゆとり世代なものでスパルタさにガクブルものです。
class Foo
{
private:
char* s_;
public:
Foo(char* str) : s_(new char[strlen(str)+1]) { strcpy(s_, str); }
~Foo() { delete[] s; }
};
int main()
{
Foo a("foobar");
Foo b = a;
}
この程度で落ちるってのがすごすぎです(なぜ落ちるのかはちゃんとわかりますが・・・)。
413:デフォルトの名無しさん
07/08/18 11:24:18
>>412
生でnewを使うからそういう羽目になる。
std::stringを使うなり、std::vectorを使えばいい。
せめて、スマートポインタを使え。
414:デフォルトの名無しさん
07/08/18 11:34:02
コピーコンストラクタや代入演算子をちゃんと書かないから・・
415:デフォルトの名無しさん
07/08/18 12:19:01
C++を使う時は、リソースの所有権を常に意識する必要がありますな。
RAIIはちゃんと勉強しといたほうが良いよ
416:デフォルトの名無しさん
07/08/18 12:37:37
そうだな、コピーコンストラクタと代入演算子は常に書くべき。
417:デフォルトの名無しさん
07/08/18 12:40:35
Java→C++とか死亡ルートじゃね?
Java→C→C++って回るべきだと思うんだが
418:デフォルトの名無しさん
07/08/18 13:32:09
GC付きC++って選択肢もあるんでないの(w
419:デフォルトの名無しさん
07/08/18 14:17:34
Javaなんか使うから頭が馬鹿になるんだよ。
GC付きの言語を使うと変な癖が付く。
420:デフォルトの名無しさん
07/08/18 15:08:22
時代に逆行している人
421:デフォルトの名無しさん
07/08/18 16:59:23
>>417
自分はC#→C→Java→C++ってやってきたけどおk?
422:デフォルトの名無しさん
07/08/18 17:03:18
コンストラクタで例外を投げるクラスがあり、
そのクラスをstaticに使ってるんですが、
この場合、どのように例外をキャッチすればいいのでしょうか?
class Throw{ public: Throw(){ throw 1; } };
class TestClass{
static Throw throw;
};
こんな感じです。
423:デフォルトの名無しさん
07/08/18 17:12:19
>>422
コンストラクタの中でキャッチするか、プログラムが死ぬか。
424:デフォルトの名無しさん
07/08/18 17:36:05
>422
staticをやめる
425:デフォルトの名無しさん
07/08/19 13:25:57
教えてください。
たとえば
int i = 100, *ip;
double d = 123.456, *dp;
ip = &i;
dp = &d;
char *s = "abcdefg";
cout << ip << " " << dp << " " << s << endl;
このようなコードで int型やダブル型のポインタを cout で出力すると
アドレスが表示されるのに char型のポインタだと
文字列が表示されるのがいまいちよくわからなかったんですが
ずっと勉強してきてふと思ったんです。
cout で演算子オーバーロードでそうなるようにされてるのかなと。
で定義されているコードを探そうと思ったんですけど
なんかごちゃごちゃしててよくわかりません。
もし予想が当たってるならどのファイル見ればいいかでしょうか?
426:デフォルトの名無しさん
07/08/19 13:54:49
>>425
basic_ostream っていうクラステンプレートに対して定義されている。
char もテンプレート引数になってるからちょっと探しにくいだろうね。
ヘッダ ostream に対応するファイルで定義されているはず。
ごちゃごちゃしたヘッダを読むのがいやなら >>2 から規格のドラフトでも見るといい。
427:デフォルトの名無しさん
07/08/19 17:00:46
教えてください。
428:デフォルトの名無しさん
07/08/19 17:31:07
何をだ
429:デフォルトの名無しさん
07/08/19 18:41:48
>>428
事故解決すますた
430:デフォルトの名無しさん
07/08/19 21:20:33
>>426
ありがとうございます。
ファイル見てみたんですけど
今の僕にはまだ難しくてよくわかんないんで規格もみたんですけど
いまいちわからなくて
検索してたら説明されてるページをみつけました。
URLリンク(www.io.nara-su.ac.jp)
これですっきりしました。
431:デフォルトの名無しさん
07/08/20 15:44:57
質問です。
下のクラス図のようなクラスを実装したいのですが、DataClassのように、二つ(以上)で共有しているクラスは、コード上でどのように書いたらいいのでしょう?
DataClassのインスタンスをグローバルな領域で作るしかないのでしょうか?
クラス図
URLリンク(enjoi.blogdns.net)
とりあえず書いてみたコード
class DataClass{
private:
int data;
public:
void setData(int newData);
int getData();
};
class ClassB
{
public:
bool DoSomething();
};
class ClassA
{
private:
ClassB classb;
};
432:デフォルトの名無しさん
07/08/20 16:18:28
状況次第じゃね。
どっちかに持たせて、もう片方にも渡せるようにすることもあるし、
動的に確保して、A, B の両方のスマートポインタに入れとくこともあるし、
A を所有するクラスに持たせて、そっから渡すようにすることもあるし、
シングルトンにしてグローバルな領域に置くこともあるし、
433:デフォルトの名無しさん
07/08/20 16:18:28
そんなに文句あるんならnamespace使うなりClassAとClassBを統合するなりすれば?
434:デフォルトの名無しさん
07/08/20 16:20:59
初心者だからよくわかんないんですけど
DataClass をメンバとして持つんですか?
ClassA と DataClass の関係って必要なんですか?
ClassB経由で十分なんじゃないでしょうか?
435:デフォルトの名無しさん
07/08/20 16:23:07
関連のあるABのオブジェクトが同じDataClassオブジェクトと関連を持つかどうかは示されていない。
むしろ同じオブジェクトではないと考えるほうが自然。
436:デフォルトの名無しさん
07/08/20 16:28:10
A, B, DataClassを保持する親クラスParentを作っておいて、A, Bのインスタンス生成時にParentへのポインタを渡し、
各インスタンスはParentへのポインタを通してDataClassへとアクセスする。
437:デフォルトの名無しさん
07/08/20 16:30:25
B に入れといて、B を通して操作する。
438:デフォルトの名無しさん
07/08/20 16:35:13
多重継承はやめとけ。実世界でも親の種が違う生き物は短命だ。
439:デフォルトの名無しさん
07/08/20 16:36:43
どこに多重継承が出てくるんだ?
440:デフォルトの名無しさん
07/08/20 16:59:47
あの矢印は関連。サブクラスは白抜き三角矢印。
441:デフォルトの名無しさん
07/08/20 17:56:47
たくさんのご回答ありがとうございました。
複数の方法論に、そもそも設計の段階でご意見まで、たくさんいただきまして、ありがとうございます。
少し数があるので、それぞれについて吟味して、決めた際にまた改めてのお礼がてらご報告にきたいと思います。
ありがとうございました。
442:デフォルトの名無しさん
07/08/21 09:33:29
>改めてのお礼がてらご報告にきたいと思います。
しなくていいよ。
443:デフォルトの名無しさん
07/08/23 00:48:57
stringstring を途中で空にすることはできるでしょうか?
444:デフォルトの名無しさん
07/08/23 00:56:17
std::stringstream?
445:デフォルトの名無しさん
07/08/23 01:27:07
なんだこのバグは
URLリンク(support.microsoft.com)
>>443
stringstream.str("");
446:デフォルトの名無しさん
07/08/23 02:00:38
>>445
鬱になった
やはりSTLportを入れて使(ry
447:デフォルトの名無しさん
07/08/23 02:10:08
std::coutで、時々アドレスのような文字列("0xABCDEF12"みたいな)が出力されたり、
std::wcoutで何も出力されなかったりして困ってたんだけど、445が原因?
でもVS2005 Proだから違うか
448:デフォルトの名無しさん
07/08/23 02:34:28
>>447
coutにwchar_t*食らわしたり、localeを適切に設定せずに日本語文字列食わしてるならお前が悪いだけ。
449:印字ケータ
07/08/23 14:31:20
バイナリエディタでファイルを開くと
保存してある漢字の"日"という文字は16進数で93 FAと表示されてますが、
コレを読込んで、配列に入れると-109と-6となります。
16進数で表示させたいので、変換する方法を教えてください。
お願いします。
450:デフォルトの名無しさん
07/08/23 14:35:18
unsignedにキャストすればいいんじゃね。
451:デフォルトの名無しさん
07/08/23 14:40:35
93 FA を2進数であらわすと
1001 0011 1111 1010
10010011 を符号付き10進数であらわすと
-109
11111010 を符号付き10進数であらわすと
00000110
-6
そのまま16進にすれば同じ
気にしないで突き進め
char を intにするなら符号拡張がおきるので>>450のとおりunsigned にしとけばいい
452:印字ケータ
07/08/23 14:42:15
>>450
返答ありがとうございます。
早速やってみましたが、変換後に4294967187というデカイ数値になりました。
ちなみに、unsignedの変数にキャストして代入してみました。
もしかして私のやり方が間違ってますか。
453:デフォルトの名無しさん
07/08/23 14:54:41
4294967187 ってのは16進に直すと ffffff93
93 はマイナスだから、そのままint にもってくと 符号拡張するんだよ
unsigned にキャストってどこでどうやったの?
unsigned な変数に入れてやってみ。
454:デフォルトの名無しさん
07/08/23 14:56:17
符号拡張されてるんだろう
10010011→11111111111111111111111110010011
455:デフォルトの名無しさん
07/08/23 15:04:05
char ch = 93;
int n = (unsigned char)ch;
456:デフォルトの名無しさん
07/08/23 18:34:31
>>445
Dinkum版stringの短文字列最適化がアダになったな。
実装としては面白くて好きなんだがな。
457:デフォルトの名無しさん
07/08/23 22:36:57
2005SP1で直ってるっぽいが
458:デフォルトの名無しさん
07/08/30 08:15:51
vector< struct X > Func_A();
vectorとかコレクションを返す関数って効率悪い?
459:デフォルトの名無しさん
07/08/30 08:30:10
>>458
コンテナを参照で受け取ったほうがいいんじゃないか?
460:デフォルトの名無しさん
07/08/30 08:44:11
そこでRVOに期待、右辺値参照にもっと期待。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5391日前に更新/205 KB
担当:undef