C++相談室 part58
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
2007/09/26(水) 03:41:13ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
テンプレその他 >>2-15 付近参照
前スレ(実質 part57)
C++相談室 part56
http://pc11.2ch.net/test/read.cgi/tech/1185377587/
0153デフォルトの名無しさん
2007/10/04(木) 01:15:57boostにはなんて名前で入ってたっけ
0154デフォルトの名無しさん
2007/10/04(木) 01:18:23pAはDerivA*と分かっているとき、
DerivA* pA2 = static_cast<DerivA*>(pA->NewInstance());
のようなキャストを型安全性を損なうことなく排除できる。
0155デフォルトの名無しさん
2007/10/04(木) 02:07:150156デフォルトの名無しさん
2007/10/04(木) 02:08:250157デフォルトの名無しさん
2007/10/04(木) 02:29:39BOOST_PP_STRINGIZE
0158デフォルトの名無しさん
2007/10/04(木) 08:19:17Base *pC = new DerivC;
0159デフォルトの名無しさん
2007/10/04(木) 08:20:10Base *pC = new DerivC(pB);
0160デフォルトの名無しさん
2007/10/04(木) 21:28:42それだと余計な負荷がかかる。
0161デフォルトの名無しさん
2007/10/05(金) 01:29:04目的:最終的にlinuxで動かせるようにしないといけないけどVisual Studio捨てれない
winxpにvmwareいれてゲストOSとしてubuntu7を入れる
ubuntuの/home/srcをsambaで共有できるようにしてホストOSのwinxpからみれるようにする
/home/src = \\ubuntu\src
の下にVisual Studioのプロジェクト作成
makefileはeclipse/CDTで自動生成
あとはemacsでメインのコードの編集するけど、flymakeとか使いつつ
インテリセンスも使えてeclipse/cdtのリファクタリング機能も使える環境のできあがり
0162デフォルトの名無しさん
2007/10/05(金) 04:20:160163デフォルトの名無しさん
2007/10/05(金) 08:18:160164デフォルトの名無しさん
2007/10/05(金) 12:27:410165デフォルトの名無しさん
2007/10/05(金) 12:59:49速度が速い以外のメリットがないなら、もう乗り換えれない
0166デフォルトの名無しさん
2007/10/05(金) 15:23:45違うの?
0167デフォルトの名無しさん
2007/10/05(金) 17:36:55includeしたソースが複数ある(各ソースではincludeガードが起きずに展開される)
場合も単一の存在となるんでしょうか?
それとも別々の独立した変数となるんでしょうか?
0168デフォルトの名無しさん
2007/10/05(金) 17:41:000169デフォルトの名無しさん
2007/10/05(金) 18:02:52あれ,でもクラス変数などは単一なんですよね?
うーむ,基本の理解が全然出来ていない.
0170デフォルトの名無しさん
2007/10/05(金) 18:26:17class A{
static int x;
};
int A::x; // <-- これ
2個以上のソースファイルで定義したら、定義が重複してるってリンクエラーになる。
static でない普通のグローバル変数と同じあつかい。
0171デフォルトの名無しさん
2007/10/05(金) 20:36:510172デフォルトの名無しさん
2007/10/06(土) 00:19:53くっつけるというのはちょっと違う。単にインクルードするだけ。
0173デフォルトの名無しさん
2007/10/06(土) 03:48:00ファイルスコープの static はクラスメンバやローカル変数の static とは全然
意味が違う。これは理解するとかじゃなくて覚えておく必要がある。
0174デフォルトの名無しさん
2007/10/06(土) 12:08:540175デフォルトの名無しさん
2007/10/06(土) 13:25:34HTMLのtableタグを抜き出して2次元配列化するのに簡単な方法ありますか?
0176デフォルトの名無しさん
2007/10/06(土) 13:38:01表の大きさがあらかじめ分かってるなら楽、わかってなくても確保すりゃできる。
0177デフォルトの名無しさん
2007/10/06(土) 13:43:540178デフォルトの名無しさん
2007/10/06(土) 14:04:10大丈夫、Lynx辺りのソースを見れば書いてあるはずだ。
# 簡単とは思えないが。
0179デフォルトの名無しさん
2007/10/06(土) 19:44:49最後の行にだけ colspan 書いてあったり?
0180デフォルトの名無しさん
2007/10/06(土) 19:55:070181デフォルトの名無しさん
2007/10/07(日) 22:00:290182デフォルトの名無しさん
2007/10/08(月) 01:04:43簡単なやつならシンボルの重複が発生してリンカのエラーになるよ。
0183デフォルトの名無しさん
2007/10/08(月) 01:15:15重複しても怒られないんだよね.....
0184デフォルトの名無しさん
2007/10/08(月) 07:47:240185デフォルトの名無しさん
2007/10/08(月) 14:08:29ただクラスを作って使うだけでもCよりは使いやすいよね、これ。
0186デフォルトの名無しさん
2007/10/08(月) 14:10:020187デフォルトの名無しさん
2007/10/08(月) 14:12:060188デフォルトの名無しさん
2007/10/08(月) 14:14:400189デフォルトの名無しさん
2007/10/08(月) 14:21:37関数型や今時のLLの真似をしようとすると
すぐに泣くことになるけどな
0190デフォルトの名無しさん
2007/10/08(月) 14:55:310191デフォルトの名無しさん
2007/10/08(月) 16:51:26#include <boost/regex.hpp>
int main()
{
boost::regex re("^(..)*\\xA4");
}
(ひらがなを含むEUCコードの文字列の正規表現)
コンパイル/実行環境:
i686, linux-2.6, gcc-4.1.2, boost-1.34.0, -O3オプション
ia64、-O2オプションでも試しましたが、その場合は問題は発生しませんでした。
私はこれ以上調べる知恵を持たないのですが、GCCのバグなのでしょうか?
0192デフォルトの名無しさん
2007/10/08(月) 17:17:20boostのバグかもしれんよね。
0193デフォルトの名無しさん
2007/10/08(月) 17:43:330194191
2007/10/08(月) 18:07:48原因は恥ずかしくて言えません。あまりにも下らないミスでした。
スレを汚して申し訳ありません。
0195デフォルトの名無しさん
2007/10/08(月) 21:55:590196デフォルトの名無しさん
2007/10/08(月) 22:02:02恥ずかしがることないじゃないか、減るもんじゃなし。
このまま消えたらそれこそスレ汚し。質問に対して考えてくれた人に対して礼を欠く事になるぞ。
0197デフォルトの名無しさん
2007/10/08(月) 22:17:260198191
2007/10/09(火) 00:44:29後者の存在はこの問題を解決するまでは知りませんでした。
自分のboostを使うときは-lboost_regex-gcc41としなければならないのですが、
-lboost_regexと間違えていました。
管理者の用意したboostと何事もなくリンクしてしまうのでミスに気付かなかった。
GDBの出力に /usr/lib... という文字列を見つけて始めてミスに気付きました。
あれ? でもおかしいな。違うboostをリンクしたらそれはそれでうまく動くんじゃないんでしょうか?
0199デフォルトの名無しさん
2007/10/09(火) 01:01:52「違うboost」の何が違うのか調べないと、原因はわからんな。
0200デフォルトの名無しさん
2007/10/09(火) 01:09:37しかし管理者か。
自分の視野外からバグが入り込むとはまるよな。
0201デフォルトの名無しさん
2007/10/09(火) 01:29:34標準ライブラリではないとは思うのだけど、それなら、
boostを使って記述すると、環境依存(バージョン依存)物とか言って怒る人います?
0202デフォルトの名無しさん
2007/10/09(火) 01:32:430203デフォルトの名無しさん
2007/10/09(火) 02:15:23原因は措いておくとして。
自分がスーパユーザじゃなくて自前でインストールした
ライブラリとかを利用するときは、-I でインクルードパスを明示するのと、
リンク時には -L でライブラリパスを明示するのを習慣付けておいたほうが
良いで。
0204デフォルトの名無しさん
2007/10/09(火) 02:22:30実行時のLD_LIBRARY_PATHも忘れずに。
それが面倒なら、boostの場合は、.soでなく.aのほうをリンクしてしまうのも手だ。
-lを使わず、/home/mona/lib/libboost_regex.a とフルパスを書いてしまう。
0205デフォルトの名無しさん
2007/10/09(火) 12:33:320206デフォルトの名無しさん
2007/10/09(火) 17:23:06クラスを作ってメンバ関数として使うのと
どちらがパフォーマンスがいいのだろうか?
0207デフォルトの名無しさん
2007/10/09(火) 17:32:11どちらも同じコンパイル単位内に関数の実体があると仮定していいなら、後者の方がインライン展開されやすいので
パフォーマンスが高い可能性がある。但し、コンパイラによっては全く同じになる可能性も高い。
0208デフォルトの名無しさん
2007/10/09(火) 17:48:35ありがとう!
つまり、ソースの読みやすさを優先すればいいって事ですね?
0209デフォルトの名無しさん
2007/10/09(火) 19:04:01(自分流でも)オブジェクト指向に沿って考えたら自然と決まるもんじゃないの?
それともC++のクラスってオブジェクト指向以外の用途も一般的?
0210デフォルトの名無しさん
2007/10/09(火) 19:33:220211デフォルトの名無しさん
2007/10/09(火) 19:45:350212デフォルトの名無しさん
2007/10/09(火) 19:51:390213デフォルトの名無しさん
2007/10/09(火) 20:02:24構造化にしろオブジェクト指向にしろ、ソースのメンテナンス性を上げるための物だと理解してます
グローバルな関数にした方が使い勝手が良ければグローバル関数で処理するし
クラス化した方が使い勝手が良ければクラスを使います
使い勝手というのが、ある場面ではパフォーマンスであったり、ある場面ではメンテナンス性であったりするわけですが
また、メンテナンス性は、ソースの可読性に大きく左右されるので、パフォーマンスが同等であるならば、ソースの可読性を優先するのは自然だと思います
0214デフォルトの名無しさん
2007/10/09(火) 20:42:41void func() {}
}}
struct hage2 {struct hoge2 {
static void func() {}
};};
int main() {
hage::hoge::func();
hage2::hoge2::func();
}
どちらでも階層を実現できるけど
class struct を使う方法ならアクセス指定もできる
よって選らぶなら後者?…なわけないな
0215デフォルトの名無しさん
2007/10/09(火) 20:44:08○選ぶ
らぶ
0216デフォルトの名無しさん
2007/10/09(火) 20:48:47なるほど、C++初心者だけどOOPに慣れてるから、まずOOがあるものとして考えてたよ
ただ、
> ソースの可読性を優先するのは自然
って考えた時に、オブジェクトとして捉えられる物はクラス化した方がいい場合があるのは当然として、
そうでないものをクラスにまとめることもあるのかな?ってのを疑問に思ったの
名前空間とクラスのどっちを選ぶかは目的の持っている意味で分けられて、
それで結果的に可読性が向上すると思ってるから
0217デフォルトの名無しさん
2007/10/09(火) 23:08:42とか書いといて走らせると、hogeがちゃんと確保されないんだけど、
これって当然なんでしょうか。
100*100とかだと大丈夫。
アクセスするとseg faultしちゃう。
newしてやるとちゃんと確保される。
gcc + Linux or OS X
0218デフォルトの名無しさん
2007/10/09(火) 23:11:370219デフォルトの名無しさん
2007/10/09(火) 23:22:40ああ、そういうのがあるんですか。
newしてポインタがNULLかを調べるほうが普通?
0220デフォルトの名無しさん
2007/10/09(火) 23:27:350221デフォルトの名無しさん
2007/10/09(火) 23:29:530222デフォルトの名無しさん
2007/10/09(火) 23:31:530223デフォルトの名無しさん
2007/10/09(火) 23:35:580224デフォルトの名無しさん
2007/10/10(水) 01:55:150225デフォルトの名無しさん
2007/10/10(水) 21:01:39もちろん、スレちがいだかんね。
0226デフォルトの名無しさん
2007/10/10(水) 21:13:13SomeClassのコンストラクタの処理が凄い思いとする。
この重い処理中、p は NULL? 非NULL? どちら??
処理系の実装依存なのかな。
0227デフォルトの名無しさん
2007/10/10(水) 21:53:050228デフォルトの名無しさん
2007/10/10(水) 21:56:43あれの動作は特殊だからねぇ〜
0229デフォルトの名無しさん
2007/10/10(水) 22:01:040230デフォルトの名無しさん
2007/10/11(木) 12:10:34ってやれば、一応失敗すればヌルポを返す
0231デフォルトの名無しさん
2007/10/11(木) 13:19:460232デフォルトの名無しさん
2007/10/11(木) 15:03:470233デフォルトの名無しさん
2007/10/11(木) 18:40:500234デフォルトの名無しさん
2007/10/11(木) 19:52:030235デフォルトの名無しさん
2007/10/11(木) 20:08:31あれで構造体が「truncated」ってなって設定できないんだけど、何で?
教えてくださいエラい人。
0236デフォルトの名無しさん
2007/10/11(木) 23:13:27例外を使ったことない人が、例外を使いたくなくてひっかかる勘違いだな。
0237デフォルトの名無しさん
2007/10/12(金) 05:59:42クラスのインスタンスの比較で
operator==
使ったんだけどおれは今まで
bool(最悪でもint)を想定してコードを書いてきたんだ。
そしたら、
返された型がUBool = signed char
だったんだ・・・
UBoolってboolっぽいから盲点だったよ。
pimplでラップしろとのお告げなのだろうか・・・
std::cout << o1 == o2 << std::endl;//で判明
0238デフォルトの名無しさん
2007/10/12(金) 08:08:010239237
2007/10/12(金) 09:12:42冗談かと思ったら散々な結果・・・
比較演算子の型は不明?w
std::cout << typeid(1.0==1.0).name() << std::endl;//VC6(int),VC7.1(int),VC8(bool),GCC3.4.4(bool)
std::cout << typeid(1==1).name() << std::endl; //VC6(long),VC7.1(bool),VC8(bool),GCC3.4.4(bool)
結論:boolは関数オーバーロードしない。または、明示的に呼び出す。
0240デフォルトの名無しさん
2007/10/12(金) 09:22:22これまじで?
もうVC6とかVC7.1は使わないから、いまさらどうでもいいんだけど。
0241デフォルトの名無しさん
2007/10/12(金) 10:58:30規格では組み込みの比較演算は全部 bool になる。
VC の比較演算か typeid がバグってるんだろ。
0242デフォルトの名無しさん
2007/10/12(金) 18:07:19#include "hoge.h"
#endif
と、hoge.h内で
#ifnedef HOGE_H
#define HOGE_H 1
class hoge{
};
#endif
ってするのはどっちにどういう長所短所があるんでしょうか。
0243デフォルトの名無しさん
2007/10/12(金) 18:18:110244デフォルトの名無しさん
2007/10/12(金) 18:22:11あざっす。
数十種類の色んな環境でmakeできるソフト読んでたんで、
前者はそういうとこで念のために使う感じですね。
0245デフォルトの名無しさん
2007/10/13(土) 15:06:26コンパイル速度上げるための小細工。hoge.h の中で #ifndef してると、当然
hoge.h を読み込んでプリプロセッサが解析するコストがかかるが、前者だと
ファイル開く必要がない。
ちなみに #pragma once 使える環境なら、そっちの方が良い。
0246デフォルトの名無しさん
2007/10/13(土) 15:27:50# pragma once
#else
# ifndef XXX_IS_INCLUDED
# define XXX_IS_INCLUDED
/* */
# endif
#endif
こうですか?わかりません><
0247デフォルトの名無しさん
2007/10/13(土) 15:34:47gcc は #pragma once 使わなくてもインクルードガードのパターンを認識して
同等の処理をしてくれるらしい。
つまり #pragma once しか使えない環境なら付けといたほうがいいかも、って感じ。
0248デフォルトの名無しさん
2007/10/13(土) 17:35:03未知の#pragmaは無視してくれるんじゃなかったっけ?
0249デフォルトの名無しさん
2007/10/13(土) 17:44:390250デフォルトの名無しさん
2007/10/13(土) 17:45:42コンパイラによっては同じ名前でも違う意味だったりする可能性もあるから
#pragma はたちが悪い。
0251デフォルトの名無しさん
2007/10/13(土) 22:36:500252デフォルトの名無しさん
2007/10/14(日) 04:02:26void fh() {
try {
throw;
} catch(int) {
printf("1\n");
} catch(bool) {
printf("2\n");
}
}
int main() {
try {
throw true;
} catch (...) {
fh();
}
return 1;
}
これってhack? これ許されるなら、TypeListの
要素全てをcatchするなんてのも出来そう。
■ このスレッドは過去ログ倉庫に格納されています