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

C++相談室 part34

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

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
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
んなアンコモンケースに対応することの方がどうでもいい。
0448デフォルトの名無しさんNGNG
>>447
そうか?
つーか現状のfor構文の方に
不備があるだろ、どっちかって言うと。
for()内のカンマをセミコロンに、
セミコロンを別の適当な記号に置き換えれば
無問題になるし意味的にも自然だ。
0449デフォルトの名無しさんNGNG
僕のキーボードには適当な記号がありません。
0450デフォルトの名無しさんNGNG
そこでトライグラフですよ。
0451デフォルトの名無しさんNGNG
??=include <stdio.h>
int main(int argc, char **argv)
??<
    printf("%d??/n", argc);
??>
0452デフォルトの名無しさんNGNG
たとえば:とか。
0453デフォルトの名無しさんNGNG
for(map::iterator im = m.begin; int i = 0;)(i < 10)(++i; ++im;) ...
0454デフォルトの名無しさんNGNG
do{
map::iterator im = m.begin;
int i = 0;}
whlie( i < 10){
...
++i; ++im;);
0455デフォルトの名無しさんNGNG
int* p = static_cast< int* >( operator new( 10 * sizeof( int ) ) );
operator delete( p );
と、
int* p = static_cast< int* >( operator new[]( 10 * sizeof( int ) ) );
operator delete[]( p );
は何か違いがあるのでしょうか?
あるのなら何を基準に使い分ければいいのでしょうか?
0456デフォルトの名無しさんNGNG
>>455
reinterpret_cast ちゃうか?
0457デフォルトの名無しさんNGNG
>>455
ここ読め。
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-3.html
new int[10]だと10 * sizeof(int)以上の領域を確保しなければならない可能性がある。
0458デフォルトの名無しさんNGNG
char EndChr[10] = "n";
int flag = 1;
if (EndChr == "n"){
flag = 0;
}

このような式においてEndChr == "n"がfalseになります。
なぜなのでしょうか?
0459デフォルトの名無しさんNGNG
>>457
>>455のような例では両者に領域の違いも何もないということですよね?
new 演算子で配列を確保場合、必要以上の領域を確保する可能性があると。
0460デフォルトの名無しさんNGNG
>455
そもそもoperator newはnewから呼び出される為の物だということを忘れるな。
0461デフォルトの名無しさんNGNG
>>460
は?
0462デフォルトの名無しさんNGNG
>>458
アドレス比較してるから。char[10] の代わりに std::string 使うか strcmp() で比較。
0463デフォルトの名無しさんNGNG
あれ、分からなくなってきた…
class C{ ... };

C* p = static_cast< C* >( operator new( 10 * sizeof( C ) ) );
for( int i = 0; i < 10; ++ i )
    new( p[ i ] ) C( ... );
...
for( int i = 0; i < 10; ++ i )
    p[ i ].~C();
operator delete( p );

と、

C* p = static_cast< C* >( operator new[]( 10 * sizeof( C ) ) );
for( int i = 0; i < 10; ++ i )
    new( p[ i ] ) C( ... );
...
for( int i = 0; i < 10; ++ i )
    p[ i ].~C();
operator delete[]( p );

はどっちも正しい?
0464デフォルトの名無しさんNGNG
アドレスが別だからじゃないの?
0465デフォルトの名無しさんNGNG
>>463
どちらも正しくないんじゃない?動くとは思うけど。
malloc でも動くけどね。
0466デフォルトの名無しさんNGNG
>>465
あ、スイマセン…
new( &p[ i ] ) C( ... );
です
0467デフォルトの名無しさんNGNG
>>443
まー確かに、全く平等な条件で選んでた言語かって聞かれると・・・・だな。
市場のデカさは間違いなく判断基準に入ってる。
0468デフォルトの名無しさんNGNG
今、C++を勉強しているのですが、オブジェクトが難しくて理解があまりできていません。
それで、オブジェクトの事を詳しく説明しているサイトがあれば、教えて頂けないでしょうか?
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています