C++相談室 part19
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
NGNGただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。
過去スレ、関連スレ、関連リンクなどはこちら>>2-10
0685デフォルトの名無しさん
NGNGここ含めて5箇所にマルチポスト。
その内2つがスレ立て。
0686デフォルトの名無しさん
NGNG頼むから夜中に爆笑させないでくれえ〜。
0688デフォルトの名無しさん
NGNGんなこと言ったら、HOKJELKDSLKHLKFJHLEBIFBSDIFが使える時点でダメなんじゃねーの?
0689203
NGNGHOKJELKDSLKHLKFJHLEBIFBSDIF::hoge が
A::short_name::hoge としても使えるのは気持ち悪くありませんか?
namespace ___HOK = HOKJELKDSLKHLKFJHLEBIFBSDIF;
とか、「外部で使わないでー」というお願いを込めた名前にする、
というのならまだ使えるかも?
0690689=662
NGNG0691デフォルトの名無しさん
NGNGじゃぁboostにちなんでdetailの中でコソコソやっとけ。
0692デフォルトの名無しさん
NGNGヘッダファイルでusingを使うのは行儀が悪いのでやめた方がいい。
名前空間の名前を短くするか、そうでなければ全部書いてください。
コピペ使えばどうってことのない手間でしょう。
# どうでもいいが「名前空間の名前」って言い方はちょっと変か……
0693662
NGNGレスありがとうございます。
>ヘッダファイルでusingを使うのは行儀が悪いのでやめた方がいい。
非常に同感です。
使ってみて、強く実感しています。
>名前空間の名前を短くするか、そうでなければ全部書いてください。
>コピペ使えばどうってことのない手間でしょう。
エイリアスを使おうが、元の名前を短くしようが、
結局 using を使わない以上何らかの NAMESPACE:: を書かないといけないんですよね。
大人しく書く事にします。
0694デフォルトの名無しさん
NGNG基底クラスのインスタンスを渡しているのに、派生クラスにキャストすると
派生クラスのメンバ関数foo2が呼べるのはなぜですか?(最初は落ちるかと思ったんだけど…)
#include <iostream>
class A {
};
class B : public A {
public:
void foo(A* a) {
B *b = static_cast<B*>(a);
b->foo2();
}
void foo2() {
std::cout << "B::hoge()" << std::endl;
}
};
int main(int argc, char* argv[]) {
A a;
B b;
b.foo(&a);
return 0;
}
0695デフォルトの名無しさん
NGNGもしBにメンバ変数の追加があって、そのfoo2がそれを参照してるならやばいよ。
たまたまBで拡張された部分をアクセスしない関数だから大丈夫なだけ
0696デフォルトの名無しさん
NGNGstd::map<std::string, long> testMap;
testMap["111"] = 111;
testMap["222"] = 222;
testMap["333"] = 333;
testMap.erase("222");
こうやって要素を消しても、iteratorでmapをなめると、"222"をキーに持つ要素が出てきてしまいます。
0697デフォルトの名無しさん
NGNG0698動画直リン
NGNG0699696
NGNGちょっと別の質問なんですけど、mapの要素に対して[]を使ってアクセスすると、
なぜか要素のコンストラクタが呼ばれるようです(find()では呼ばれない)。
これってどういう事でしょうか。mapの要素に[]でアクセスするのは効率が悪いんですか?
0700デフォルトの名無しさん
NGNG0701デフォルトの名無しさん
NGNG> ちょっと別の質問なんですけど、mapの要素に対して[]を使ってアクセスすると、
> なぜか要素のコンストラクタが呼ばれるようです(find()では呼ばれない)。
なぜって、仕様読んだのか?
[]は新しい要素を代入することが出来る。
> これってどういう事でしょうか。mapの要素に[]でアクセスするのは効率が悪いんですか?
効率が悪いとしたら、使い方が間違っとる。
0702696
NGNGだから、例えば
std::map<std::string, CMyClass> theMap;
theMap["test"];//追加される
theMap["test"];//参照
theMap["test"];//参照
という感じで、追加されるのは最初の一回目だけで、後は参照するだけ
だと思っていたんですが、二回目以降もCMyClassのコンストラクタが呼ばれてます
theMap["test"]
theMap.find("test");
theMap.find("test");
こういうやり方ならコンストラクタは一回しか呼ばれません
0703デフォルトの名無しさん
NGNG0704デフォルトの名無しさん
NGNG他の言語の経験は?
0705デフォルトの名無しさん
NGNG推薦図書/必読書のためのスレッド PART 10
http://pc2.2ch.net/test/read.cgi/tech/1051496506/l50
0706デフォルトの名無しさん
NGNGoperator[] が
return insert( make_pair(key, val()) )->second
で実装されてる環境(VC6,7,Bcc5など)だと二回目以降も
デフォルトコンストラクタがよばれるし、
iterator i = find( key )
return ( i != end() ? return i->second : insert( make_pair(key, val()) )->second);
と実装されてれば(gcc3など)一回しか呼ばれないし。処理系による。
0708デフォルトの名無しさん
NGNG>wchar_t wt[256];
>_wcspcpy(wt, L"あ あ あ");
こういう使い方。
この場合、wtの中身は、UTF-8ですか?UTF-16ですか?
0709デフォルトの名無しさん
NGNG0710デフォルトの名無しさん
NGNGまずUTF-8みたいなマルチバイトではないだろうが
UTF-16かどうかは実装依存
Visual C++だとUCS-2, glibcだとUCS-4とかじゃなかった?
0711708
NGNGじゃあぁ、コンパイラ調べれば分かりますね。ちなみにBCBでつ。
DBにUNICODE入れようと思うのですが、UTF-8/16混在させたら読むに読めないから怖いですね。
UCSってのが何か良く分からないです。
0712デフォルトの名無しさん
NGNGこのへん読むとヨシ
http://euc.jp/i18n/charcode.ja.html#chap7
UCSは文字集合で、UTFは交換用符号だが
UTF-16というと、同じ2バイトでもUCS-4の文字集合を表現するために
16bit=1文字とは限らないので扱いにくい。
UCS-2といった場合は必ず16bit=1文字で表現できる。
で、BCBならWin32だろうけど、それならVCと同じじゃないかな。
0714デフォルトの名無しさん
NGNG今までは 16bit/2byte 渡せばすむところを、w_char のポインタを渡さなきゃいけなくなったり。
0715713
NGNG既存とはCの基本ランタイムwfopenみたなヤシですか?
まじー?
0716デフォルトの名無しさん
NGNG0717デフォルトの名無しさん
NGNG0718デフォルトの名無しさん
NGNG受けてくれればいいのに。
0719デフォルトの名無しさん
NGNG0720デフォルトの名無しさん
NGNGまったくお恥ずかしい限りです。
0721デフォルトの名無しさん
NGNGx.str( std::string() );
0722720
NGNGアリガ�d
もう1つ
どうしてx.str( std::string("test") );
はダメなんですか?
0724デフォルトの名無しさん
NGNGダメって、なにが?
0726デフォルトの名無しさん
NGNG何故そういう仕様になってるのかよく分かりませんでした。
int f(int, int = 3, int);
と宣言して、
f(3,,4); //OK
f(,,4); //デフォルト値なしの引数が省略されているのでエラー
となるような仕様では何故駄目なんでしょうか?
0727デフォルトの名無しさん
NGNGデフォルト引数を利用する場合
基本的には引数を省略する場合が多いんで、
途中に余計なコンマを書くよりは、
何も書かないでいいようにした方が効率的で分かりやすい。
デフォルト引数が複数ある場合には
f(3, , 4); というように指定したいと思う事もあるけど、
コンマの個数が増えてくるとソースが読みにくくなるし、
コンマの個数を間違えるとバグになるというのも困るので、
省略できないのも仕方が無いとも思う。
個人的には、名前付き引数があればええんでないかな、と思うのだが、
まぁ、無いものは仕方が無い、と。
0728デフォルトの名無しさん
NGNG0729デフォルトの名無しさん
NGNGclass A {
A(int i) {}
};
class B {
A m_cA[8];
};
としたとき、B::m_cAを初期化するにはどうすればよいでしょうか。
0730デフォルトの名無しさん
NGNGttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.5
0731デフォルトの名無しさん
NGNGDVからIEEEでキャプチャしてリアルタイム処理するプログラム組んでて
ttp://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
を使ってやっているんですが、むちゃくちゃかくかくするんです。
単なる処理速度の問題なのかどうか、、
cはできるんですがwinプログラムは始めてで、フレームレートあがるにはどこいじればいいかわかんない
たのむ!たすけて
0732729
NGNGなるほど、この構成自体がコンパイル通らないのですか。
情報感謝です。
0733デフォルトの名無しさん
NGNG配列の各々のオブジェクトに、違った初期化をする方法で
cinからもってくる方法がストラウストラップに載ってるね(p.300-301)。
まぁここまでするのもね。
0734デフォルトの名無しさん
NGNG多分処理速度。圧縮処理汁!!
0735デフォルトの名無しさん
NGNG構造体は
・アクセス修飾子が無い。
・メソッド、コンストラクタ、デストラクタが定義できない。
以外に何かありますか?
0736デフォルトの名無しさん
NGNG> ・アクセス修飾子が無い。
> ・メソッド、コンストラクタ、デストラクタが定義できない。
そんな差は無い。
0737デフォルトの名無しさん
NGNGアクセス修飾子もあります。
クラスとの違いはデフォルトの
アクセス修飾子がprivateかpublicかの違いのみです。
0739デフォルトの名無しさん
NGNG0740デフォルトの名無しさん
NGNG0741デフォルトの名無しさん
NGNGC++ はほぼ同等の扱いにしてるけど。
0742デフォルトの名無しさん
NGNG0743デフォルトの名無しさん
NGNGそれに共感を覚えたんだけど、どういう決まりだったかすっかり
忘れてしまったな。
0744デフォルトの名無しさん
NGNG変数を一度に沢山定義して、
それを一度に受け渡しするためのものに過ぎない。
一方クラスは具体的にどんなメンバ変数があるかは隠蔽しちゃってて、
使う側からは、どういう種類のデータを扱えて、
どういう機能を持っているかさえ分かっておけばいいようになっている。
つまり、データの抽象化を行ったものがクラスと言える。
メンバ関数を通してデータを扱う場合と言ってもいいかもしれない。
でも、ポリモーフィズムとかも重要な性質だろう。
C の FILE 構造体はクラスみたいな使い方をしてるけど、
これは C にはクラスがなかったからこうしてるだけ。
こういうのは、オブジェクト指向言語ではクラスにすべきだろう。
0745デフォルトの名無しさん
NGNG0746デフォルトの名無しさん
NGNGCの構造体、C++の構造体、C#の構造体みたいに、
狭い範囲でそれぞれ意味が定義されてるもんじゃないの?
オブジェクト指向という括りで通用する構造体の定義ってあるの?
0747デフォルトの名無しさん
NGNGをもつかで区別すりゃいいんでないかね。
0748デフォルトの名無しさん
NGNG#include<math.h>
#include<conio.h>
main(){ float a,x,b,x1;
printf("入力→");
scanf("%f",&x);
for(;;){
a=exp(x)-3*x;
b=exp(x)-3;
x1=x-a/b;
if(fabs(x1-x)<0.0000001)break;
x=x1;
}
どこがおかしい?
0749デフォルトの名無しさん
NGNG0750デフォルトの名無しさん
NGNG0751デフォルトの名無しさん
NGNG0752デフォルトの名無しさん
NGNGmain(){ float a1,a2,X=0,x=0,x1=4,x2,s=0,b,i,s1;
printf("分割数入力\n");scanf("%f",&b);
printf("α0入力→\n");scanf("%f",&a1);
printf("α1入力→\n");scanf("%f",&a2);
for(i=1; i<=b; i++){x=x+(1/b);
x2=(a1*a1)+(x*x)/(1+exp(x));
s1=((x1+x2)*(1/b))/2;x1=x2;s=s1+s;
}for(i=1; i<=b; i++){X=X+(1/b);X2=(a2*a2)+(X*X)/(1+exp(X));
S1=((X1+X2)*(1/b))/2;X1=X2;S=S1+S;
}
ごめん。こっちだった。
0753デフォルトの名無しさん
NGNG0754デフォルトの名無しさん
NGNGとでも言って欲しいのか?
0755デフォルトの名無しさん
NGNGパナウェーブの仕業か!
0756デフォルトの名無しさん
NGNG内容としては、ストラウストラップの10章の部分なんですが、
大域・名前空間オブジェクトの順序依存はさけるべきだという
話があって、で初回スイッチというテクニックが紹介されて
いました。オブジェクトが0かどうかをチェックしていますが、
これは、どういうことなんでしょうか?0だとどうで、0じゃないと
どうなんでしょうか?そもそも順序依存とは、オブジェクトが確保
されたかどうかですか?それとも初期設定されたかどうか?
0757デフォルトの名無しさん
NGNG読まずにレス。静的なポインタ変数をぬるぽと比較してると見た。
0758デフォルトの名無しさん
NGNGあの人の書いた本で、ストラウストラップ本とか言われてるのがあるの?
# お、ググったら1件だけあった>ストラウストラップ本
0759デフォルトの名無しさん
NGNG"Stroustrup本"でググったらもうちょっとでてきたぞ
0760r
NGNGenum hanage_len_t{ LONG, SHORT };
const hanage_len_t length;
Hanage( hanage_len_t l ) : length( l ) {}
};
こんなクラスがあるんです。このクラスのインスタンスを作るには
Hanage hanage(Hanage::LONG);
だとか、
Hanage* pHanage = new Hanage( Hanage::SHORT );
なんて書きますよね。
ここで、この Hanage::LONG の Hanage:: の部分が、
Hanageのインスタンスを生成しまくる場面ではすごくめんどくさいのです。
たとえば、
class HanageGenerator {
using class Hanage; // ←こんなのを書いて
Hanage** Create( int n ) {
Hanage** buf = new Hanage*[n];
for( int i = 0; i < n; i++ )
buf[i] = new Hanage( i % 2 ? LONG : SHORT ); // ←これ!Hanage::の省略!
return buf;
}
};
こんな風に書けたら素敵だなぁ、って思うのです。
で、これ-----Hanage::の省略----の実現方法を知ってる人がいたら
教えてくださいませ。
0761デフォルトの名無しさん
NGNG0762デフォルトの名無しさん
NGNGnamespace hanage { } で囲み、
enum hanage_len_t はクラスの外でこのnamespace内に移動すれば
using namespace hanageでできないこともないが、美しくはないか
0763756
NGNGのことです。すんません、わかりづらかったようで。
で、その10章のラストにアドバイスとして次のようなことが書かれて
います。
・大域、名前空間内オブジェクトを構築するときには、順番への依存を避けよ。
・順番への依存を抑えるためには初回スイッチを使え。
この順番への依存とは何の順番なんでしょうか。まぁたとえば静的メンバ
をもつクラスが大域スコープで定義された時のように、ある大域オブジェクト
が他の大域オブジェクトを参照する時のことなんでしょうが、これは要するに
参照しようとした時に、まだ使えない場合があるということなんですかね。
それとも初期設定がされてるかどうかって話なんでしょうか。
10章で紹介されている初回スイッチ(よく使われる戦略だそうで)ですが、
bool型の静的メンバをもつクラスのメンバ関数で、その静的メンバがfalseか
どうかをチェックしています。falseならtrueをセットして初期設定してる
ようです。この手法はコンストラクタがない静的オブジェクトが0で初期設定
されることを利用しているということだそうですが、falseの時はどいう時で
trueの時はどいう時なんでしょうか?(ってわかりづらくてすんません)
0764デフォルトの名無しさん
NGNG大域オブジェクトの初期化の順番は処理系依存
> 初回スイッチ
シングルトンの実装方法を見れば判ると思う
0765デフォルトの名無しさん
NGNGなんでそんなことも分からないのかが分からない。
初期化してないときがfalseで初期化済みがtrueに決まってるだろ。
bool型の静的メンバの名前が「initialized」だし。
>参照しようとした時に、まだ使えない場合があるということなんですかね。
>それとも初期設定がされてるかどうかって話なんでしょうか。
まだ使えない=初期設定がされてない なので言ってる事がトンチンカン。
0766756
NGNG順番とは初期化のことなんですね。じゃ、とりあえず
初期化されてなくても、参照はできるということは
保証されてるってことですね。うーむ。ということは
大域オブジェクトに何か値をセットするような関り方を
している場合、値をセットした後、0にもどされるって
場合があるってこと?こんがらがってきた・・・。
シングルトンですか・・・なんでしょうかそれは。
0767デフォルトの名無しさん
NGNG逆。
初期化されていないオブジェクトを参照できるから、危険。
シングルトンはデザインパターンの本を見れば書いてあるよ。
0768756
NGNG言ってることは間違ってないですよね?
そうですか。ちょっと本を探してみます。
ありがとうございました。
0769デフォルトの名無しさん
NGNGてっきりコンストラクタ呼び出しのことかと思ってた・・・
それから、初期化時のコンストラクタ呼び出しの順序だけじゃなくて、
mainを抜けた後のデストラクタ呼び出しについても、同様の問題が
起こりうることは覚えておいたほうがいいと思う。
0770デフォルトの名無しさん
NGNGおこらねーだろ。
0771デフォルトの名無しさん
NGNGデストラクタ呼び出し後のオブジェクトを参照する場合。
0772デフォルトの名無しさん
NGNG理解する気失せるわ。やっぱいろいろと不親切な本や。
Effective C++の47項を見るか、あるいはSingletonパターンでいいと思う。
0774デフォルトの名無しさん
NGNGとりあえず、 Hanage::hanage_len_t は Hanage::len_t のようにすべき。
で、
inline Hanage* create( Hanage::len_t len ) { return new Hanage( len ); }
こんなやつを定義すると、ナントカ参照という仕様により
Hanage* p = create( Hanage::LONG );
と書ける。
あからさまに冗長な new Hanage( Hanage::LONG ) よりは読んでて気持ちいい。
でも、実用はお勧めできない。
0775デフォルトの名無しさん
NGNG0クリアはされないかと。
コンストラクタ以前にスタートアップコードのあたりで0クリア済みじゃない?
初期化ってのはコンストラクタが呼ばれること。
0クリア云々のくだりはbool型のinitializedのことで、他のクラスの事じゃない。
false==0ってことは理解してる?
initializedが最初の実行時は必ずfalseだから、それで初期化済みか判定して
いるってこと。
で、例の本にもデストラクタの問題も書いてあって、解決法としてatexit()と
参照カウンタをチョロっと紹介してる。
>>772
あの本はテクニックを解説する本じゃなくて、C++の言語仕様を説明する本だから
Singletonなんてあの程度の解説で十分かと。
逆に言語仕様と関係ない部分ばかり説明されても困る。
ただでさえ分厚い本なんだし。
756が何でこの本を読んでいるのかはちょっと疑問。
これは入門書じゃないぞ。
0776デフォルトの名無しさん
NGNG0777デフォルトの名無しさん
NGNGVC++のデバッガでは出来てるっぽくみえたんだけど
#include <stdio.h>
#include <string.h>
class CLS_A{
char m_a[16];
public:
CLS_A(){strcpy( m_a, "Test");};
~CLS_A(){};
};
void main(){
CLS_A *A = new CLS_A;
FILE *fp;
fp = fopen("TEST.bin", "w");
fprintf( fp, (const char *)A);
fclose(fp);
delete A;
CLS_A *C = new CLS_A;
fp = fopen("TEST.bin", "r");
fscanf( fp, (const char *)A);
fclose(fp);
delete C;
}
0778デフォルトの名無しさん
NGNGC言語の勉強用に買ったんですが、どうやってもコンパイルできません。
VC++を.netで初めて使ったのでかなり試行錯誤してる段階です。
それと.net用の解説書を買いにいったのですが近所のパソコンショップ
数件まわったのですが6.0用のしかありませんでした。
6.0の解説書でも参考になるんでしょうか?
初歩的な質問ですいません。
0779デフォルトの名無しさん
NGNGfscanf( fp, (const char *)A);
( ´_ゝ`)フーン…
0780r
NGNGVC++は知らないけど、
C++なら、Cの殆どのコードはコンパイルできるはず。
というか、「どうやってもコンパイルできません」って書いているけど、
具体的にどうやったんだ?それをまず書け。
0781デフォルトの名無しさん
NGNG#include <stdio.h>
void main()
{
printf( "〜〜〜〜" );
}
コンソールモード、デバックで開始
するとこれらのプロジェクトは古い形式で構成されてます
と警告気味のコメントがでます。
「はい」をえらぶと6個のエラーがでます
エラーC2018 文字 0x40は認識できませんが3つ
エラーC2018 文字 0x81は認識できませんが3つ
です。
0783デフォルトの名無しさん
NGNGん?それコンパイルできるはずだけど・・・。コンソールモードって
プロジェクト立ち上げるときに選ぶやつを言ってるのかな?
まずメニューより[ファイル]→[新規作成]→[プロジェクト]と
進む。[テンプレート]の欄でWin32プロジェクトを選び、
適当なプロジェクト名を入力してOKを押す(保存先変えるなら変える)。
んで[概要]と[アプリケーションの設定]というのがでてくるんで、
[アプリケーションの設定]タブをクリックしてコンソールアプリケーションを
選択して、空のプロジェクトにチェックを付けて完了。
この手順でやってるの?
0784783
NGNGprintf( "〜〜〜〜" );
って〜〜〜〜の部分をそのまま使ってるんかい(w。
最初はHellow World!って決まってるのに・・・・。
全角じゃなくて半角英数字でも入れてみたら。
■ このスレッドは過去ログ倉庫に格納されています