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

C++相談室 part34

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

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0348デフォルトの名無しさんNGNG
>>347
new_handler 書いたり、アロケータ用意したりとかマンドクセ
0349デフォルトの名無しさんNGNG
using namespace std;
ってやるのと、必要になる都度
std::
ってやるのとどっちがいいですか?
あと、どっちの方が主流なコーディングですか?
0350デフォルトの名無しさんNGNG
どっちもやるけど、主に std:: って、その都度つけてる。
using namespace std; しちゃうと string, vector, list, map 等々、
ありきたりな名称で名前空間を汚されるのが嫌。てかうっかり名前
被らせて知らぬ間にバグを埋め込みそうで怖い。
0351デフォルトの名無しさんNGNG
そうですか
やはり std:: ってやる方がいいですか。
せっかく分けた名前空間をごっちゃにしちゃ意味ないですもんね。

ありがとうございました
0352デフォルトの名無しさんNGNG
>>345
重要なのはコンパイルスイッチでの制御の可否じゃなくて、当時の仕様だ。

>>347
windows.hが通らないだけだった気がする
0353デフォルトの名無しさんNGNG
>349
ヘッダのグローバルな部分ではusing namespaceは使っちゃ駄目、絶対。
でも小さなソースファイルとか、関数単位ならそれほど問題ない。
0354デフォルトの名無しさんNGNG
>>353
自分でも using namespace std; って書いててかなり疑問に感じてました。
名前空間の持つそのものの利点が失われるので。

std:: とその都度打つ方が主流みたいですし、はっきりした利点もあるようなのでこれからはこう書いていきます
0355デフォルトの名無しさんNGNG
>名前空間の持つそのものの利点が失われるので。

名前空間の持つ欠点も失われるけどね。
0356デフォルトの名無しさんNGNG
欠点が失われるのはよいことでは?
0357デフォルトの名無しさんNGNG
ズレたレスにズレたレスがついて
次どうなるかまったく予測がつかなくなった例
0358デフォルトの名無しさんNGNG
得失点差による激しいバトルとなってまいりました
0359デフォルトの名無しさんNGNG
>>357
読んでても一貫して無くて、むきーっとなるなw
0360デフォルトの名無しさんNGNG
仕事で、UNIX環境での、C++のコーディングチェック&修正のための、ツールを、作りたいです。


で、やっぱ、こういうのって、文字列操作が、からんで、くるじゃないですか?

ってことは、やっぱり、PERLがいいのでしょうか?
それとも、C++?


皆さんも仕事で、コーディングチェックのための、ツールを、作っていると、思うのですが、
言語は、何が、おすすめでしょうか?

0361デフォルトの名無しさんNGNG
>>360
文字列操作なんて言ってるようじゃ無理ぽ。
そんなの、先人の作ったオプソのツールを活用せい。
それと、手段を目的にしてるようじゃダメだね。
0362デフォルトの名無しさんNGNG
>>360
> 皆さんも仕事で、コーディングチェックのための、ツールを、作っていると、思うのですが、
作ってないし使ってない。人が作ってるものを探してるなら C++ beautifier あたりで
検索かけてみ。
0363デフォルトの名無しさんNGNG
>>360
コーディングチェックって、具体的にはなにをするの?
0364デフォルトの名無しさんNGNG
ヘンな読点には突っ込まないのか。大人だなおまいら。
0365>>360NGNG
みなさん、レスありがとうございます。

なるほど、人が作っているものが、あるのですね。
そうします。

>ヘンな読点には突っ込まないのか。大人だなおまいら。
すいません、リアル中国人SEなので。
話すのは流暢なのですが、文章苦手です。
在日10年で、この7月に永住許可、もらっちゃいましたよ。(帰化ではないですよ)

