トップページ⇒tech
1001コメント277KB

C++相談室 part36

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)vNGNG
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0153デフォルトの名無しさんNGNG
まさにスレ違いの流れ!
0154デフォルトの名無しさんNGNG
アセンブラって言語?
0155デフォルトの名無しさんNGNG
(1位タイ)C++(もしくはC),C#,JAVA,ActionScript
以降順位なし。

1位をC++(もしくはC),C#,JAVA,ActionScriptでタイとした理由。
・残念ながら現在OSで圧倒的シェアを占めているWindowsにおいて、
 C#がMicrosoftの次世代主要開発言語として位置づけられていること。
・残念ながら(略)、C++/CLIが結構うまく.NET Frameworkを扱えるらしい
 から、膨大な遺産を持っているC++(もしくはC)はこれから勉強するに
 足る長期間生き残るだろうと予想されること。
・Windowsのサーバーサイドのプログラミングは今後.NETを用いたものに
 移行すること。
・その他UNIXやLINUXの環境においてはまだしばらくはC++(もしくはC)が
 開発の主流であり続けるであろうと予想されること。
・Webのクライアントサイドのプログラミングの主流がJAVAとActionScript
 (Flash)であること。

VBは.NETになって、その意義(プログラム初心者がプログラムらしきものを
形だけでも作ることができる)を失っている。C#に置き換えられていくのでは
ないだろうか。
0156デフォルトの名無しさんNGNG
アセンブリ言語をアセンブラでアセンブルしようか。
0157デフォルトの名無しさんNGNG
コンパイラは知ってるぞ。漫画だよな。
アセンブラも知ってるぞ。漫画だよな。

0158デフォルトの名無しさんNGNG
おまいら、これでも実行してろ
E8 FD FF
0159デフォルトの名無しさんNGNG
バイナリエディタを使うんですね
0160デフォルトの名無しさんNGNG
>>146
学術的な下積みって何?
駅弁大学で万年助手すること?
0161デフォルトの名無しさんNGNG
C++できるってことはCもできるんじゃない。
ていうか>>153に同意
0162デフォルトの名無しさんNGNG
スレ違いは分かってて質問するけど(何故ならC++が好きだから)
日本以外に行ったら三文字表記は今でも使われてるのですか。
??=include <iostream>
int main()
??<
int n??(1??)={10};
cout<<"Hello, World??/n"<<n??(0??)<<endl;
return 0;
??>
なんかすごいよね。
0163デフォルトの名無しさんNGNG
あっusing namespace std;が抜けてる
0164デフォルトの名無しさんNGNG
ならCでパターン全部書いてみろと
0165デフォルトの名無しさんNGNG
>>152
こんな風に考えているのが大勢いるんだろうね。
着眼点が下等すぎ。
0166デフォルトの名無しさんNGNG
>>165
釣られんな(w
ユーザライクな文字列処理を必要とする人がアセンブラに走るわけがない。
0167デフォルトの名無しさんNGNG
>152

あの突っこむべきかどうか本当に必死に考えた結果、突っこみます


ここC++のスレです
0168デフォルトの名無しさんNGNG
>>167
なにいってんの?
0169デフォルトの名無しさんNGNG
ここはCwwのスレじゃありません。
0170デフォルトの名無しさんNGNG
派生クラス固有の値を派生元のポインタから仮想関数経由でセットする方法を教えてください。
class A{
public:
 virtual void Initialize( void* )=0;
};

class B : public A{
 BStruct bs;
public:
 virtual void Initialize( void* p){
  bs = *(BStruct*)p;
 }
};
こんな感じで渡しているのですが、中身の保証が全くありません。NULLチェックのみ
Cstruct, DStruct・・・といろんなサイズ・型の各派生先固有の構造体があります。
0171デフォルトの名無しさんNGNG
↑の人の使わせてもらうけど
class A{
  public:
 virtual void Initialize( void* )=0;
     };

  class B : public A{
 BStruct bs;
public:
 virtual void Initialize( void* p){
  bs = *(BStruct*)p;
 }
};  

こんな感じに段落をつけてる(文の最初に空白を数行いれてる)のは
見易くするためだけ?
0172デフォルトの名無しさんNGNG
>>171
それのどこが見やすいんだ?
0173デフォルトの名無しさんNGNG
>>170
dynamic_castとかCOMのIUnknown::QueryInterfaceみたいな仕組みを導入するとか。
つーか派生先で独自の初期化関数作ればいいじゃない。
0174デフォルトの名無しさんNGNG
>>170
受け渡しに使いたい派生クラス固有のオブジェクトをboost::anyかなにかで渡せば?
0175デフォルトの名無しさんNGNG
>>170
保証がないということは、
正しくなかった場合にどうしたいのかを
まず決めなければ話を始められない
0176デフォルトの名無しさんNGNG
  bs = *(BStruct*)p; というところを
bs=*dynamic_cast<BStruct*>(p); としても動作するようにいたるところ修正...とおもったけど
BStruct は構造体で無いとだめ?
0177デフォルトの名無しさんNGNG
>>176
dynamic_castに必要な条件を述べよ
0178デフォルトの名無しさんNGNG
>>177
わかんない。まわりくどい事いわないで教えろ
0179デフォルトの名無しさんNGNG
キャスト前のポインタの先に virtual
0180デフォルトの名無しさんNGNG
つ仮想関数
0181180NGNG
>>179
ケコーンしないか?
0182デフォルトの名無しさんNGNG
サンクス。
キミたちに幸せが来るように祈ってる
0183デフォルトの名無しさんNGNG
>>181
女なら品定めさせろ
男なら金くれ
0184デフォルトの名無しさんNGNG
おまえらみんな金ヤンだ
0185デフォルトの名無しさんNGNG
この流れにワラタ
0186デフォルトの名無しさんNGNG
>>183
           _._
 _|_|_|_   |_|_|     /  __            ___
   |  |_|    |_|_|    |                       ヽ
   |        /| | \   |          ───一        |
   |___    ノ  |     レ  ヽ_                 _ノ

 _/__〃  |   _|_    __
   / __   |    .|     /  / ヽ
  /       |    |    /  /   |
 /  ヽ__   レ   ノ    \/   /

    へ          へ|\ へ     √ ̄|        へ
   ( レ⌒)  |\   ( |\)| |/~|  ノ ,__√    /7 ∠、 \ .  丶\      _ __
|\_/  /へ_ \)   | |   | |∠  | |__   | /   !  |     | |_〜、  レ' レ'
\_./| |/   \     .| |( ̄  _) |     )  | |    i  |  へ_,/    ノ   ,へ
  /  / ̄~ヽ ヽ.   | | フ  ヽ、 ノ √| |   ! レノ  |  !. \_  ー ̄_,ー~'  )
 / /| |   | |   | |( ノ| |`、) i ノ  | |   \_ノ  ノ /    フ ! (~~_,,,,/ノ/
 | |  | |   / /    | | .  し'  ノ ノ   | |       / /     | |   ̄
 \\ノ |  / /      | |___∠-".   | |      ノ /       ノ |  /(
  \_ノ_/ /     (____)     し'      ノ/      / /  | 〜-,,,__
     ∠-''~                        ノ/         (_ノ   〜ー、、__)
0187170NGNG
>>173
>QueryInterface
COMはあまり知らないのですが、そこまでするのはちょっと。。。と思いました。(自分で言い出しておきながらあれですが)
>dynamic_cast
dynamic_cast<B*>(ptrA)→InitializeB()ということですよね。なるほど。
>>174
boost::anyをためしに使ってみました。
virtual void Initialize ( const boost::any &s ){
 try{
  BStruct bs = boost::any_cast<BStruct>(s);
 }catch( boost::bad_any_cast ){
 ・・・
上手く機能しているようですがこんな感じでいいのでしょうか。詳細は追って勉強してみます。
これでいってみようと思います。
>>175
正しくなければ戻り値をboolにしてfalseをreturnしてやるくらいで十分です。
どこまで保証したいのかがまったくわかりませんでしたね。失礼いたしました。(>>170でもきちんと動くのですから)
>>176
仮想関数がないとだめなんですよね。そうなると関数呼び出し時にdynamic_castしたほうがいいですね。
0188デフォルトの名無しさんNGNG
>正しくなければ戻り値をboolにしてfalseをreturnしてやるくらいで十分です。

つまり、未定義ではなく何らかの保証をするってことだな。
0189170NGNG
>>188
そういうことですかね。
boost::anyを使用することによって少なくとも希望の型が渡されたことが保証できますね。

boost::any_castはtype_id で判定しているのですね。
今回の用途にはこれで十分だと思われます。
みなさんありがとうございました。
0190デフォルトの名無しさんNGNG
実行時にユーザープログラムが型判定しなきゃいけない例ってのは
どんな場合なんでしょう?

スクリプトの実装くらいしか思いつきません
0191デフォルトの名無しさんNGNG
・ドラッグ&ドロップ
・コピー&ペースト
・アーカイブファイルからの読み込み
0192デフォルトの名無しさんNGNG

printf("");
って一見何もしないように見えて厳密には一体何が起こってるんでしょうか?
これを書くとエラーが出ないのに省くとメモリ関係のエラーで強制終了でした
コンパイラはBCC32です5.5です
謎です 紐解いて下さい
0193デフォルトの名無しさんNGNG
>>192
引数をケツから積んでるかと

>これを書くとエラーが出ないのに省くとメモリ関係のエラーで強制終了でした
おそらく別の箇所でスタックを壊したりしてる予感

周りのコードを見直して見れ
0194デフォルトの名無しさんNGNG
>>192
""だって立派な文字列だ。
0195デフォルトの名無しさんNGNG
処理系によって扱いが違うのかも。
0196デフォルトの名無しさんNGNG
"" が格納されている位置の前に格納されている
別の文字列に対してオーバーランな書き込みしてるとか
0197デフォルトの名無しさんNGNG
"は文字列ではありません。"は区切り記号です。
0198デフォルトの名無しさんNGNG
return でなく exit で終了させて問題が起こらなければ
スタックの異常
0199デフォルトの名無しさんNGNG
>192
あーおんなじ状況になったことがある
メモリまわりのバグなんだよね
不適切なメモリアドレスを操作していないかチェックしたほうがいいよ
0200デフォルトの名無しさんNGNG
何故にprintf("");を記述したのか...
0201デフォルトの名無しさんNGNG
""はサイズ0の文字列で終端コードである"\0"は含まれるからね。"\0"と書いてあるのと差はない。(はず)
それが格納されるのはあたゆる初期値付き変数と同じところになる。(そうじゃない場合もあるが)

当然それの前の部分でオーバーランをしていたらクッションになってくれてることも考えられる。
0202デフォルトの名無しさんNGNG
静的関数だけで構成されていて、インスタンスなんか作っても何もないので意味無いクラスを
つくっても良いものなのですか?なんかアホっぽい質問でスマソ
0203デフォルトの名無しさんNGNG
>>202
作りたかったら作ったら良いけど、
その関数をnamespaceに入れたらすむんでないけ?
0204デフォルトの名無しさんNGNG
自分もそう思ったのですが、名前空間のネストが深くなって打つのが面倒になったとか、
単にズボラしたくなったとかで、使う人間(他人でも自分でも)がusing namespaceした時に
(例)play()やresume()とかよくありそうな名前がかち合うのではないかとも思ったのです。
Cの時のようにxxx_プレフィックス(gtk_somefuncとかssl_somefuncとか)付けるのもアレなので
クラスで囲んでおけばいいかなと思ったので。
何か勘違いしてたら指摘してくれると嬉しいです。一人でやってると分からんことが多いので。
0205デフォルトの名無しさんNGNG
namespaceもstaticメンバ関数も打鍵量は全く一緒じゃないか?
0206デフォルトの名無しさんNGNG
JavaのMath系なんかみたいに、static関数前提のクラスというのもあることはあるよ。
Javaは名前空間グローバルな関数が作れないという事情はあるけど、
C++にもtraitsなんかがあるしね。
Effective C++にも、namespaceの代替手段として載っている。
だけどnamespaceの完全な代用には出来ない、ともね。

ただ、using namespaceを前提に考えるのはどうかな。
using hoge::hage; を使うのを推奨するけどね。
(using std::stringとして、ソース内ではstd不要のstringだけで使うとか)
0207デフォルトの名無しさんNGNG
あれは namespace が使えない場合でしょ?
クラスにする意味がないんだからこういう設計は絶対しないよ
0208デフォルトの名無しさんNGNG
「絶対」ではないよ。
traitsという例をわざわざ挙げたのに。
0209デフォルトの名無しさんNGNG
template引数ってのはnamespaceが使えない状況じゃないの?
0210デフォルトの名無しさんNGNG
Ruby >>>>>>>>>>>>>>>>>>>>>> なめsぱcえ
0211デフォルトの名無しさんNGNG
>>209
そうだよ。
>>208はまだお風呂からでてシャツを着ただけの情況なのでしょ。残りはスッポンポン。
0212デフォルトの名無しさんNGNG
Rbuyb >>>>>>>>>>>>>>>>>>>>>>.Rubyho!!!!!!!
0213デフォルトの名無しさんNGNG
209って具体的にどういうことなんですか?
0214デフォルトの名無しさんNGNG
>>213
namespace A{
 typedef int type;
}

template<class T=A>
struct C
{
 typedef typename T::type type;
};
このようには出来ないということかと。
0215デフォルトの名無しさんNGNG
codevct_byname,collate_byname等の
デストラクタがprotectedになってるのですが、
なぜなのでしょうか?

0216デフォルトの名無しさんNGNG
>>201
""はサイズ1の配列。"\0"はサイズ2の配列。
0217デフォルトの名無しさんNGNG
>>216
サイズという単位はありません
0218デフォルトの名無しさんNGNG
>>217
サイズは単位じゃなくて次元では
0219デフォルトの名無しさんNGNG
>>217
「要素数」ならいいか?
0220デフォルトの名無しさんNGNG
誰も配列ではなく配列へのポインタだって所には突っ込まないのね
0221デフォルトの名無しさんNGNG
>>220
C++では文字列リテラルはconst char[n]型である。
プログラミング言語C++第3版5.2.2「文字列リテラル」を参照
0222デフォルトの名無しさんNGNG
>>215
ロケールが管理しているオブジェクトだから。
0223デフォルトの名無しさんNGNG
VC6の頃はデストラクタはPROTECTEDマクロ=publicだった。
VC7でPROTECTEDマクロ=protectedになった。
意味わからんね。
0224Ruby >>>>>>>>>>>> C++++++NGNG
ばーぁ
0225デフォルトの名無しさんNGNG
なんでC+ではなくC++となったのか
0226デフォルトの名無しさんNGNG
>>225
インクリメント
0227デフォルトの名無しさんNGNG
だれかCをBASIC風に機能削減したバージョンのC--を作ってください。
0228 ◆FIcNi4f8js NGNG
>>227
WSH
0229デフォルトの名無しさんNGNG
Ruby!!!!!!!!!!!!!!!!!!!!!!!!!!!
0230デフォルトの名無しさんNGNG
>>229
お前Rubyの事ほとんど知らない奴だろう?
0231超絶Rubyhakka−NGNG
Ruby!!!!!!!!!!!!!!!!!!
0232 ◆FIcNi4f8js NGNG
>>230
きっと生姜区制だろう。
0233デフォルトの名無しさんNGNG
最近の小学生は激しいな。
0234デフォルトの名無しさんNGNG
>227
>だれかCをBASIC風に機能削減したバージョンのC--を作ってください。
Cって言語の基本的なことはとても少ないと思うんだが…
0235デフォルトの名無しさんNGNG
>>227
スレ違いだが、C--という言語はもうある。
http://www.cminusminus.org/
コンパイラのバックエンド用なので、人間様用の言語ではないが。
0236デフォルトの名無しさんNGNG
C++に特許侵害の疑い
http://www.itmedia.co.jp/enterprise/articles/0410/05/news016.html
0237デフォルトの名無しさんNGNG
特許ってうざいよね。
アイデアを特許にする人たちは俺から見たらお気楽だけど。
実際に特許の部分を有効活用して開発する人たちの血と汗と涙の結晶は特許の前では意味を
なさなくなるんだからやってらんないのでわ。
ま〜勝手にアイデアを使われて怒るのは分るけど
だからといって、訴訟を起こしての損害賠償が高すぎ。
今日の特許の乱立実態だからこそ、損害賠償額のルールを決めたほうがいいような。
もしかしてガイシュツだったりする。
0238デフォルトの名無しさんNGNG
std:auto_ptr って何で get メソッドを持ってるんですか?
ポインタの管理を全て auto_ptr が面倒見るから利点があるのだと思うのですが
0239デフォルトの名無しさんNGNG
>>238
生ポインタを引数に取る関数とか呼び出せないじゃん
0240デフォルトの名無しさんNGNG
>>236
>Kodakの特許はWang Laboratoriesのイメージングソフトウェア部門が開発した技術を
>Kodakが1997年に買い取ったもので、2個のソフトウェアが協調動作する技術、
>つまりオブジェクト指向プログラミングのキーコンセプトであり、
>ユーニス氏によれば、1960年代に開発されたSimulaコンピュータ言語にまでさかのぼることができるという。
公知で特許成立しないんじゃないの? 解説よろしく
0241デフォルトの名無しさんNGNG
よくわからんがC++のクラスは大概の実装において仮想関数ポインタのテーブル持ってるだけだから、
逆にそれが特許侵害と認められるとCなどの非OOのコードすら危うくなってくるわけだ・・・。
0242デフォルトの名無しさんNGNG
>>241
ちょっと見てみたけど、もっと抽象的なレイヤーでの特許みたい。
OOベースのRPC (Remote Method Invokation の類) と、ORB の基本概念あたりをカバーしてる。
出願時点(1993 年)に既に公知だったような気がするけど・・・
0243デフォルトの名無しさんNGNG
スラドが大好きそうなネタだけど誰もたれこんでないのん?
0244デフォルトの名無しさんNGNG
Javalobby にスレが立ってる。

http://www.javalobby.org/thread.jspa?forumID=61&threadID=14434&start=0&mode=flat
0245デフォルトの名無しさんNGNG
>>239
生ポインタに限定って時点でSTLじゃねえな
0246デフォルトの名無しさんNGNG
ヘッダにusing namespace xxx;使う場合と、
ソースにusing namespace xxx;を使うのとでは意味が違うんでしょうか?
0247デフォルトの名無しさんNGNG
>>246
どんなしょぼい参考書にも必ず書いてあると思うが。
0248デフォルトの名無しさんNGNG
意味は同じ。
効果範囲はスコープ内。
0249デフォルトの名無しさんNGNG
>>248
ヘッダはグローバルスコープで、
ソースだとそのファイルがスコープになるということかしら?
0250デフォルトの名無しさんNGNG
書いた場所から次の

}

まで。普通のauto変数と一緒。
0251デフォルトの名無しさんNGNG
>>246=249
C++にヘッダとソースの区別なんか無いよ。
0252デフォルトの名無しさんNGNG
ヘッダを#includeした先でusing namespaceしちゃうから迷惑
■ このスレッドは過去ログ倉庫に格納されています