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

C++相談室 part9

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさんNGNG
現在最高のプログラム言語と言われるC++についてのご相談承ります。
(´∀`).。o(関連URLは>>2-5の辺り)
0809デフォルトの名無しさんNGNG
>>808
> だから、mapとしての機能は、もともと全部使いたいんですよ。
例が悪い、というか 798 と言ってることが違う。ころころ要求仕様を変えて
逆ギレしないように。

C 言語での配列の初期化
void (*func_table)[] = { &foo, &bar, &woo };
みたいに、定義と初期化をまとめたいっつー話なのね?
0810デフォルトの名無しさんNGNG
>>805
new してないものを delete する奴は、別問題だと考えて、ここでは new 出来なくするくらいでいいんじゃなかろうか。

new してないものを delete する・・・例えば
void foo(int*p){
 delete p;
}
void bar(){
 int i = 1;
 foo(&i);
}
こんな事する奴は、そもそも防ぎようがない。諦めれ。
0811デフォルトの名無しさんNGNG
日本語をうまく扱える文字列は、もうどうでもいいのか。
0812730NGNG
>>809
ああ、失礼。要するに、STLのコンテナとしての機能は、
何ひとつ損ないたくない、ってことを言いたいんでして。
で、そうです。定義と初期化をまとめたいんです。
理想はコンパイル時に初期化が済んでるといいんですけどね。
それはさすがに無理っぽいです。

>>810
ですね。VCでちょっと実験してみましたけど、派生クラス側でoperator deleteを
禁止しても、呼び出されるdeleteは基底クラス側だから、>>810的な
コードを書かれたら防ぎようがないんですね。まいった……。

>>811
いや、どうでもよくはないんです。>>759以降、レスがもらえないから
話が出来ないだけでして。
0813デフォルトの名無しさんNGNG
>>812
違うネタをふったのはあんただよ
0814デフォルトの名無しさんNGNG
>>812
ちなみに、今何をつくってるんすか?
0815デフォルトの名無しさんNGNG
データ用のクラスを作って
STLコンテナとの
多重継承にして、
データ用のクラスでデータ管理すればいいんでない?
0816デフォルトの名無しさんNGNG
>>812
俺なら、こんな感じで書くかねぇ。

typedef void (*func_type)();
struct func_tbl {
  const char *d_str;
  func_type d_func;
};

typedef map<string, func_type> dispatcher;

dispatcher
dispatcher_creator(struct func_tbl *p)
{
  dispatcher d;
  for (; p->d_str != NULL; ++p)
    d.insert(dispatcher::value_type(p->d_str, p->d_func));
    // 重複エラーのチェックをすること
  return d;
};

int
main()
{
  struct func_tbl tbl[] = {
    { "foo",   &foo },
    { "bar",  &bar },
    { NULL, NULL },
  };

  dispatcher d(dispatcher_creator(tbl));

  return 0;
}
0817デフォルトの名無しさんNGNG
>> 定義と初期化をまとめたいんです。

勝手にまとめろやごるぁ。

dispatcher& funcMap()
{
 static const dispatcher::value_type initial_values[] = { ... };
 static dispatcher unique_instance( &initial_values[0]
                   , &initial_values[sizeof(initial_values)/sizeof(table_type::value_type)] );
 return unique_instance;
}
0818817NGNG
まちがえちったぞごるぁ
s/table_type/dispatcher
0819デフォルトの名無しさんNGNG
>>812
日本語を上手く扱える文字列としてstd::wstringを使わない理由は?
0820730NGNG
>>814
ゲームです。

>>815-818
興味深いアイデア、いろいろありがとうございます。でも、>>800より
言いかと考えると、どれも微妙ですね。

>>819
ああ! そういや、そんなのがあるってのをなんかで見たような……。
ちょっとぐぐってみました。えーと。マルチバイト文字をstringで
読み込んで、標準関数(?)の mbstowcs()でwstringに
入れてしまえば、全部の文字が2バイト単位で扱える。で、テキスト
出力したいときはwcstombs()でマルチバイト文字でstringに戻せる。
……でいいんでしょうか。Webじゃあんまりいい情報が見つからないんで、
なにかお勧めの書籍があったら教えてください。
0821デフォルトの名無しさんNGNG
戻したりするのが限りなくうざい
0822デフォルトの名無しさんNGNG
>>820
> でも、>>800より言いかと考えると、どれも微妙ですね。
変数定義と初期化をまとめたいって話なら、おれは 817 か 818 だと思うがね。
800 だと初期化に使う内容が、変数の定義部分と離れてしまう。

逆に、多くの箇所で同一の値で初期化された map を利用するのなら 800 だ
ろう。

(相変わらず要求仕様が曖昧なんで、どっちが良いのか良く分からんが)
0823デフォルトの名無しさんNGNG
std::string str = "abcd\nefgh\nijkl\n"
のような文字列を\nで分割したいのですが、
C風でなくC++風に分割するにはどうすればよいのでしょうか?

例えばstr1にabcd、str2にefgh、str3にijklのようなイメージです。

findで\nを探してsubstrで取り出すという方法を考えたのですが、
より良い方法はあるのでしょうか・
0824コギャルとHな出会いNGNG
http://kado7.ug.to/net/


朝までから騒ぎ!!
   小中高生
 コギャル〜熟女まで
   メル友
  i/j/PC/対応

女性の子もたくさん来てね
                 
全国デ−トスポット情報も有ります。
全国エステ&ネイル情報あります。
0825デフォルトの名無しさんNGNG
>>823
strtok
0826デフォルトの名無しさんNGNG
>>823
boost::regexかboost::tokenizerを使うのが簡単だけども
標準ライブラリではないな
0827デフォルトの名無しさんNGNG
>>825
ありがとうございます。
stringのままよりこちらの方が良いですか。
0828デフォルトの名無しさんNGNG
>>826
そちらが簡単ですか。
標準ライブラリ以外でも大丈夫なので
そちらも調べてみたいと思います。
ありがとうございました。
0829デフォルトの名無しさんNGNG
C++を勉強しているのですが、vectorがよくわかりません。

#include <iostream>
#include <vector>
using namespace std;
class hoge {
public:
 hoge() { cout << "hoge()" << endl; }
 ~hoge() { cout << "~hoge()" << endl; }
};
int main() {
 {
  vector< hoge* > v;
  for (int i = 0; i < 3; i++) v.push_back(new hoge);
  for (int i = 0; i < 3; i++) v.pop_back();
 }
 return 0;
}

スコープを抜けてvectorが削除されるときか、さもなくば
pop_back()で要素を削除したときにhogeのデストラクタを
呼び出して欲しいのですが、うまくいきません。

何かいい方法はないでしょうか。
0830デフォルトの名無しさんNGNG
>>829
vector<hoge> を使えばいい。
0831デフォルトの名無しさんNGNG
>>830
vector<boost::shared_ptr<hoge> > もな。
0832デフォルトの名無しさんNGNG
boost::shared_ptr を使えば良い
0833デフォルトの名無しさんNGNG
>>830-832
vector<hoge>だと一時オブジェクトができるのがちょっと厭だったんです。

shared_ptrというものがあるんですか。
それを調べてみます。

どうもありがとうございました。
0834デフォルトの名無しさんNGNG
この場合にauto_ptrだけは使わないようにな。
0835デフォルトの名無しさんNGNG
なんでC++ってポインタ(参照含む)の種類がたくさんあるんだろうね。
複雑なだけじゃん。
0836デフォルトの名無しさんNGNG
>>833
>vector<hoge>だと一時オブジェクトができるのがちょっと厭
*まずは* それを気にしない、メモリ管理の事は自分の責任にしない、というのが
C厨を脱する1手段である気もするけどな。

まぁ、いつまでもそれじゃ駄目なんだけどさ。


0837デフォルトの名無しさんNGNG
>>836
禿童
0838デフォルトの名無しさんNGNG
>836
std::string& を返す関数を書いてしまい慌ててEffectiveあたり買いにいく罠、だな。

0839デフォルトの名無しさんNGNG
>>835
> なんでC++ってポインタ(参照含む)の種類がたくさんあるんだろうね。
それが分かれば C++ 中級認定。
0840デフォルトの名無しさんNGNG
ポインタの種類?
0841デフォルトの名無しさんNGNG
>>835
もともとポインタはアドレスと型の情報しかない。メモリはCではプログラマが完全に管理するものだった。
C++でも初期のころはそうだった。後に参照ができSTLができた。
ポインタをプログラマが管理するのは苦痛である。それをSTLで簡単に管理することが可能になった。
しかしそれは無理やりに近い方法である。そのためスマートな解決策がなく結果としていろんなものが出来てしまった。
メモリの管理は簡単になったかもしれないが、反対に実装を詳しく知らないとバグを入れやすくなってしまった。
ポインタの管理を言語側にすべて任せてスマートに解決したものがGC
C++を使っている以上、メモリの管理は難しい。
0842デフォルトの名無しさんNGNG
C++の日本語のリファレンスマニュアルネット上にありませんか?
0843842NGNG
すみませんみつけたからいいです
0844デフォルトの名無しさんNGNG
ふつーの、GUIを持つアプリケーションをつくるならどうでもいいけどね。
Strutsなんかを見ているとGCありの言語が羨ましくなる。
0845デフォルトの名無しさんNGNG
>>843
どこだ?あるのか?
0846デフォルトの名無しさんNGNG
なんだGCなんて略すなよ
調べちゃったじゃないか
0847デフォルトの名無しさんNGNG
がべこれ
0848デフォルトの名無しさんNGNG
演算子関数の為に(省略)
0849デフォルトの名無しさんNGNG
>>846
略さないで書く奴なんでイネーヨ(藁
0850デフォルトの名無しさんNGNG
なんでC++って標準GUIライブラリが無いんですか?
0851デフォルトの名無しさんNGNG
>>850
必要ないから
0852デフォルトの名無しさんNGNG
>>851
C++でGUIアプリを書かないっていうことですか?
0853デフォルトの名無しさんNGNG
入れてとこうかって話あったんだけどさ、
その標準ライブラリで作られるGUIが、あんまりかっこわるくてさ、
俺が反対しといた。ごめんな。
0854デフォルトの名無しさんNGNG
>>853
GUIのかっこよさって実装でどうにかすればいいだけじゃないんですか?
0855デフォルトの名無しさんNGNG
だから個人個人で勝手にかっこよく実装してくださいってことにしたのよ。俺ら。
0856デフォルトの名無しさんNGNG
>>855
なんで設計や仕様を統一させなかったのですか?
0857デフォルトの名無しさんNGNG
入ったとしてもX.hとかWindows.hとかOS依存になるだろうな。
0858デフォルトの名無しさんNGNG
いや、統一しようと結構頑張ってるけどさ、コンパイラ作る人がわからずやでさ。
困ったもんだね。
0859デフォルトの名無しさんNGNG
あ、858は856へね。
0860デフォルトの名無しさんNGNG
そういやGUIと関係ない標準クラスライブラリ(STLじゃなく)も無いような気がしますが。
0861デフォルトの名無しさんNGNG
なんで
> STLじゃなく
ってSTLを除くの?あれ結構頑張って作ってるよ、俺ら。
0862デフォルトの名無しさんNGNG
>>861 他
面白くない。
0863デフォルトの名無しさんNGNG
  ,、__,、 
 ( '・ω・) ショボーン
 (、っiョc)
  ゙'ー'゙ー'゙
0864デフォルトの名無しさんNGNG
オモロくないけど、標準クラスライブラリってSTLじゃないとしたらどんな物を指してるの?
0865デフォルトの名無しさんNGNG
iosとかでしょ。
0866デフォルトの名無しさんNGNG
>>864
Java の socket やら GUI 周りのライブラリみたいのを想像してるんじゃないのか?
0867デフォルトの名無しさんNGNG
socketまわりは何かあれば嬉しいなといつも思うけど。
0868デフォルトの名無しさんNGNG
VCL使うべし
0869デフォルトの名無しさんNGNG
>>868
それ「標準」ライブラリじゃないし、その候補でさえない……。

>>867
使ったことないんだが Common C++ Libraries とか、どう?
http://sourceforge.net/projects/cplusplus/
0870デフォルトの名無しさんNGNG
>>869
イマイチもいいとこ
0871デフォルトの名無しさんNGNG
std::string strの中にある\nの数を調べるために

int allnum = 0;
for(const char* i = str.c_str(); i != NULL; i++) {
   if(*i == 0x0d && ++*i == 0x0a)
      allnum++;
}

と書いてみたんですが、もっといい方法はありますか?
0872871NGNG
間違えました
int allnum = 0;
for(const char* i = str.c_str(); i != NULL; i++) {
   if(*i == 0x0d && *(++i) == 0x0a)
      allnum++;
}
0873デフォルトの名無しさんNGNG
c_str使ってる時点でやる気を感じない。
とりあえずfindつかって書いてごらんよ。
0874デフォルトの名無しさんNGNG
>>873
数を数えるなら count_if だろう。

class IsChr
{
  const char ch_;
public:
  IsChr(const char ch) : ch_(ch) {}
  bool operator()(const char ch) const { return ch == ch_; }
};

cout << count_if(s.begin(), s.end(), IsChr('\n')) << endl;
0875デフォルトの名無しさんNGNG
少しきれいでないのが微妙ですがこんな感じでいかがでしょうか?
int allnum = 0;
int pos = 0;
while(true) {
   if((pos = s.find("\n", pos)) == std::string::npos)
      break;
   allnum++;
}
0876871,872,875NGNG
>>874
countで最初やろうとしていたんですがcount_ifですか。
これから調べてみたいと思います
0877874NGNG
>>876
この場合 count の方が良いな。
0878デフォルトの名無しさんNGNG
cout << count(s.begin(), s.end(), '\n') << endl;
0879878NGNG
二足遅かった…。。。
0880デフォルトの名無しさんNGNG
>>877-878
countでOKでしたか。最初やったらエラーが出でて・・・
ありがとうございます。
0881デフォルトの名無しさんNGNG
count_ifはもっと複雑な検索条件を指定する時に使うといいね。
0882デフォルトの名無しさんNGNG
0883デフォルトの名無しさんNGNG
通常の方法およびクラス方法の差は何ですか。C++はルビーより非常に劣っている言語ですが、さらにC++にいくらかのクラス方法がありますか。それが悪い頭と紳士に尋ねているので、初期に答えてください。
0884デフォルトの名無しさんNGNG
こうして基本的なアルゴリズムを知らない人が増えるのであった。
0885デフォルトの名無しさんNGNG
>>883
英語で書いてください。
0886デフォルトの名無しさんNGNG
>>864
クラス方法およびアルゴリズムとのどの関係がそこにありますか。知らせてください。
>>865
それはここで日本の掲示板ではありませんか。
私は、日本語を流暢に話すことができるので、満足であると思います。
0887デフォルトの名無しさんNGNG
>>886
なんて書いてあるか理解できません。
0888デフォルトの名無しさんNGNG
>>883>>886
日本人で地でやっているとしたら天才。
多分一度英語に機械翻訳してからまた日本語に戻しているのだろうが。
0889デフォルトの名無しさんNGNG
私の日本の能力は非常に素晴らしい。あなたの頭が悪いので、病院へ行くために推薦します。また、もはや現われないでください。あなたの考察に感謝します。愚か、氏、887
0890デフォルトの名無しさんNGNG
C++ is superior to Ruby.
0891デフォルトの名無しさんNGNG
ッヒヤッヒャッ。
0892デフォルトの名無しさんNGNG
この試みは私が開発した翻訳エンジンをテストするために遂行されました。それはしませんが、それら[説明で]あなたへの―ま、それは少しの程度および希望に関連させます。
0893デフォルトの名無しさんNGNG
>>889
どうする>>888でばれたぞ。
0894デフォルトの名無しさんNGNG
>>892
あなたの作成したかもしれない翻訳エンジンは、どちらかと言うと改良するための
必要が存在すると思うかもしれません。
0895デフォルトの名無しさんNGNG
下らん外人もどきは無視。
0896デフォルトの名無しさんNGNG
おまえら人口無能相手に何を必死になって居るんだ
0897デフォルトの名無しさんNGNG
>>896
いや盆休みで暇なんでちょうどいい暇潰しにと思って。
0898デフォルトの名無しさんNGNG
hikikomori is very superior to 2channeler.

hikky! >>>>>> Rubyist
0899デフォルトの名無しさんNGNG
答えをまだ得ることができませんか。
しない、1レベルがより高く来られる場合、1つ、この掲示板?容易なものは単に聞かれます。
それは理解します(そのようなもの)?排泄物BAKA--それは死ぬことができます(よ答え)それは糞です、何、容易なもの糞。
それは、ものが何を使用しなければならないか尋ねています、どのように、クラス方法として。
0900デフォルトの名無しさんNGNG
class _899 {
public: void hang_up()
{
   ||    
   ||    
   ||      yesterday...
 ∧||∧  
(  ⌒ ヽ
 ∪  ノ 
  ∪∪

}
};
0901デフォルトの名無しさんNGNG
読めないので英語に戻す。

Can't an answer be obtained yet?
the case where bend and one level comes more highly
-- one and this bulletin board --
it is only asked to an easy thing It is the ?
excrement BAKA to understand (such a thing).
-- It (よ答え) from which it can die is what and
the easy thing excrement which are excrement.
It is as the class method to how that is asking
what a thing must use.
0902デフォルトの名無しさんNGNG
あなたは恐らく理解しませんが、ルビーは素晴らしい言語です。
それは、オブジェクト指向のスクリプト言語として他のスクリプト言語を圧倒する実行および美しい言語明細を行っています。
例えば、スキーム、SmallTalkなどが比較的美しい言語であると言われていますが、ルビーは遅れる優位によって一層の美および一層の現実性を装備しています。
もちろん、Perl、ピュートーンなどは問題外です。
日本語との類似性では、選択が単にルビーを持つでしょう。
ルビーのLinuxの分配の採用の例は増加していました。
分配はすべて、1年後に、ルビーの標準の採用を行なうでしょう。
ルビーは将来のスクリプト言語です。

それは、長くなりましたが、KOPIPEではありません。
場合、KOPIPE[承認することができる人々は、ルビーのものを理解することができない人々に会います、そして/この発言]、それらは幸福です。
0903デフォルトの名無しさんNGNG
なぁ、翻訳するのは簡単だが翻訳されたものを元に戻すのは
難しいことを暗号に利用できんか?
0904デフォルトの名無しさんNGNG
日本語→英語→日本語を何回もして、もはや原文のニュアンスが
失われている。
0905デフォルトの名無しさんNGNG
この際どこまでくずれるかやってみたら
0906デフォルトの名無しさんNGNG
Rubyは松本死のonaniy!さ。
0907デフォルトの名無しさんNGNG
どうやって翻訳してるんだ?
その翻訳そふとかなり完成度高そうじゃないか?
0908デフォルトの名無しさんNGNG
>>904
それ他の言語への翻訳も間に入れて何回も繰り返してみたんだが
翻訳がおかしくなるのはある程度までなんだよな。
もちろん原文とは違うがある程度で内容の劣化が止まる。
だからなにと言われても困るが。
レス数が900を超えています。1000を超えると表示できなくなるよ。