0366デフォルトの名無しさんNGNG
>>365
そうか。すまんかった。
0367デフォルトの名無しさんNGNG
>>365
できれば>>363に答えて欲しい。
0368デフォルトの名無しさんNGNG
>>367
南京大虐殺、の被害者数捏造とかです。
0369デフォルトの名無しさんNGNG
>>364
>>360は西村京太郎だろ
0370デフォルトの名無しさんNGNG
>>368
技術者の場でそういうネタを持ち込むはやめれ。
0371デフォルトの名無しさんNGNG
>>370
いやあ、技術に国境は確固として存在するよ。それに伴う偏見や雑言もね
0372デフォルトの名無しさんNGNG
見ていて、ウケないネタほど痛々しいものはないな。
0373デフォルトの名無しさんNGNG
質問です。
言語はC++です。
int型の数値をchar型の文字列に変換したいときは
どのような関数を作ればよいですか?
同じように、
double→char
など。
初心者の質問で申し訳ないですが
宜しくお願いします。
0374デフォルトの名無しさんNGNG
int n = 1;
char c = 2;
double d = 3.0;

c = static_cast< char >( n );
c = static_cast< char >( d );

こういうこと?
0375デフォルトの名無しさんNGNG
>>458
sprintf()
0376デフォルトの名無しさんNGNG
>>458
fgets()
0377373NGNG
>>374

374さんが書いたコードは、

int i;
char j;
j = (char)i;

といったかんじの普通のキャストとは
やはりどこか違うんでしょうか?

>>375
sprintfという便利なものが
あったのですね。
とりあえずがんばってみます!

ありがとうございました。
0378デフォルトの名無しさんNGNG
>>375-376
ワラタ
暗にマルチポストを指摘しているな。
0379デフォルトの名無しさんNGNG
>>458
そういうことなら
ostringstream ってのがある
0380デフォルトの名無しさんNGNG
http://pc5.2ch.net/test/read.cgi/tech/1091264964/458
0381デフォルトの名無しさんNGNG
STLにatoiのc++っぽいのはなかった?
boostかな?
うわおれc++忘れてる
0382デフォルトの名無しさんNGNG
boostのlexical_castだな。
0383デフォルトの名無しさんNGNG
戻り値で構造体を返す場合、どれが最も優れていると思いますか?
また他にもっと良い方法はありますか?

A get( ){
return a;}

const A a = get( );

この方法は値渡しがネックです。


void get( A& a ){
a = b;}

A a;
get( a );

この方法だと2行必要ですし、constが付けられません。
0384383の続きNGNG
A& get( A& a = A() ){
return a = b;}

const A a = get( );

この方法はオーバーライドした際、バグの元になりやすいです。
例)
A& get2( ){
return get();}


A& get( ){
static A a; // TLSでも可
return a = b;}

const A a = get( );

この方法だとなんだか無駄が多い気がします。
キャッシュミスも起こりそう。
0385デフォルトの名無しさんNGNG
>>383
NRV 最適化でググれ。
0386デフォルトの名無しさんNGNG
>>383
NRVとは初めて知りました。
自分のコンパイラ(VC)で適用されるのか試してみます。
ありがとうございました。
0387デフォルトの名無しさんNGNG
VCなら条件付で6のころからNRV適用される
0388デフォルトの名無しさんNGNG
C++BuilderはNRVなんて無さそうだな。
あれほんとに何も最適化しないもんな。
定数式の最適化位だろ。
0389デフォルトの名無しさんNGNG
自作クラスの複数のメンバ変数から、任意に一つ選んで比較キーとして、STLのアルゴリズムに食わせたい場合どうすればいいの?
class Personal {
string name, sex, tel, email;
int age;
}
例えば、こんなクラスで、あるときはnameで、あるときはageでソートや検索をしたいという場合です。
operator== や operator< はクラスで1つしか持てないので、別の比較関数(or関数オブジェクト)を用意する必要があると思いますが、
どこで用意するのが管理しやすいでしょうかね・・・。

マネージャクラスを別に作って、そこにstaticな比較関数を持たせるのが一番楽かなと思っているんですが・・・
class PersonalManager {
public:
static bool AgeCompareLessl(Personal &p1, Personal &p2){ return p1.age < p2.age}
;
}
としておいて、
vector<Personal> v;
sort(v.begin(), v.end(), PersonalManager::AgeCompareLess);

これじゃぁ、あんまり頭よさそうじゃないですよね。
もっといい案あったら教えてください。
0390デフォルトの名無しさんNGNG
struct PersonalComparator
{
 bool operator() (const Personal &p1, const Personal &p2){ return p1.age < p2.age; }
}

vector<Personal> v;
sort(v.begin(), v.end(), PersonalComparator());
0391デフォルトの名無しさんNGNG
×PersonalComparator
○PersonalAgeComparator
0392デフォルトの名無しさんNGNG
>>389
ttp://www.tietew.jp/cppll/archive/549
0393デフォルトの名無しさんNGNG
>>390
それだとやっぱりメンバの数だけ、関数オブジェクトが出来てしまいますよね。
なんか分散しちゃうのが感覚的に嫌な感じ・・・。

>>392
ありがとうございます。そういう奴がほしかったんです。
templateつかってうまいことできないかなぁと。
とりあえずそこ読んで研究してみます・・・・。
0394デフォルトの名無しさんNGNG
c++でエスケープシーケンスはどうすれば使えますか?
printf("\x1b[30m");
とか。

VC++.NETを使っています。
0395デフォルトの名無しさんNGNG
萌える法律読本
http://book.mycom.co.jp/user/preview/4-8399-1555-5/index.shtml

この本に日本の未来に光を感じました。
これのC言語版がほしいのですが、どこで売ってるのか教へてください。
おながいします。

はふはふ。
0396デフォルトの名無しさんNGNG
憂鬱とAcceleratedを教えてくれたひと、本当にありがとう。
0397デフォルトの名無しさんNGNG
intからstd::stringに変換するにはどうしたらいいですか?

ちなみにコーディング規約でsprintf使用禁止になっています。

std::stringにそのようなメソッドはないでしょうか?
0398デフォルトの名無しさんNGNG
istringstream
0399デフォルトの名無しさんNGNG
あ、この場合 ostringstream だね
0400デフォルトの名無しさんNGNG
#include <sstream>
#include <iostream>
using namespace std;
int main(){
  stringstream ss;
  string s;
  int n;
  cin >> n;
  ss << n;
  ss >> s;
  cout << s << endl;
  return 0;
}
0401デフォルトの名無しさんNGNG
>>389
メンバ変数ポインタと Boost Bind もしくは Boost Lambda を使う。たとえば名前をキーに
したければ

boost::bind(std::less<string>(), boost::bind(&Personal::name, _1), boost::bind(&Personal::name, _2))

あるいは

using namespace boost::lambda;
bind(&Personal::name, _1) < bind(&Personal::name, _2)

ってな感じで、望みの関数オブジェクトが作れる。
0402デフォルトの名無しさんNGNG
>>397
馬鹿な規約ですね。
0403デフォルトの名無しさんNGNG
立派な規約じゃないか
0404デフォルトの名無しさんNGNG
自由に組ませてやれよ
0405デフォルトの名無しさんNGNG
>>397
sprintf 禁止でも snprintf なら OK とか?
0406デフォルトの名無しさんNGNG
ANSI使うなってことで、wsprintfならいいんだろう
0407デフォルトの名無しさんNGNG
>389
>401
ちなみにlambdaなら

using namespace boost::lambda
&_1->*&Personal::name < &_2->*&Personal::name

こういう書き方もできますよ.
0408デフォルトの名無しさんNGNG
書式設定しなきゃならんし型安全性もないし拡張性もない sprintf なんかいるか!!
0409デフォルトの名無しさんNGNG
>>394
std::cout << "\x1b[30m";
0410>>397NGNG
皆、レスありがとうござ(ry

0411デフォルトの名無しさんNGNG
>>409
できないです。
どうすればいいでしょう。

もしかしてVC++についているコマンドプロンプトみたいのを使ってるから?
0412デフォルトの名無しさんNGNG
なんだわかっているじゃん。
VC++付属じゃないけどな。
0413デフォルトの名無しさんNGNG
VC++で直接してもむりでした。

コマンドプロンプトでする方法ないですか?
0414デフォルトの名無しさんNGNG
そもそもエスケープシーケンスはNT系なら不可能。
0415デフォルトの名無しさんNGNG
ANSI.SYSの設定をしたらできるのでは?
0416デフォルトの名無しさんNGNG
ハゲシク デジャヴ
0417デフォルトの名無しさんNGNG
>>416
STLつかうと(ry
0418デフォルトの名無しさんNGNG
>>413
こういうのはどうだ?
http://www.kumei.ne.jp/c_lang/intro/no_58.htm
0419デフォルトの名無しさんNGNG
>>417
環(ry
0420デフォルトの名無しさんNGNG
>>419
すげ(ry
0421デフォルトの名無しさんNGNG
(ry
0422デフォルトの名無しさんNGNG
(r
0423デフォルトの名無しさんNGNG
(
0424デフォルトの名無しさんNGNG
0425デフォルトの名無しさんNGNG
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフウフフフフ
0426デフォルトの名無しさんNGNG
バッファあふれてるぞ?
0427デフォルトの名無しさんNGNG
char* はちゃんと初期化しる!


って話かとオモタ。
0428デフォルトの名無しさんNGNG
C++ では

for( int i = 0; i < 10; ++ i ){
...
}

std::cout << i << std::endl;

みたいな風に、for を抜けても i を参照することって許されてるんですか?
0429デフォルトの名無しさんNGNG
>>428 いいえ
0430デフォルトの名無しさんNGNG
>>429
マジデスカ…

おのれ VC7.1 …
0431デフォルトの名無しさんNGNG
>>430 http://www.microsoft.com/japan/msdn/library/ja/vccore/html/vcrefZcforScope.asp
0432デフォルトの名無しさんNGNG
>>431
おぉ、THX!
これやってみます
0433デフォルトの名無しさんNGNG
他にもこんな方法もある。
#define for if (0) ; else ; for
0434デフォルトの名無しさんNGNG
forループのスコープ云々って
イテレータが2種以上あるとき無力だにょなあ

map::iterator im = m.begin();
for( int i = 0; i < 10; ++i, ++im)...

結局こうなっちゃうし。
俺は古い仕様のままでいいと思うけど。
0435デフォルトの名無しさんNGNG
どっちでもいいけどどっちでもありうるのはいやだ
0436デフォルトの名無しさんNGNG
for ( int i = 0, map::iterator im = m.begin;
    i<10;
    ++i, ++im) {}
でいいじゃん
0437デフォルトの名無しさんNGNG
>>436
それ、コンパイル通る?
0438デフォルトの名無しさんNGNG
for (xxx::iterator it = m.begin(), end = m.end(); it != end; ++it)
なら通るんだけどねぇ
0439デフォルトの名無しさんNGNG
vc++.net2003で新しいプロジェクトを作ろうとすると
テンプレートが16種類もあるんだけど
どれが何用とか決まってんの?
0440デフォルトの名無しさんNGNG
一つは昼用、他は夜用。どれが昼用かは使ってわかってね。
0441デフォルトの名無しさんNGNG
>>436
int i = 0, map::iterator im = m.begin();
が、
int i = 0; int map::iterator im = m.begin();
と解釈されちゃうんだね。

forの初期化部には一つの型しか書けないわけか。
0442デフォルトの名無しさんNGNG
{ //こうでいいじゃん
 map::iterator im = m.begin;
 for (int i = 0; i < 10; ++i, ++im)
 {
 }
}
0443デフォルトの名無しさんNGNG
結論: C++ は糞
0444デフォルトの名無しさんNGNG
>>442
禿げしく却下
0445デフォルトの名無しさんNGNG
Cとかだと普通にやるけどな>ブロックスコープのでっち上げ
0446デフォルトの名無しさんNGNG
スコープ便利やん
人にとって
0447デフォルトの名無しさんNGNG
>434
んなアンコモンケースに対応することの方がどうでもいい。
■ このスレッドは過去ログ倉庫に格納されています