C++相談室 part36

このエントリーをはてなブックマークに追加
1v(^・^)v
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
2v(^・^)v:04/09/28 02:03:12
3v(^・^)v:04/09/28 02:04:05
4デフォルトの名無しさん:04/09/28 02:04:30
4様
5v(^・^)v:04/09/28 02:04:31
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)
6v(^・^)v:04/09/28 02:06:18
7v(^・^)v:04/09/28 02:06:57
8v(^・^)v:04/09/28 02:34:12
9v(^・^)v:04/09/28 02:34:34
■関連スレ■
【C++】template 統合スレ -- Part5
http://pc5.2ch.net/test/read.cgi/tech/1091522597/
ぼるじょあがC/C++の宿題を片づけますYO! 31代目
http://pc5.2ch.net/test/read.cgi/tech/1095075678/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc5.2ch.net/test/read.cgi/tech/1095442366/
10v(^・^)v:04/09/28 02:35:44
■コンパイラスレ■
フリーコンパイラー使えよ。
http://pc5.2ch.net/test/read.cgi/tech/1061384369/
GCCについて part4
http://pc5.2ch.net/test/read.cgi/tech/1090062751/
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/
OpenWatcom C++
http://pc5.2ch.net/test/read.cgi/tech/1033433728/
"Code of the Nerds" Digital Mars C/C++
http://pc5.2ch.net/test/read.cgi/tech/1044210976/
11デフォルトの名無しさん:04/09/28 02:44:49
C++プログラミング入門(オライリー)の書評探してるんですが全然見つかりません。
薄くてよさげなんですがどうなんでしょう?
12v(^・^)v:04/09/28 02:45:42
■開発環境スレ■
★初心者にVisual C++を教えるスレ★ Part14
http://pc5.2ch.net/test/read.cgi/tech/1093672937/
■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/
C++Builder相談室 Part11
http://pc5.2ch.net/test/read.cgi/tech/1094749339/
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/
13v(^・^)v:04/09/28 02:46:14
テンプレ差分
・[JTC1/SC22/WG21 - C++]のURLを移転に対応して変更
・Books に「Exceptional C++ Style」を追加
・Books に「C++ Template Metaprogramming」を追加
・Books が行多すぎになったので、Templateまわりを分けた
・shinichiro.h さんの boost info 移転のお知らせに従いURL変更
・k.inaba さんの Let's boost のほうが情報が新しいので順番を変更
・宿題スレ追尾
・ATL/WTLスレ追尾(統合)
・COMスレ削除
・フリーコンパイラスレ追尾
・GCCスレ追尾
・Borland C++スレ追尾
・Visual C++スレ追尾
・C++Builderスレ追尾
14v(^・^)v:04/09/28 02:46:51
テンプレ終了です。
15v(^・^)v:04/09/28 02:46:58
STLつかうと一気に実行ファイルサイズが10倍に?!
16v(^・^)v:04/09/28 02:47:24
>>11
貴様、>>6が目に入らぬのですか?
17v(^・^)v:04/09/28 02:49:14
>>15
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
18v(^・^)v:04/09/28 02:49:36
>>17
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
19v(^・^)v:04/09/28 02:50:02
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
20v(^・^)v:04/09/28 02:50:25
>>19
#include <stdafx.h>

後死ね。
21デフォルトの名無しさん:04/09/28 03:22:41
>>20
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
22デフォルトの名無しさん:04/09/28 04:00:26
>>1
乙。
2311:04/09/28 04:09:58
>>16
amazonは当然みたけど、それ以外じゃまったくない。
この本は人気がないんですか?
Cでは言語プログラミングくらいのことができるんだが、
OOPはrubyで本みながら、簡単なスクリプトがかける程度。
そんな漏れにこの本は最適なのかが知りたいのです。
24デフォルトの名無しさん:04/09/28 05:04:52
Unicodeの「:」をwcoutで表示することができないのですが、
なぜなのでしょうか? (VC71,WinXP)

(1)ShiftJis(cp932)で以下のソースを保存してコンパイルすると
->前者を実行すると何も表示されず、さらに後者も表示されません。
->でも、後者のみの時は表示が可能でした。
(2)Unicode(cp65001,シグニチャなし)だと
->「error C2001: 定数が 2 行目に続いています。」、
->「error C2143: 構文エラー : ';' が '}' の前にありません。」
-> とでてコンパイルできない

#include<iostream>
int main()
{
std::wcout << L":" << std::endl;// 何も表示されないで止まる?
std::wcout << ":" << std::endl; //: 何故か単独なら表示される
}
25デフォルトの名無しさん:04/09/28 05:30:23
行列計算用のライブラリで計算速度が速く使いやすいおすすめのものがあれば
紹介していただけないでしょうか?
2624:04/09/28 09:07:01
std::wcout.imbue(std::locale("japanese"));
を加えたらうまくいきました。
(結果)

F
2724:04/09/28 12:48:57
":"をUnicodeに変換したものとL":"が
一致しないのが原因みたいでした。
なぜこんなことに....

size_t s_len = mbstowcs(NULL,":",0); //2
size_t w_len = wcslen(L":"); //1
2827:04/09/28 13:09:46
cのロケール設定し忘れてた...orz
setlocale(LC_ALL,"Japanese");//これがあれば一致した
原因はロケールの設定してなかったからですね。(お騒がせしました,,

29デフォルトの名無しさん:04/09/28 13:35:49
>>25
Blitz++
boost::ublas
lapack
30デフォルトの名無しさん:04/09/28 14:08:12
>>28
ここのスレには関係ない話なのであまり伸ばしたくないのですが
vc7.1ってlocaleをいちいち設定しなくても勝手にやってくれるのではなかったっけ。あれ?
すくなくても、俺はlocaleなんて設定しなくてもうまく表示してくれる。
もしかして、versionの違いかも。
31デフォルトの名無しさん:04/09/28 15:54:07
STL周りは明らかにオブジェクト指向というより
関数型プログラミングの臭いがする。
そのへんのカオスつーかハイブリッド具合がC++っぽいんだろうけど。
32デフォルトの名無しさん:04/09/28 16:00:11
なにこのコピペ━━━(゚∀゚)━━━ !!!
33デフォルトの名無しさん:04/09/28 16:03:07
カオス?
意味わかってんのかな?
多分覚えたの単語を使ってみただけだろうけど・・・
34デフォルトの名無しさん:04/09/28 16:12:19
ちなみにケイオスと発音しないと恥ずかしいよ
35デフォルトの名無しさん:04/09/28 16:13:34
>>33
「勝利の方程式」みたいなもんでしょ。
36デフォルトの名無しさん:04/09/28 19:01:41
指定のディレクトリ以下のファイルを読み込む方法てありますか?
37デフォルトの名無しさん:04/09/28 19:17:07
>>36
C++標準機能にはないので、各環境のスレで聞いてください。
38デフォルトの名無しさん:04/09/28 19:54:01
>>36
boostで書いてみた.
#include <iostream>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
using namespace std;
void show (const boost::filesystem::path &p) {
boost::filesystem::directory_iterator end;
for (boost::filesystem::directory_iterator itr (p); itr != end; ++ itr) {
if (boost::filesystem::is_directory (*itr))
show (*itr);
else {
string filepath (boost::filesystem::complete (*itr).string ());
cout << "#############" << filepath << "#############" << endl;
ifstream ifs (filepath.c_str ()); if (!ifs) exit (1);
string buf;
while (getline (ifs, buf))
cout << buf << endl;
}
}
}
int main () {
show (boost::filesystem::path ("hoge"));
return 0;
}
初めて使ったので慣れてる人からみたら変なとこがあるかもしれないけど,こんな感じで書けますよ.
39デフォルトの名無しさん:04/09/29 00:23:25
UTF-16とかってさワイド文字って言うんでしょ?
で、Shit-Jisはマルチバイト文字って言うんでしょ?


じゃ、Asciiって、ワイド文字なの?マルチバイト文字なの?

40デフォルトの名無しさん:04/09/29 00:50:54
一応独習C終わったんですが、このままCを深く掘り下げていくのと、
今の早い段階でC++に移行するのだとどっちがいいんでしょうか?
個人的にはオブジェクト指向のC++を使ってみたいような気はするんですが、
Cも理解しきらないうちにC++が理解できるのか不安なんです。
41デフォルトの名無しさん:04/09/29 00:54:35
>>40
早めにC++に移れ。Cにしがみついていると嫌な癖がどんどん身に付いて、
後から引きはがすのに苦労するぞ。
42デフォルトの名無しさん:04/09/29 01:00:19
Cは文法的な理解だけで十分。
ただし、アルゴリズム的な感覚が身についていない場合はもう少し
Cで勉強してからの方が良い。
他言語を既に習得している場合はそのままC++の習得に移っても良い。
43デフォルトの名無しさん:04/09/29 01:10:01
>>40
一年や二年ぐらいで付いた癖なんて直すのは簡単なような気がするけど。俺にはわからない。
でも、早いうちにC++に移行したほうがいいのは確かだな。
もれなく、STLやBOOSTが付いてくるから楽しさ満点。
さらに、WIN32プログラムを組もうと考えたらMFCやWTLをやるにはC++の知識(たいした知識じゃないけど)が必要。
44デフォルトの名無しさん:04/09/29 01:11:48
>>28
ロケールを設定したら問題が解決するとも限らないんだろうな。
文字列リテラル→"execution character set" への変換方法は実装依存。
45デフォルトの名無しさん:04/09/29 01:12:00
>>42
同意。
プログラムの良い習慣は何言語であろうが変わりはない。
それは C++ とて例外ではないが、必要以上に難しくひねくれたところがあるから、
何と言うか本来なら立ち直れるはずの色々なショックがいちいち問題になりやすい。
46デフォルトの名無しさん:04/09/29 01:38:59
プログラミング講義C++
という本に演習とありますが答えが載ってないのでやり方が分かりません。
なのでここに演習の文を書くんでその答えを書いてくださらないでしょうか?

>>2つのオブジェクトa,bが、
>>(1)いずれもint型である場合
>>(2)いずれもdouble型である場合
>>(3)一方がint型で他方がdouble型である場合
>>の3つの場合に対して、sizeof(a+b)を表示するプログラムを作成し、その実行結果を考察せよ。

47デフォルトの名無しさん:04/09/29 01:46:12
おことわりです。
48デフォルトの名無しさん:04/09/29 05:19:44
>>46
宿題スレにでも行け
49デフォルトの名無しさん:04/09/29 06:19:33
これからCプログラミングやる初心者ですが
もう、お店ではC++って売ってないみたいんなんですけど
どうすれば入手できますか?
また、どのメーカーのC++がいいですか?
よろしくおねがいします
50デフォルトの名無しさん:04/09/29 06:23:27
class hoge2ch
{
 private:
  int a,b;
 public:
  hoge2ch(int x,int y):a(x),b(y)
 {

 }
・・・・・
};

という表記を、「オブジェクト指向計算力学入門」という本で見つけました
コンストラクタの引数の後ろに、継承でもないのにコロンが付いて
コンストラクタ内の引数が非公開メンバに代入される事を意味するようですが、
こんな表記法を他の書籍で見かけることは出来ませんでした。

この表記法を使っていて、分かりやすく解説している書籍を紹介して下さい
51デフォルトの名無しさん:04/09/29 06:47:31
とりあえず、イニシャライザでぐぐっとけ。
それと、この書き方を書いてない本は窓から投げ捨てておくこと。
52デフォルトの名無しさん:04/09/29 07:12:31
他の書籍のタイトルをさらしておけ
53デフォルトの名無しさん:04/09/29 07:41:55
>>50
いつかは絶対必要になるから買っておくべし
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ref=pd_sr_ec_ir_b/249-7749404-9276354
5450:04/09/29 08:09:03
>>51-53
教示ありがとうございます
http://plaza.harmonix.ne.jp/~fakira/turedure/cprog_00.htm
代入の仕方で参考になるものをちょっと見つけました
55デフォルトの名無しさん:04/09/29 08:30:04
>>50(>>54)
代入じゃねぇ。初期化だ。混同すべからず。
5628:04/09/29 11:41:06
>>30
ver7.1.3091ですが、やはりないとだめみたい。
C++的には codecvtですかね?
ttp://www.tietew.jp/cppll/archive/568
に例が載ってました。

>>44
そういえばXML以外でエンコーディング指定って見たことない...。
57デフォルトの名無しさん:04/09/29 15:17:30
派生クラスでは、どうあがいても関数呼び出しが
仮想関数テーブル経由になってしまうのは避けられないのでしょうか?
高速化の必要から悩んでいます。
58デフォルトの名無しさん:04/09/29 15:24:07
>>57
テーブル経由になるのはvirtual指定したメンバ関数だけだよ。
派生クラスは関係ない。
5957:04/09/29 15:37:53
>>58
おおお!ありがとうございます。
基底でvirtualが指定してある関数の場合は、派生側同名の関数で
例えvirtual指定が無く、かつ派生型ポインタで呼び出しても駄目ですよね?

その場合は同じ振る舞いのメソッドを、派生側で別に用意すればいいのか…。
いや本当に助かりました。
60デフォルトの名無しさん:04/09/29 16:32:48
>>59
基底クラスのメンバー関数がprivateで無い限り派生型でそのメンバー関数を呼べるよ
61デフォルトの名無しさん:04/09/29 16:35:12
つか仮想関数でもコンパイル時に型が確定してりゃvtblなんか経由しないコンパイラもある。
62デフォルトの名無しさん:04/09/29 16:38:23
もしくは基底クラスの関数で派生のメンバー関数を使いたいなら
template<class T>
struct base{ void fun(){ static_cast<T&>(*this).fun(); } };

struct My : public base<My>
{ void fun(){} };
でokのはず。
63デフォルトの名無しさん:04/09/29 16:39:34
>>61
そうなのか。でもVC7.1は違うだろうな。
64デフォルトの名無しさん:04/09/29 18:27:04
VC7.1でも出来るんじゃないの?
コンパイルタイムで明らかなのであれば
例えばこんなん

class po
{
public:
    virtual void f() = 0;
};

class null : public po{ (ry };

void hoge()
{
    null n;
    n.f();
}
65デフォルトの名無しさん:04/09/29 18:38:31
しばしば、「仮想メンバー関数の呼び出しは遅い」
というトピックが提供されるみたいだけど、実際どのくらい遅くなるのでしょうか。
目に見えてパフォーマンスが変わるものなのでしょうか。

実測した人とか居ます?
66デフォルトの名無しさん:04/09/29 19:04:16
仮想関数でもinline展開してくれるコンパイラならいいんでは
67デフォルトの名無しさん:04/09/29 19:19:59
//main.cpp
#include <stdio.h>
#include <time.h>
#include <typeinfo.h>
struct Virt { virtual int get(); };
struct VirtSub : public Virt { int get();};
struct NonVirt {int get();};
struct NonVirtSub : public NonVirt {int get();};
Virt *virt();
VirtSub *virtsub() ;
NonVirt *nonvirt() ;
NonVirtSub *nonvirtsub() ;
template<class T> void m(T *t) {
clock_t c = clock();
for (int i=0; i<100000000; ++i) t->get();
c = clock() - c;
printf("%s:%u\n", typeid(t).name(), (unsigned)c);
}
int main() {
m(virt());
m((Virt*)virtsub());
m(virtsub());
m(nonvirt());
m((NonVirt*)nonvirtsub());
m(nonvirtsub());
return 0;
}
68デフォルトの名無しさん:04/09/29 19:20:40
struct Virt { virtual int get(); };
//impl.cpp
struct VirtSub : public Virt { int get();};
struct NonVirt {int get();};
struct NonVirtSub : public NonVirt {int get();};
int Virt::get() { return 0; }
int VirtSub::get() { return 0; }
int NonVirt::get() { return 0; }
int NonVirtSub::get() { return 0; }
Virt virt_;
VirtSub virtsub_;
NonVirt nonvirt_;
NonVirtSub nonvirtsub_;
Virt *virt() { return &virt_; }
VirtSub *virtsub() { return &virtsub_; }
NonVirt *nonvirt() { return &nonvirt_; }
NonVirtSub *nonvirtsub() { return &nonvirtsub_; }
69デフォルトの名無しさん:04/09/29 19:24:44
$cl main.cpp impl.cpp
$./main
struct Virt *:981
struct Virt *:981
struct VirtSub *:1092
struct NonVirt *:751
struct NonVirt *:741
struct NonVirtSub *:731

vs.net2003
winxp sp2
pentium M 1400MHz(1.15GHz?)
70デフォルトの名無しさん:04/09/29 19:34:08
仮想関数でパフォーマンス低下に大きく影響を与えるのは
vtable 経由になることではなくインライン展開できないことだと思う。
71デフォルトの名無しさん:04/09/29 19:39:33
//おまけ ポインタ経由しないとき

template<class T> void n() {
T t;
clock_t c = clock();
for (int i=0; i<100000000; ++i) t.get();
c = clock() - c;
printf("%s:%u\n", typeid(t).name(), (unsigned)c);
}

n<Virt>();
n<VirtSub>();
n<NonVirt>();
n<NonVirtSub>();

---------
struct Virt:741
struct VirtSub:741
struct NonVirt:741
struct NonVirtSub:741

72デフォルトの名無しさん:04/09/29 19:41:09
まあ、他のコストがテーブルの初期化と正しい関数のオフセットへのアクセスだけだからねえ
73デフォルトの名無しさん:04/09/29 19:50:28
get()が十分重い関数のときには律速段階にならない罠
7467:04/09/29 19:53:25
一言でいえばほとんどまったく影響ない
75デフォルトの名無しさん:04/09/29 19:53:42
>>67
get()が軽い場合と重い場合で
VirtSub / Virt
NonVirtSub / NonVirt
を算出してみてよ
7675:04/09/29 19:59:17
>>74
ないってしゅちょうなのね
77デフォルトの名無しさん:04/09/29 20:05:29
古い資料だけどここが詳しい?
ttp://gigo.retrogames.com/t_lab/chapter2.html
78デフォルトの名無しさん:04/09/29 20:11:32
要するに仮想関数であることを問題にするのは、
他の最適化をやりつくした後でいいってこと?
79デフォルトの名無しさん:04/09/29 20:14:23
まずは設計ね
80デフォルトの名無しさん:04/09/29 20:22:05
>>75
めどい
81デフォルトの名無しさん:04/09/29 20:31:58
教えてください。

VC6.0でダイアログベース+MFC+winsock2で、サーバを作ってます。

で質問なんですが、あるクラスのメンバ関数ってスレッド化する事ができるでしょうか?
つまり、クラス内のメンバ関数ってプログラム内でクラス定義されて初めて
関数のメモリが割り当てられるような気がするんですが、
例えば、
_beginthreadex(0 NULL, Func ・・・
このFuncがメンバ関数の時、そのアドレスがわからないような気がするのですが。

親切な人お願いします。
82デフォルトの名無しさん:04/09/29 20:33:03
VC6とVC7で違ってくるのかな?

VC6だと仮想と非仮想に全く違いがなかった。
VC7だと非仮想関数と、ポインタじゃない呼び出しの仮想が同じくらい速くなった。
>>66の指摘している通り、VC7で明示的にインスタンスを作った場合は、テーブルを使わないみたい。

//----ケースA
CHoge* p = new CHoge;
p->VirtualFunc();
//----ケースB
CHoge obj;
obj.VirtualFunc();

このA,Bの2種類では、Bはテーブルを使わないようです。(VC7の場合)
83デフォルトの名無しさん:04/09/29 20:38:26
>>81
class c;
namespace{
C* p;
};
class c{
public:
C(){ p = this; }
int f(){ return 0; }
};
int f_stub(){
return p->f();
}

_beginthread( 0, NULL, f_stub, ・・・
84デフォルトの名無しさん:04/09/29 20:43:16
ということは VC6の最適化機能は不完全?スタンダード版?
85デフォルトの名無しさん:04/09/29 20:46:58
VC++とC++って別物なの?
86デフォルトの名無しさん:04/09/29 20:49:12
最適化に完全も不完全もねえだろ
ある意味、ボランティアみたいなものじゃん
87デフォルトの名無しさん:04/09/29 20:55:06
>>85
C++は言語名でしょ。
VC++はC++ソースのコンパイル環境。
MicroSoft C/C++コンパイラという意味。
他にはBC++やg++などもある。
88デフォルトの名無しさん:04/09/29 20:55:58
>>85
C++ :プログラミング言語
VC++:MicrosoftのC++コンパイラと周辺ツール類の製品名(の略称)
89デフォルトの名無しさん:04/09/29 20:59:02
>>86は貧乏でGCCを使おうとしたが難しくて使えなくてBCCで我慢してる
90デフォルトの名無しさん:04/09/29 21:00:23
>>82
6も7もおなじだったよ?
91デフォルトの名無しさん:04/09/29 21:00:36
誰か、VC6で試してくれないか?
>>82の意外な書き込みが気になる。
92デフォルトの名無しさん:04/09/29 21:08:51
あんがと。しかしわかったようなわからんような。
どうやらBACICから始めたほうがよさそうだな。
ポケコンかお
93デフォルトの名無しさん:04/09/29 21:14:39
>>92
それはどうかと...
ところでポケコンって今日びまだ売ってんの? いくらくらい?
94デフォルトの名無しさん:04/09/29 21:19:05
>>93
結構進化してるよ。
2〜3万くらいじゃない?
95デフォルトの名無しさん:04/09/29 21:24:01
PDA使ったらポケコンって用済みじゃない?
手軽にプログラミングするならPCがあるし、PDAでもシリアル出力できるし。
96デフォルトの名無しさん:04/09/29 21:28:31
>>81,83

>そのアドレスがわからない
this使う
GUI部にマルチスレッドは危険極まりないと思うよ

メモリ割り当てたいなら
class C{ public: C(){}; unsigned f(void* arg); static unsigned stub(void* p){ return C().f(arg); }};
_beginthread(C::stub,0,arg);
97デフォルトの名無しさん:04/09/29 21:29:55
3万あれば自作して(中古じゃないと無理かな?)PC-UNIXがいいような気がする。
98デフォルトの名無しさん:04/09/29 21:35:39
>>82 そういう違いは確認できなかった
#include <stdio.h>
#include <time.h>
struct C {virtual int v() { return 0 ;}
int nv() { return 0; }};
int main() {int i;clock_t t;C c, *pc = new C;
printf("ver%d\n", _MSC_VER);
t = clock();
for (i=0; i<100000000; ++i) c.nv();
printf("nonptr-nv:%u\n", clock() - t);
t = clock();
for (i=0; i<100000000; ++i) c.v();
printf("nonptr-v:%u\n", clock() - t);
t = clock();
for (i=0; i<100000000; ++i) pc->nv();
printf("ptr-nv:%u\n", clock() - t);
t = clock();
for (i=0; i<100000000; ++i) pc->v();
printf("ptr-v:%u\n", clock() - t);
return 0;}
-----
[vc6]ver1200
nonptr-nv:771
nonptr-v:771
ptr-nv:781
ptr-v:1242

[vc7]ver1310
nonptr-nv:731
nonptr-v:741
ptr-nv:741
ptr-v:971
99デフォルトの名無しさん:04/09/29 21:38:29
デバッガで混合表示したほうが早いと思うが
100デフォルトの名無しさん:04/09/29 21:39:59
>>99
medoi
101デフォルトの名無しさん:04/09/29 21:43:05
何はともあれVC7が圧勝
102デフォルトの名無しさん:04/09/29 21:51:57
>>98
ちょっと>>98のサンプルソースを変更してみた。
違う結果が出ると思うので確認してみてホスイ。
-------------------------------------------
#include <stdio.h>
#include <time.h>
volatile int g_number=0;
struct CBASE {virtual int v()=0; int nv() { g_number++;return 0; }};
struct CDERIVED : public CBASE {virtual int v() { g_number++;return 0 ;}};
int main() {int i;clock_t t;CDERIVED c, *pc = new CDERIVED;
const int rep_cnt=200000000;
printf("ver%d\n", _MSC_VER);
t = clock();
for (i=0; i<rep_cnt; ++i) c.nv();
printf("nonptr-nv:%u\n", clock() - t);
t = clock();
for (i=0; i<rep_cnt; ++i) c.v();
printf("nonptr-v:%u\n", clock() - t);
t = clock();
for (i=0; i<rep_cnt; ++i) pc->nv();
printf("ptr-nv:%u\n", clock() - t);
t = clock();
for (i=0; i<rep_cnt; ++i) pc->v();
printf("ptr-v:%u\n", clock() - t);
return 0;}
-------------------------------------------
103102:04/09/29 21:53:04
自分の環境での>>102の結果Pen4 3GHz

ver1200
nonptr-nv:984
nonptr-v:875
ptr-nv:937
ptr-v:938

ver1310
nonptr-nv:546
nonptr-v:532
ptr-nv:547
ptr-v:937
104デフォルトの名無しさん:04/09/29 22:01:30
pen M 1400MHz?
かわらねぇ…

ver1200
nonptr-nv:1662
nonptr-v:1622
ptr-nv:1623
ptr-v:2143

ver1310
nonptr-nv:1682
nonptr-v:1742
ptr-nv:1643
ptr-v:2053
10540:04/09/29 22:52:25
>>41->>43
亀レスでスマソですが、レスどうもです。
まだまだ経験が浅い自分だけではふんぎりが付かなかったので、
非常に参考になりました。では、C++やってみますー。
10636:04/09/29 23:37:38
>>37
標準でないんですか (´・ω・`)

>>38
ソースまでわざわざありがとうございます。
107デフォルトの名無しさん:04/09/30 00:23:56
>>102
AthlonXP3000+
Borland-C++ 5.6.4
nonptr-nv:812
nonptr-v:735
ptr-nv:828
ptr-v:953

ver1310
nonptr-nv:547
nonptr-v:391
ptr-nv:562
ptr-v:734

何かAthlonXP速い。Athlon64で誰かやってみて〜
108デフォルトの名無しさん:04/09/30 01:02:26
>106
そもそもディレクトリがない環境っていうのもあるんで。
109デフォルトの名無しさん:04/09/30 01:51:09
>>102
これってfor文のコストに関数呼び出しのコストが埋もれてしまっていませんか?
以下,すごく環境依存なコードで申し訳ないですが
VC++&インテルペンティアム互換プロセッサな環境での測定コードを載せておきます.
rdtscはプロセスタイムではなくてプロセッサタイムを計測しているので注意してください.

#include <stdio.h>
#include <time.h>
volatile int g_number=0;
inline __int64 rdtsc(){
__asm{
rdtsc;
}
}
struct CBASE {virtual int v()=0; int nv(){ ++g_number;return 0; }};
struct CDERIVED : public CBASE {virtual int v(){ ++g_number;return 0; }};
int main() {
__int64 t, t2;
CDERIVED c, *pc = new CDERIVED;
printf("ver%d\n", _MSC_VER);
t = rdtsc(); c.nv(); t2 = rdtsc();
printf("nonptr-nv:%u\n", t2 - t);
t = rdtsc(); c.v(); t2 = rdtsc();
printf("nonptr-v:%u\n", t2 - t);
t = rdtsc(); pc->nv(); t2 = rdtsc();
printf("ptr-nv:%u\n", t2 - t);
t = rdtsc(); pc->v(); t2 = rdtsc();
printf("ptr-v:%u\n", clock() - t);
return 0;
}

結果はご自分の目でお確かめください.
110109:04/09/30 02:12:28
109に関して補足するまでもないとは思いますが,
このような仮想関数呼び出しのコストが致命的になるのは
コード全体の中でその仮想関数呼び出しがホットスポットになっていて,
なおかつ仮想関数内部の処理が十分軽いときに限られます.
いずれにせよ効率の話なので,この手のことを気にするのは2の次にするべきでしょう.

後,効率の話をするなら99さんの言うように結局はアセンブリを見ないといけないんでしょうね.
111109:04/09/30 02:15:13
す,すいません.109の最後のprintfですけれどtypoです.
>printf("ptr-v:%u\n", clock() - t);
printf("ptr-v:%u\n", t2 - t);

恥ずかしいったらありゃしない.
112デフォルトの名無しさん:04/09/30 02:42:19
サーバーでデータ処理でもするんじゃなきゃ、呼び出しコストなんぞ考える必要もない時代だよなぁ。
組み込みで8ビットCPUでC++使ってるなら考えないといかんけど。
113デフォルトの名無しさん:04/09/30 05:55:03
std::vector<int> a;
std::vector<int>::iterator i;
i = a.begin;
と括弧を書き忘れたのにコンパイルが完了してしまいました
std::vector<int>::iterator i = a.begin;
はエラーとなり、コピーコンストラクタと演算子の違いということは分かるのですが
なぜ代入できるのでしょうか?
114デフォルトの名無しさん:04/09/30 06:17:20
コンパイラのバグ。
115113:04/09/30 07:49:49
>>114
そうだったのですか。コンパイラを書き忘れていましたがVCのver6でした。
for(のループ変数がスコープをはみ出すので>>113のように書いたところ間違えてしまいました。
完全にはめられていますね。
116デフォルトの名無しさん:04/09/30 07:56:03
いい加減VC6は捨てろ
117デフォルトの名無しさん:04/09/30 07:58:01
118デフォルトの名無しさん:04/09/30 09:51:48
119デフォルトの名無しさん:04/09/30 11:47:22
プログラムの本質的な意味を理論的に説明してくれる人いませんか?
120デフォルトの名無しさん:04/09/30 12:35:02
プログラムの本質的な意味?どういうこと?
121デフォルトの名無しさん:04/09/30 12:46:46
>>119
少なくともどういう経緯でその質問が出てきたのか書いてくれんと答えられん。
122デフォルトの名無しさん:04/09/30 13:29:48
>>119
ある作業を自分以外へ通知・委託するための行為。
123デフォルトの名無しさん:04/09/30 17:09:35
template <typename T>
class c
{
    template <typename U> struct s{ typedef U u; };
public:
    typedef s<T>::u u;
};

を VC7.1 でコンパイルしたところ

error C2146: 構文エラー : ';' が、識別子 'u' の前に必要です。
error C2501: 'c<T>::u' : 識別名を宣言するのに、型が指定されていません。
warning C4346: 'c<T>::s<T>::u' : 依存名は型ではありません。

とエラーが出るのですが、何故でしょうか…
124デフォルトの名無しさん:04/09/30 17:12:48
>>123
- typedef s<T>::u u;
+ typedef typename s<T>::u u;
125デフォルトの名無しさん:04/09/30 17:14:49
>>124
即レス感謝です
Tに依存することを失念してました、、失礼しました…
126デフォルトの名無しさん:04/09/30 17:27:04
とあるクラス Bitmap が、もしかするとデストラクタで例外を投げるかも知れないとき、
auto_ptr< Bitmap > hoge の値をできるだけ安全に変更するためには
 auto_ptr< Bitmap > hoge( new Bitmap("hehe") );
 hoge.reset( new Bitmap("haha") );
ではなく、
 auto_ptr< Bitmap > hoge( new Bitmap("hehe") );
 hoge = :auto_ptr< Bitmap > ( new Bitmap( "haha" ) );
とする必要があるんでしょうか?(前者だとどこにもbindされない Bitmap("haha") がリークする?)
127デフォルトの名無しさん:04/09/30 17:29:01
デストラクタが例外を投げるという設計が120%間違ってる
128デフォルトの名無しさん:04/09/30 18:27:04
>>127
漏れが設計したクラスではないので・・・
とりあえず release してから reset することにしました。
129デフォルトの名無しさん:04/09/30 18:30:34
>>128
俺ならその例外を握りつぶすラッパクラスを作る。
130デフォルトの名無しさん:04/09/30 18:57:16
デストラクタが例外を投げてはいけないことはまともな本を
読んだことがあれば必ず書いてあるはずなんだがなぁ…
いまだにそんな設計をする人間がいるのか(_ _;
131デフォルトの名無しさん:04/09/30 19:39:14
>>130
その辺は完全に漏れの質問が変でした。
実際には「例外を投げるかもしれないとき」ではなくって、
「OSがサポートしている例外機構がC++例外と類似の例外として投げてくる可能性があるとき」
ということでした(Windows の SEH)。
132大学生:04/10/01 01:47:48
「Accelerated C++」でC++の勉強を始めた大学生です。
第11章のプログラムをテストしようとしたところ、
コンパイルはできたのですが、MAKEができません。
エラーメッセージの原因がわからないので誰か助けてください。

エラーメッセージ:
Error: 外部シンボル 'Vec<couple>::create()' が未解決
(D:\CPP\CHAPTER11\DEBUG\KADAI11_0.OBJ が参照)
133大学生:04/10/01 01:51:12
「Accelerated C++」でC++の勉強を始めた大学生です。
第11章のプログラムをテストしようとしたところ、
コンパイルはできたのですが、MAKEができません。
エラーメッセージの原因がわからないので誰か助けてください。

エラーメッセージ:
Error: 外部シンボル 'Vec<couple>::create()' が未解決
(D:\CPP\CHAPTER11\DEBUG\KADAI11_0.OBJ が参照)
134デフォルトの名無しさん:04/10/01 01:52:27
>>133
で、その本の11章のプログラムはどんな物ですか。
説明不足ですよ。
135大学生:04/10/01 01:53:25
すいません二重投稿してしまいました。。。
以下、ソースコードです。

/* Vec.h */
#ifndef GUARD_Vec_h
#define GUARD_Vec_h
template <class T> class Vec {
public:
Vec() { create(); }
(略)
private:
void create();
(略)
};
#endif



/* Vec.cpp */
#include "Vec.h"
template <class T> void Vec<T>::create()
{
(略)
}
(略)
136大学生:04/10/01 01:54:39
/* kadai11_0.cpp */
#include "Vec.h"
#include <iostream>
using std::cout;
using std::endl;
struct couple {
int a;
int b;
};
int main()
{
Vec<couple> sVec;
couple s1 = {1, 2};
sVec.push_back(s1);

for (Vec<couple>::size_type i = 0; i != sVec.size(); i++) {
cout << sVec[i].a << endl;
}

return 0;
}
137デフォルトの名無しさん:04/10/01 02:00:10
手元にある本がCの本で(まだ読んでない
手元にあるソフトがVC++とVB6.0なんだけど
Cの本を読んでVC++の役に立ちますか?
まったく別物なら素直にVC++の本買おうと思うんだけど
ちょっと貧乏で3週間は買えないから。 
プログラムはまったくした事ないのでパラパラ本を見ても(cとC++の違いが)よくわかりません。
138デフォルトの名無しさん:04/10/01 02:05:27
>>137
言っておくけれど、VC++とはMicrosoftのソフトの名前で、言語はC++なのですよ。
だから、本を買うならVC++と書いてある本よりもC++と書いてある本を
買うのがよろしい。
また、C++はCの拡張言語なので、Cを知った上でC++を学ぶのが正当な学習です。
ちなみに、Cを覚えるときの参考書は プログラミング言語C、
C++を覚えるときの参考書は C++ Primer、
がおすすめです。
139デフォルトの名無しさん:04/10/01 02:06:43
>>135
それはテンプレートクラスの実装を別ファイルにしているのが原因。
現実的な話、ほぼすべてのコンパイラはそれをサポートしていない。
解決法はヘッダに実装を直接書くしかない。
140デフォルトの名無しさん:04/10/01 02:08:04
>>138
詳しくありがとうございました。
Cの本をじっくり読み進めてみます。
141デフォルトの名無しさん:04/10/01 02:10:55
>>137
C++を学習するのにCを先に学習せねばならないかは、どちらとも
使える人間の間でも議論のあるところ。俺個人は必要ないと
思っている。それから、VC++を使おうがBCCを使おうがC++を学習
しなければ使いようがない。VC++の本とか言ってVC++という
ものすごく環境依存の本を読むよりも、C++という言語については
その専門書を、VC++という環境についてはその専門書を、別に
読むことをお勧めする、金がなくても。結局はそれが近道。
142デフォルトの名無しさん:04/10/01 02:16:15
Cの内容を兼ねたC++の本も多いような気がする。
というか自分がそれに騙された。Cの入門書をただC++に
直しただけの本。
143大学生:04/10/01 02:18:34
>>139
どうもありがとうございます。
ヘッダに直接展開したらMAKEできました!
ファイルをまたがってのテンプレートはできないのですね。
勉強になりました。
144デフォルトの名無しさん:04/10/01 02:24:31
>>137
Cの勉強は要らないに一票。
あと、書籍代を惜しんでいては勉強は出来んぞ。
どうしても金が無かったら図書館を利用すべし。
政令指定都市クラスならなら公立図書館でも
プログラミング書は結構置いている。
145デフォルトの名無しさん:04/10/01 02:26:04
>>139
クラステンプレートね。
146デフォルトの名無しさん:04/10/01 02:28:53
Cはの勉強はいらないと言っている奴はたぶん学術的な下積みも無いに違いない。
高卒プログラマかな。
147デフォルトの名無しさん:04/10/01 02:31:15
C++やるならC++で勉強すりゃいいよ。
148デフォルトの名無しさん:04/10/01 02:32:05
>>137
図書館だったら返さないといけないから忘れた時に調べたい
とき不便。基本的には買う方がいいような気がする。自分は、だけど
実際、あれはどうだったっけって思った時本無いから不便に思った事あるし。
149デフォルトの名無しさん:04/10/01 02:36:19
>>148
同意。
しかし最近は結構ウェブで事足りることも多いからなぁ
150デフォルトの名無しさん:04/10/01 02:37:53
ここで質問するのもどうかと思うけど
今勉強するべきプログラミング言語ってなにがいいかな?
自分で思うのは
@JAVA
AC
BVB
なんだけど。
151デフォルトの名無しさん:04/10/01 02:43:43
アングラ探してPDFをDLしろ。英語版か中文版しかないが。
タイ━━━━||Φ|(|゚|∀|゚|)|Φ||━━━━ホ!?
152デフォルトの名無しさん:04/10/01 02:45:10
いまどきCなんかやってクソッタレなCの文字列処理関数とか覚える暇があるんならアセンブラでもやったほうがまだマシだろ。
153デフォルトの名無しさん:04/10/01 02:49:20
まさにスレ違いの流れ!
154デフォルトの名無しさん:04/10/01 02:55:02
アセンブラって言語?
155デフォルトの名無しさん:04/10/01 03:00:21
(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#に置き換えられていくのでは
ないだろうか。
156デフォルトの名無しさん:04/10/01 03:02:51
アセンブリ言語をアセンブラでアセンブルしようか。
157デフォルトの名無しさん:04/10/01 03:07:36
コンパイラは知ってるぞ。漫画だよな。
アセンブラも知ってるぞ。漫画だよな。

158デフォルトの名無しさん:04/10/01 03:11:35
おまいら、これでも実行してろ
E8 FD FF
159デフォルトの名無しさん:04/10/01 03:21:29
バイナリエディタを使うんですね
160デフォルトの名無しさん:04/10/01 03:32:51
>>146
学術的な下積みって何?
駅弁大学で万年助手すること?
161デフォルトの名無しさん:04/10/01 03:38:40
C++できるってことはCもできるんじゃない。
ていうか>>153に同意
162デフォルトの名無しさん:04/10/01 09:21:06
スレ違いは分かってて質問するけど(何故ならC++が好きだから)
日本以外に行ったら三文字表記は今でも使われてるのですか。
??=include <iostream>
int main()
??<
int n??(1??)={10};
cout<<"Hello, World??/n"<<n??(0??)<<endl;
return 0;
??>
なんかすごいよね。
163デフォルトの名無しさん:04/10/01 09:22:40
あっusing namespace std;が抜けてる
164デフォルトの名無しさん:04/10/01 09:27:16
ならCでパターン全部書いてみろと
165デフォルトの名無しさん:04/10/01 10:49:25
>>152
こんな風に考えているのが大勢いるんだろうね。
着眼点が下等すぎ。
166デフォルトの名無しさん:04/10/01 10:57:49
>>165
釣られんな(w
ユーザライクな文字列処理を必要とする人がアセンブラに走るわけがない。
167デフォルトの名無しさん:04/10/01 12:52:39
>152

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


ここC++のスレです
168デフォルトの名無しさん:04/10/01 12:54:10
>>167
なにいってんの?
169デフォルトの名無しさん:04/10/01 18:36:43
ここはCwwのスレじゃありません。
170デフォルトの名無しさん:04/10/01 18:55:07
派生クラス固有の値を派生元のポインタから仮想関数経由でセットする方法を教えてください。
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・・・といろんなサイズ・型の各派生先固有の構造体があります。
171デフォルトの名無しさん:04/10/01 19:12:21
↑の人の使わせてもらうけど
class A{
  public:
 virtual void Initialize( void* )=0;
     };

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

こんな感じに段落をつけてる(文の最初に空白を数行いれてる)のは
見易くするためだけ?
172デフォルトの名無しさん:04/10/01 19:14:29
>>171
それのどこが見やすいんだ?
173デフォルトの名無しさん:04/10/01 19:44:00
>>170
dynamic_castとかCOMのIUnknown::QueryInterfaceみたいな仕組みを導入するとか。
つーか派生先で独自の初期化関数作ればいいじゃない。
174デフォルトの名無しさん:04/10/01 19:45:26
>>170
受け渡しに使いたい派生クラス固有のオブジェクトをboost::anyかなにかで渡せば?
175デフォルトの名無しさん:04/10/01 19:45:37
>>170
保証がないということは、
正しくなかった場合にどうしたいのかを
まず決めなければ話を始められない
176デフォルトの名無しさん:04/10/01 20:00:58
  bs = *(BStruct*)p; というところを
bs=*dynamic_cast<BStruct*>(p); としても動作するようにいたるところ修正...とおもったけど
BStruct は構造体で無いとだめ?
177デフォルトの名無しさん:04/10/01 20:22:15
>>176
dynamic_castに必要な条件を述べよ
178デフォルトの名無しさん:04/10/01 20:23:57
>>177
わかんない。まわりくどい事いわないで教えろ
179デフォルトの名無しさん:04/10/01 20:25:31
キャスト前のポインタの先に virtual
180デフォルトの名無しさん:04/10/01 20:25:34
つ仮想関数
181180:04/10/01 20:27:19
>>179
ケコーンしないか?
182デフォルトの名無しさん:04/10/01 20:27:56
サンクス。
キミたちに幸せが来るように祈ってる
183デフォルトの名無しさん:04/10/01 20:29:35
>>181
女なら品定めさせろ
男なら金くれ
184デフォルトの名無しさん:04/10/01 20:30:57
おまえらみんな金ヤンだ
185デフォルトの名無しさん:04/10/01 20:31:49
この流れにワラタ
186デフォルトの名無しさん:04/10/01 20:33:07
>>183
           _._
 _|_|_|_   |_|_|     /  __            ___
   |  |_|    |_|_|    |                       ヽ
   |        /| | \   |          ───一        |
   |___    ノ  |     レ  ヽ_                 _ノ

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

    へ          へ|\ へ     √ ̄|        へ
   ( レ⌒)  |\   ( |\)| |/~|  ノ ,__√    /7 ∠、 \ .  丶\      _ __
|\_/  /へ_ \)   | |   | |∠  | |__   | /   !  |     | |_〜、  レ' レ'
\_./| |/   \     .| |( ̄  _) |     )  | |    i  |  へ_,/    ノ   ,へ
  /  / ̄~ヽ ヽ.   | | フ  ヽ、 ノ √| |   ! レノ  |  !. \_  ー ̄_,ー~'  )
 / /| |   | |   | |( ノ| |`、) i ノ  | |   \_ノ  ノ /    フ ! (~~_,,,,/ノ/
 | |  | |   / /    | | .  し'  ノ ノ   | |       / /     | |   ̄
 \\ノ |  / /      | |___∠-".   | |      ノ /       ノ |  /(
  \_ノ_/ /     (____)     し'      ノ/      / /  | 〜-,,,__
     ∠-''~                        ノ/         (_ノ   〜ー、、__)
187170:04/10/01 20:33:56
>>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したほうがいいですね。
188デフォルトの名無しさん:04/10/01 20:43:45
>正しくなければ戻り値をboolにしてfalseをreturnしてやるくらいで十分です。

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

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

スクリプトの実装くらいしか思いつきません
191デフォルトの名無しさん:04/10/02 11:30:50
・ドラッグ&ドロップ
・コピー&ペースト
・アーカイブファイルからの読み込み
192デフォルトの名無しさん:04/10/02 16:07:49

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

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

周りのコードを見直して見れ
194デフォルトの名無しさん:04/10/02 19:20:28
>>192
""だって立派な文字列だ。
195デフォルトの名無しさん:04/10/02 19:21:11
処理系によって扱いが違うのかも。
196デフォルトの名無しさん:04/10/02 19:27:14
"" が格納されている位置の前に格納されている
別の文字列に対してオーバーランな書き込みしてるとか
197デフォルトの名無しさん:04/10/02 19:37:45
"は文字列ではありません。"は区切り記号です。
198デフォルトの名無しさん:04/10/02 19:38:17
return でなく exit で終了させて問題が起こらなければ
スタックの異常
199デフォルトの名無しさん:04/10/02 20:13:49
>192
あーおんなじ状況になったことがある
メモリまわりのバグなんだよね
不適切なメモリアドレスを操作していないかチェックしたほうがいいよ
200デフォルトの名無しさん:04/10/03 00:20:14
何故にprintf("");を記述したのか...
201デフォルトの名無しさん:04/10/03 05:31:18
""はサイズ0の文字列で終端コードである"\0"は含まれるからね。"\0"と書いてあるのと差はない。(はず)
それが格納されるのはあたゆる初期値付き変数と同じところになる。(そうじゃない場合もあるが)

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

ただ、using namespaceを前提に考えるのはどうかな。
using hoge::hage; を使うのを推奨するけどね。
(using std::stringとして、ソース内ではstd不要のstringだけで使うとか)
207デフォルトの名無しさん:04/10/03 07:52:19
あれは namespace が使えない場合でしょ?
クラスにする意味がないんだからこういう設計は絶対しないよ
208デフォルトの名無しさん:04/10/03 08:19:00
「絶対」ではないよ。
traitsという例をわざわざ挙げたのに。
209デフォルトの名無しさん:04/10/03 08:26:37
template引数ってのはnamespaceが使えない状況じゃないの?
210デフォルトの名無しさん:04/10/03 09:07:49
Ruby >>>>>>>>>>>>>>>>>>>>>> なめsぱcえ
211デフォルトの名無しさん:04/10/03 09:09:01
>>209
そうだよ。
>>208はまだお風呂からでてシャツを着ただけの情況なのでしょ。残りはスッポンポン。
212デフォルトの名無しさん:04/10/03 09:10:39
Rbuyb >>>>>>>>>>>>>>>>>>>>>>.Rubyho!!!!!!!
213デフォルトの名無しさん:04/10/03 10:29:23
209って具体的にどういうことなんですか?
214デフォルトの名無しさん:04/10/03 11:00:43
>>213
namespace A{
 typedef int type;
}

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

216デフォルトの名無しさん:04/10/03 16:28:05
>>201
""はサイズ1の配列。"\0"はサイズ2の配列。
217デフォルトの名無しさん:04/10/03 16:34:14
>>216
サイズという単位はありません
218デフォルトの名無しさん:04/10/03 16:42:28
>>217
サイズは単位じゃなくて次元では
219デフォルトの名無しさん:04/10/03 17:38:59
>>217
「要素数」ならいいか?
220デフォルトの名無しさん:04/10/03 20:46:56
誰も配列ではなく配列へのポインタだって所には突っ込まないのね
221デフォルトの名無しさん:04/10/03 21:02:34
>>220
C++では文字列リテラルはconst char[n]型である。
プログラミング言語C++第3版5.2.2「文字列リテラル」を参照
222デフォルトの名無しさん:04/10/04 11:42:49
>>215
ロケールが管理しているオブジェクトだから。
223デフォルトの名無しさん:04/10/05 00:08:37
VC6の頃はデストラクタはPROTECTEDマクロ=publicだった。
VC7でPROTECTEDマクロ=protectedになった。
意味わからんね。
ばーぁ
225デフォルトの名無しさん:04/10/05 00:17:03
なんでC+ではなくC++となったのか
226デフォルトの名無しさん:04/10/05 00:28:21
>>225
インクリメント
227デフォルトの名無しさん:04/10/05 00:30:40
だれかCをBASIC風に機能削減したバージョンのC--を作ってください。
228 ◆FIcNi4f8js :04/10/05 00:31:38
>>227
WSH
229デフォルトの名無しさん:04/10/05 00:33:46
Ruby!!!!!!!!!!!!!!!!!!!!!!!!!!!
230デフォルトの名無しさん:04/10/05 00:37:59
>>229
お前Rubyの事ほとんど知らない奴だろう?
231超絶Rubyhakka−:04/10/05 00:38:41
Ruby!!!!!!!!!!!!!!!!!!
232 ◆FIcNi4f8js :04/10/05 00:39:40
>>230
きっと生姜区制だろう。
233デフォルトの名無しさん:04/10/05 00:41:34
最近の小学生は激しいな。
234デフォルトの名無しさん:04/10/05 02:39:26
>227
>だれかCをBASIC風に機能削減したバージョンのC--を作ってください。
Cって言語の基本的なことはとても少ないと思うんだが…
235デフォルトの名無しさん:04/10/05 03:24:27
>>227
スレ違いだが、C--という言語はもうある。
http://www.cminusminus.org/
コンパイラのバックエンド用なので、人間様用の言語ではないが。
236デフォルトの名無しさん:04/10/05 13:46:17
237デフォルトの名無しさん:04/10/05 14:44:36
特許ってうざいよね。
アイデアを特許にする人たちは俺から見たらお気楽だけど。
実際に特許の部分を有効活用して開発する人たちの血と汗と涙の結晶は特許の前では意味を
なさなくなるんだからやってらんないのでわ。
ま〜勝手にアイデアを使われて怒るのは分るけど
だからといって、訴訟を起こしての損害賠償が高すぎ。
今日の特許の乱立実態だからこそ、損害賠償額のルールを決めたほうがいいような。
もしかしてガイシュツだったりする。
238デフォルトの名無しさん:04/10/05 14:55:54
std:auto_ptr って何で get メソッドを持ってるんですか?
ポインタの管理を全て auto_ptr が面倒見るから利点があるのだと思うのですが
239デフォルトの名無しさん:04/10/05 15:01:04
>>238
生ポインタを引数に取る関数とか呼び出せないじゃん
240デフォルトの名無しさん:04/10/05 15:26:35
>>236
>Kodakの特許はWang Laboratoriesのイメージングソフトウェア部門が開発した技術を
>Kodakが1997年に買い取ったもので、2個のソフトウェアが協調動作する技術、
>つまりオブジェクト指向プログラミングのキーコンセプトであり、
>ユーニス氏によれば、1960年代に開発されたSimulaコンピュータ言語にまでさかのぼることができるという。
公知で特許成立しないんじゃないの? 解説よろしく
241デフォルトの名無しさん:04/10/05 16:03:37
よくわからんがC++のクラスは大概の実装において仮想関数ポインタのテーブル持ってるだけだから、
逆にそれが特許侵害と認められるとCなどの非OOのコードすら危うくなってくるわけだ・・・。
242デフォルトの名無しさん:04/10/05 16:27:34
>>241
ちょっと見てみたけど、もっと抽象的なレイヤーでの特許みたい。
OOベースのRPC (Remote Method Invokation の類) と、ORB の基本概念あたりをカバーしてる。
出願時点(1993 年)に既に公知だったような気がするけど・・・
243デフォルトの名無しさん:04/10/05 16:37:35
スラドが大好きそうなネタだけど誰もたれこんでないのん?
244デフォルトの名無しさん:04/10/05 16:42:53
245デフォルトの名無しさん:04/10/05 20:00:33
>>239
生ポインタに限定って時点でSTLじゃねえな
246デフォルトの名無しさん:04/10/06 00:34:43
ヘッダにusing namespace xxx;使う場合と、
ソースにusing namespace xxx;を使うのとでは意味が違うんでしょうか?
247デフォルトの名無しさん:04/10/06 00:37:11
>>246
どんなしょぼい参考書にも必ず書いてあると思うが。
248デフォルトの名無しさん:04/10/06 00:38:30
意味は同じ。
効果範囲はスコープ内。
249デフォルトの名無しさん:04/10/06 00:48:54
>>248
ヘッダはグローバルスコープで、
ソースだとそのファイルがスコープになるということかしら?
250デフォルトの名無しさん:04/10/06 00:50:01
書いた場所から次の

}

まで。普通のauto変数と一緒。
251デフォルトの名無しさん:04/10/06 00:50:18
>>246=249
C++にヘッダとソースの区別なんか無いよ。
252デフォルトの名無しさん:04/10/06 00:52:42
ヘッダを#includeした先でusing namespaceしちゃうから迷惑
253デフォルトの名無しさん:04/10/06 00:53:01
>>250
なるほど!
たとえば、

usingnamespace std;

Unko::Unko() {



}

Unko::~Unko() {



}

これだと、コンストラクタだけ、usingnamespace std;が有効になるということか。
変な仕様だなぁ。
254デフォルトの名無しさん:04/10/06 00:54:57
頼むからヘッダファイルで using namespace しないで欲しい
255デフォルトの名無しさん:04/10/06 00:56:54
>>253
それじゃauto変数と一緒じゃないだろ
256デフォルトの名無しさん:04/10/06 01:01:03
{
using namespace std;
string hoge0;
}
std::string hoge1
string hoge2; //エラー
257デフォルトの名無しさん:04/10/06 01:03:42
エラー ;がありません。
258デフォルトの名無しさん:04/10/06 08:31:25
>>255
↓のように書いた場合は、どこまで有効になるの?

----Hage.cpp-----------
#include <stdio>

using namespace std;

Hage::Hage(){

}

Hage::~Hage(){

}

-------------------------

259デフォルトの名無しさん:04/10/06 08:40:51
>>255,>>253 ネタニマジレスイラネ
260デフォルトの名無しさん:04/10/06 10:04:23
>>257
ワラタ
261デフォルトの名無しさん:04/10/06 10:04:49
>>258
> #include <stdio>

そんなヘッダはない。
262デフォルトの名無しさん:04/10/06 10:45:26
class Date
{
protected:
static int year;
}

class DateDifference:public Date
{
public:
void getYear() {

do
{
cout<<"Enter a year between 1800 and 7000:";
cin>>year;
}while(year >= 1800 && year <= 7000);

}
という風にやりたいのですが、yearがDateDifferenceのほうで使えないのですが
どうすれば使えるようになるでしょうか?初心者なのでよくわからないのです。
教えてください。よろしくお願いします。

263デフォルトの名無しさん:04/10/06 11:03:43
>>262
int Date::year;
264デフォルトの名無しさん:04/10/06 11:08:38
>>262
Date::yearが定義されてないに10000ホゲー
265デフォルトの名無しさん:04/10/06 11:09:53
>>int Date::year;
262さんありがとうございます。これをどこに書けばいいのでしょうか?
わからなくてごめんなさい。。
266デフォルトの名無しさん:04/10/06 11:34:53
>>265
自分に礼を言ってどうする?
という突っ込みはさておき。

class Dateの定義の下にでも追加しときな。

あと、君にふさわしいのはこちら。
【初心者歓迎】C/C++室 Ver.9【環境依存OK】
ttp://pc5.2ch.net/test/read.cgi/tech/1094494997/l50
267デフォルトの名無しさん:04/10/06 12:05:28
#include <iostream>
#include <string>
using namespace std;
class A{
private:
int x, y;
public:
A(int a, int b){x = a; y = b;}
friend ostream& operator<<(ostream& stream, A& a);
friend istream& operator>>(istream& stream, A& a);
};
ostream& operator<<(ostream& stream, A& a){
stream << a.x << " : " << a.y << endl;
return stream;
}
istream& operator>>(istream& stream, A& a){
cout << "座標入力 => "; stream >> a.x >> a.y;
return stream;
}
int main(){
A a(10, 20), b(30, 40);
cout << a << b; cin >> a; cout << a;
    return 0;
}
このプログラムを実行すると、
cpp(16) : error C2248: 'x' : private メンバ (クラス 'A' で宣言されている)にアクセスできません。 cpp(7) : 'x' の宣言を確認してください。
cpp(16) : error C2248: 'y' : private メンバ (クラス 'A' で宣言されている)にアクセスできません。 cpp(7) : 'y' の宣言を確認してください。
cpp(23) : error C2248: 'x' : private メンバ (クラス 'A' で宣言されている)にアクセスできません。 cpp(7) : 'x' の宣言を確認してください。
cpp(23) : error C2248: 'y' : private メンバ (クラス 'A' で宣言されている)にアクセスできません。 cpp(7) : 'y' の宣言を確認してください。
cpp(31) : error C2593: 'operator <<' があいまいです。 cpp(32) : error C2593: 'operator >>' があいまいです。 cpp(33) : error C2593: 'operator <<' があいまいです。
というエラーが出ます。本に書いてある通りに書いたんですが、なぜなのかわかりません。
どうしたら、ちゃんとできるのか教えてもらえないでしょうか?
268デフォルトの名無しさん:04/10/06 12:23:29
>>267
特に問題なさそうだが?
ちなみに gcc, bcc55, VC7 では通ったぞ。
インライン定義(friend 宣言に関数の内容も一緒に書く)してもダメか?
269デフォルトの名無しさん:04/10/06 12:24:50
コンパイラが悪いのでは?
270デフォルトの名無しさん:04/10/06 12:25:55
>>267
VC はサービスパック必ずあてとけ
只でさえバグ(珍妙な仕様も含む)だらけだが、少しはマシになる
271デフォルトの名無しさん:04/10/06 12:35:14
いい加減VC6は(r
272デフォルトの名無しさん:04/10/06 12:42:26
C使いならVC6でもいいかもC++使うんならVC6じゃ話になんね
273デフォルトの名無しさん:04/10/06 12:44:46
operator <<, >>の定義が別ファイルにあってヘッダを読んでないとかじゃないの?
274デフォルトの名無しさん:04/10/06 12:47:43
ISO C++が策定されたの98年だっけ?
VC6もたしか98年だから対応して無くて当然だと思われ。
さっさと.NET2003に乗り換えれ。良いぞ。boostもLokiも動く。
コンパイラだけならただなんだろ?
275デフォルトの名無しさん:04/10/06 13:09:11
時代考証については >>274 が言っているのが正しい
VC6 は今でも思いっきり現役で、他に選択肢がなく ISO と違うと嘆いても始まらない場面が少なくない
276デフォルトの名無しさん:04/10/06 13:10:41
VC6軽いんだよ…
277デフォルトの名無しさん:04/10/06 13:27:45
VC6はC++ではない、と割り切って使えば構いません。
でも、C++スレで質問しないでね。
278デフォルトの名無しさん:04/10/06 13:44:42
>>277
__closureだの__propertyだのが大量に入ってるBCBのコードはどうしましょう
279デフォルトの名無しさん:04/10/06 13:47:40
窓から投げ捨てろ
280デフォルトの名無しさん:04/10/06 13:47:44
>>278
奴は構文がC++に似ているDelphiの一種だと思え。
281デフォルトの名無しさん:04/10/06 14:21:35
潔癖性が多いな
282デフォルトの名無しさん:04/10/06 15:20:09
>>277
まだ ISO が定義する「C++」は出荷されていないはず
VC6 は ARM C++ と理解すればいい
283デフォルトの名無しさん:04/10/06 16:49:46
>237 :デフォルトの名無しさん :04/10/05 14:44:36
> 特許ってうざいよね。
> アイデアを特許にする人たちは俺から見たらお気楽だけど。
> 実際に特許の部分を有効活用して開発する人たちの血と汗と涙の結晶は特許の前では意味を
> なさなくなるんだからやってらんないのでわ。
> ま〜勝手にアイデアを使われて怒るのは分るけど
> だからといって、訴訟を起こしての損害賠償が高すぎ。
> 今日の特許の乱立実態だからこそ、損害賠償額のルールを決めたほうがいいような。
> もしかしてガイシュツだったりする。

特許を誤解しているよ。特許ってのは役人と大企業のためにある。
そして損害賠償請求をする為に取得するんだ。
284デフォルトの名無しさん:04/10/06 18:12:54
C++で書かれたゲーム(出来ればSTG)のソースコードを公開されているゲームを探してるんだけど
もし知ってるのがあれば教えてくださいな
285284:04/10/06 18:15:41
追記、3Dのゲームでお願いします
286デフォルトの名無しさん:04/10/06 18:30:21
cubeじゃダメかね?
http://www.cubeengine.com/
287284:04/10/06 18:38:35
サンクス!英語が辛いけど、読んでみまっす
あとこれの置き場所を見てsourceforgeから探すことを思いつきましたですYo
288デフォルトの名無しさん:04/10/06 19:27:49
classや構造体の、メンバへのアクセスは遅いので、
ループの際はなるべく一時変数に取った方が良いそうですが、
これはやっぱり階層が深まるほど遅いのでしょうか。

A: temp = class->child->grandchild->great-grandchild->data;
B: temp = class->data;

それともAとBは、内部的には同じ速さになったりするのでしょうか。
289デフォルトの名無しさん:04/10/06 19:30:45
>>288
君が気にしなきゃならないほど遅くないからほっといていいよ。
290デフォルトの名無しさん:04/10/06 19:34:14
>>289
生成物の実行速度はほとんど変わらないが、
開発チームの保守速度は確実に低下する。
291デフォルトの名無しさん:04/10/06 19:40:28
>>288
計ってみましょうよ.
VC++だったらこのスレの上にrdtscを貼ってくれたひとがいるし,(型は__int64でいいの?)
Linuxだったら
#include <asm/msr.h>
にrdtscはある.
292デフォルトの名無しさん:04/10/06 19:46:56
間違えやすいし見にくいし横に長くなって鬱陶しいから保存しろ
293デフォルトの名無しさん:04/10/06 19:47:38
>>290
そんなこと聞いていない
294デフォルトの名無しさん:04/10/06 19:55:08
以下の関数は0~15のintをcharの0~9,A~Fにして出力させようとしたのですよ。
inttochar16(int)にint型の0~15を入れた場合はちゃんとcharの0~9,A~Fが返ってくるのですが
ポインタで回そうとすると失敗します。ボスケテ。

#include <iostream.h>
char inttochar16(int i,int intDefault){//intの0~15をcharの0~9,A~Fに変換します。
if((i<10)&&(i>-1)){
return i+48;
}else if((i<16)&&(i>9)){
return i+55;
}else{
return intDefault;
}
}//END inttochar16

int main(void){
int i[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int *pi;
pi = &i[0];
while(*pi){
cout << inttochar16(*pi,36) << "\n";
pi++;
}
return 0;
}
295デフォルトの名無しさん:04/10/06 20:00:23
お前らは、プロもしくはノンプロのプログラマであって、断じてパスタ職人ではないはずだ。
誰ですか、スパゲッティコードを奨励している人は?
296288:04/10/06 20:00:49
レスありがとうございます。
分かりやすくしようと、ちょっと大げさに書きすぎたかなw
実際はイテレータによるアクセス程度です

>>291
簡単なテストコードだと、吐いたアセンブラを見る限りどちらも
全く差は無いのですが、私が思いつかないような条件が重なったりすると
どうなのかなぁ…と思い質問お願いした次第なんです。

やっぱり皆さんのレスみても、まるっきり同じって感じでは無いですね。>ほとんど、〜ほど
297デフォルトの名無しさん:04/10/06 20:13:00
負の数に%を適用した結果ってどうなるんですか?不定?
298デフォルトの名無しさん:04/10/06 20:17:08
>>294
どう失敗したのか書けよ。
あとint配列の最後に0が入っているとは限らない。
299デフォルトの名無しさん:04/10/06 20:18:43
>>289 >>290
わずかでも遅くなるのか?
300デフォルトの名無しさん:04/10/06 20:20:28
>>298
つーか最初のループ条件で偽になるな、これ。
301294:04/10/06 20:26:23
>298 最初に0が入ってるからループに入らないだけでした。Thx。

で、別な疑問が沸いたのですが、
int i[不定の自然数];
int *p;
p = &i[0]
で、iの終わりまで処理を行いたい場合、
whileループで回すにはどうすればいいでしょ。
while(*p == null){だとnullなんて知らんと怒られます。
302デフォルトの名無しさん:04/10/06 20:29:32
>>301
頼むから、あてずっぽうでコード書くな。
なんか知らんけど動いたからいいやっつー新人が一番手に負えない・・・。
while( *p == null )
pの指してる先の値が null?
いつ終端に null なんか入れた?
つーかそもそも null 定義して無いだろ?
303302:04/10/06 20:30:20
つーかそれだと *p が null の間繰り返すだろ。
304294,301:04/10/06 20:31:00
>302,303
少し頭冷やしてきます....すいません。
305デフォルトの名無しさん:04/10/06 22:05:30
>>301
#include <iostream>
#define ARRAYNUM(a) (sizeof (a) / sizeof (a)[1])
using namespace std;
int main(void) {
  int i[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  int *pi;
  pi = &i[0];
  while (++pi != i + ARRAYNUM(i)) {
    cout << inttochar16(*pi, 36) << "\n";
  }
  return 0;
}
306デフォルトの名無しさん:04/10/06 23:01:01
>>301
ARRAYNUM っていうマクロにするかどうかは別として、個数の定まった
配列に対してsizeof(T) / sizeof(T[0]) で個数を得るのはC / C++のイディオムの一つ。
307デフォルトの名無しさん:04/10/06 23:18:04
C++ではマクロでなくテンプレートだな
template <typename T> int arraynum( const T& t ){ return sizeof( t ) / sizeof( t[ 0 ] ); }
308デフォルトの名無しさん:04/10/06 23:27:18
template< typename T, size_t N > size_t arraynum( T (&)[N] ){ return N; }

だろ。
309デフォルトの名無しさん:04/10/06 23:43:14
template <typename T, std::size_t N> std::size_t arraynum( T (&)[N] ){ return N; }
310デフォルトの名無しさん:04/10/06 23:44:37
template <typename T, std::size_t N> inline std::size_t arraynum( T (&)[N] ){ return N; }
つかそもそも std::size_t でいいの?unsigned int じゃダメ?
311デフォルトの名無しさん:04/10/06 23:45:45
やっぱり気が狂ったようなところのある言語だな
312デフォルトの名無しさん:04/10/06 23:51:12
カットオペレータを追加すれば、そのまま Prolog になりそうだよね。
313デフォルトの名無しさん:04/10/07 00:17:09
俺は配列の要素数を求める式を見た時はふ〜ん、こんなこと出来るんだ。
ふつうにテンプレートってすごいなって具合に感動したけど、
char (&test(...))[2];
この式を見た時はマジC++に感動した。
314デフォルトの名無しさん:04/10/07 00:18:40
普通の人間なら typedef なりして見やすくしろと思うだろうけどな
315デフォルトの名無しさん:04/10/07 00:34:26
>301
sizeofで配列のサイズを測るか
その部分を関数化して、関数の引数に何文字操作するかをしてるするのかが普通。
まずは、配列と文字列の区別をしっかりした方がいいと思う。

あと>294のソースは
return i+48;
}else if((i<16)&&(i>9)){
return i+55;
この辺りは、頼むから、'0'や'A'って書いてくれ。
316デフォルトの名無しさん:04/10/07 01:37:13
>>288
階層が深まるほど評価に必要な命令数は当然増える。
でも、階層に比例して処理時間が増大するかどうかは
最適化に依存するので実測しないとわからない。

ループ前に一時変数に取っておくようにソースを書いておけば、
ほとんどの場合で無視できる差に抑えることができる。
317デフォルトの名無しさん:04/10/07 02:51:06
DLLで作ったクラスを、exe側で継承した場合、何か問題出る?

dll

EXPORT class DllClass{
・・
};
-----------------------

exe側
class ExeClass : public DllClass{
・・
}

exe側で派生クラスを使用
ExeClass *pExeClass = new ExeClass ;
delete pExeClass ;

問題なかったとしても、DLL変更したら、exe側もリビルド必要?
DLLとクラスは、やっちゃいけないけど動くこともあるとか微妙な説明が多くて混乱する・・
318デフォルトの名無しさん:04/10/07 02:56:44
>>317
> DLLとクラスは、やっちゃいけないけど動くこともあるとか微妙な説明が多くて混乱する・・

これが問題。わかってんじゃん。
319デフォルトの名無しさん:04/10/07 11:52:42
Cで構造体の中に構造体をいれてつかってんだけど
C+でクラスにしたいときってクラスの中のクラスってできる?
320デフォルトの名無しさん:04/10/07 11:54:25
出来るにょ
321デフォルトの名無しさん:04/10/07 11:55:40
1にょっき
322デフォルトの名無しさん:04/10/07 12:25:18
>>319
やってみてから聞けよ。
323デフォルトの名無しさん:04/10/07 12:27:33
http://pc5.2ch.net/test/read.cgi/tech/1094494997/811
こっちでも馬鹿な質問してるな。
324デフォルトの名無しさん:04/10/07 15:30:46
包含っていう。
325デフォルトの名無しさん:04/10/07 19:33:47
>>324
睾丸!?なんていやらしいお名前。
326悩める初心者:04/10/07 21:23:58
g++とC++言語の話だけど、、、

strcmpとかの標準提供関数を、自前でC言語で実装して、ライブラリ作りました。

C言語で、strcmpを呼び出すプログラムかいて、gccでコンパイル、リンク
するとOKだけど、

C++でstrcmp呼び出すプログラム書いて、それをg++でコンパイル、リンクすると
NGがでちゃいます。なんかうまくリンクできる方法ってないですか?g++のバグかな?

なお、staticにしないとコンパイルは通ったんだけど、要件上staticじゃないと
だめなんです。

g++ -L/home/hoge/lib hello.cpp -o HELLO -lmylib -static
/lib/libc.a(strcmp.o)(.text+0x0): In function `strcmp':
multiple definition of `strcmp'
/home/hoge/lib/libmylib.a(strcmp.o)(.text+0x0): first defined here
collect2: ld returned 1 exit status


OS:RedHat
compiler:GCC
Lang:C++
327デフォルトの名無しさん:04/10/07 21:35:21
コアチームに入るしかないな。
328デフォルトの名無しさん:04/10/07 21:42:17
-z muldefs でりんくできないかなーー。
でも、どっちのstrcmpが使われるのかシラン。
329デフォルトの名無しさん:04/10/07 21:49:41
いや、これはコアになれという要件だよ。
間違っても namespace で逃げたりしちゃだめなんだよ
330デフォルトの名無しさん:04/10/07 21:50:42
>>326
free-standing environment に移植可能なコードを書こうとしているのか?
331デフォルトの名無しさん:04/10/07 21:54:33
// a.h ////////////////////
#include "b.h"

class A { void func(B b); };

// b.h ////////////////////
#include "c.h"

class B{ C *pc; };

// c.h ///////////////////
#include "d.h"

class C{ D d; };

// d.h //////////////////
#include "a.h"

class D : public A { ・・・ };

このように4つのファイルでインクルードのループができたような
状態のプログラムがあるのですが、コンパイルすると
d.hで 定義されていない基底クラスAが使われています。
みたいなエラーが出るのですが、原因がわかりません。

前方参照とかの関係かとおもったので、d.h のDクラスを定義する前に
class A; という行を追加してみてもエラーが消えません。
さらに c.h で class D; b.hで class C; a.hで class B; という
前方宣言をそれぞれいくら追加したり消したりしても直りません。
b.h の C *pC; と #include "c.h" をコメントアウトするとエラーがなくなります
が、それでは考えている動作をさせることができません。
どうすれば解決できるかわかる方がいましたら教えていただけないでしょうか。
332デフォルトの名無しさん:04/10/07 22:01:24
>>331
ありがちなパターンで、ヘッダの最後を改行してないってオチとか・・・
333デフォルトの名無しさん:04/10/07 22:01:51
>>331
根本的に設計見直せ。

と、それだけだとなんだから一応。
b.hの#include "c.h"を消して代わりにclass C;と書く。
334デフォルトの名無しさん:04/10/07 22:05:16
ここでpimpleイディオムですよ
335デフォルトの名無しさん:04/10/07 22:06:10
pimpl ダタorz
336デフォルトの名無しさん:04/10/07 22:11:24
>328
試してみます。

>330
ちょっとはしょってかきましたけど、組み込み向けCPUのバイナリ作ってるんです。
卒研である機器の制御用のプログラム書いてます。機器側にはライブラリ持ってないんで、staticなバイナリの生成が必要です。
337326=336=悩める初心者:04/10/07 22:12:50
です。m(_ _)m
338デフォルトの名無しさん:04/10/07 22:13:55
てかそもそもここはgccに限定したスレじゃないのでスレ違い。
答えてる香具師も一緒にgccスレ逝け
339超絶Rubyhakka−:04/10/07 22:15:07
ハァ?
340デフォルトの名無しさん:04/10/07 22:18:29
>>339
ハァ?
341デフォルトの名無しさん:04/10/07 22:24:17
#include <iostream>
using namespace std;

int main(){
try{
throw "nullpo!";
}
catch(char *e){ cout << "GA!" << e << endl;}
return 0;
}

なぜか文字列をcatchできないんですが、なぜでしょうか?
Cygwinのgcc3.3.1です。
342デフォルトの名無しさん:04/10/07 22:25:06
Linux+sh3=Shnux
343デフォルトの名無しさん:04/10/07 22:28:26
>>341
gccのバグ
344デフォルトの名無しさん:04/10/07 22:28:37
C++の文字列リテラルは const char[N]型
345デフォルトの名無しさん:04/10/07 22:34:04
暗黙に const_cast がかかる特殊なケース
346デフォルトの名無しさん:04/10/07 22:37:14
>>331

//#include "b.h"

template <typename B>
class A { void func(B b); };
347デフォルトの名無しさん:04/10/07 22:42:47
>>341>>345
それがなぜかVC++ならcatchできるんです
348デフォルトの名無しさん:04/10/07 22:45:30
>>347
char*ではcatch出来ないのが正しい。const char*ではcatchできる。
ISO/IEC 14882:1998 15.1.3
The temporary object created for a throwexpression that is
a string literal is never of type char* or wchar_t*;that is,
the special conversions for string literals from the types
“array of const char” and “array ofconst wchar_t” to the types
“pointer to char” and “pointer to wchar_t”, respectively,
are never applied to a throwexpression.
349デフォルトの名無しさん:04/10/07 22:51:54
>>347
VC6とか言ったら死刑
350デフォルトの名無しさん:04/10/07 22:53:32
>>348
英語本当に読んだ?
351デフォルトの名無しさん:04/10/07 22:53:35
>>349
vc7.1でも死刑?ガクガクブルブル。
352デフォルトの名無しさん:04/10/07 22:56:04
>>350
「const char[N]→char*の変換は、throwに対しては適用されない。」
ということでしょ?
353悩める初心者:04/10/07 22:57:00
328さん、

-z muldefsでやってみたら、コンパイル通過しました!
リンクの詳細しらべてみましたけど、ちゃんと自前の関数読んでるようです。
ほんとありがとうございます。

#まだまだ勉強不足ですね。。。
354デフォルトの名無しさん:04/10/07 23:14:14
試しに
catch(char *e){ cout << "GA!" << e << endl;}
catch(const char *e){ cout << "ga!" << e << endl;}
としてみると、
VC++では "GA!nullpo!"
GCCでは"ga!nullpo!"
となってしまう
355デフォルトの名無しさん:04/10/07 23:21:43
catch(const char *e){ cout << "ga!" << e << endl;}
catch(char *e){ cout << "GA!" << e << endl;}

とやったらVC++でも"ga!nullpo!"と吐くんだろうか
356デフォルトの名無しさん:04/10/07 23:24:28
だから規格の>>348を読めって。
『char*ではcatch出来ないのが正しい。const char*ではcatchできる。』
だからこの場合VC++は間違い。GCCが正しい。
Microsoftの中の人自体が誤って理解してるんじゃないのか?
http://www.microsoft.com/japan/msdn/library/ja/jpdndeepc/htm/deep061799.asp
357デフォルトの名無しさん:04/10/07 23:25:02
>>355
今度はコンパイルできなくなった
test.cc(9) : error C2312: 'char *' : is caught by 'const char *' on line 8
358357:04/10/07 23:26:34

バージョンによる。
359デフォルトの名無しさん:04/10/07 23:27:09
2005 でも
error C2312: 'char *' : is caught by 'const char *'
360デフォルトの名無しさん:04/10/07 23:28:03
VC++ Toolkit 2003
error C2312: 'char *' : is caught by 'const char *' on line 10
やっぱりコンパイラを作るときにMicrosoftが規格を勘違いしてる。
361デフォルトの名無しさん:04/10/07 23:30:16
>>359
やられた。
つーか、発揮し言ってどうでもいい問題なんだけど。
362デフォルトの名無しさん:04/10/07 23:33:52
bccだと順b

あ、誰も聞いてない
363デフォルトの名無しさん:04/10/07 23:33:58
>>361
だな
364デフォルトの名無しさん:04/10/07 23:34:54
>>362
その先を知りたい。もしかして順番によって結果が変わる?
365デフォルトの名無しさん:04/10/07 23:35:43
>>361,363
よくないだろう、正しいはずのコードがコンパイルすらされないんだから。
366デフォルトの名無しさん:04/10/07 23:37:05
>>365
キチガイだね
367デフォルトの名無しさん:04/10/07 23:38:25
いや、char*がconst char*に先に捕まるのは当然だし、
コンパイルすらされないのはエラーレベルの設定の話でしょう。
368デフォルトの名無しさん:04/10/07 23:38:41
>>365
そもそも正しいはずのコードとはなんですか?
369デフォルトの名無しさん:04/10/07 23:45:26
お?なんか哲学的になってきたね
370デフォルトの名無しさん:04/10/07 23:50:23
char* p;
p = "literal";

こいつにVC++7.1もg++も文句言ってくれません。
仕様的には>>344なんですか?
371デフォルトの名無しさん:04/10/07 23:54:51
>>370
あまりに多くなされる書き方なので文句を言わないようになってる
372デフォルトの名無しさん:04/10/07 23:57:33
>>370
ISO/IEC 14882:1998 4.2 Array-to-pointer conversion -2による。
373デフォルトの名無しさん:04/10/08 00:03:32
#include <iostream>
int main(){
try{
throw "nullpo!";
}
catch(const char *e)
{
std::cout << "ga!" << e << std::endl;
}
return 0;
}
これならVC++は文句言わずにコンパイルするが…
char*をconst char*に変換してるだけなのではないか…
374デフォルトの名無しさん:04/10/08 00:03:59
>>366
365 は間違ったことを言っていないぞ?
例外が捕獲できるかどうかは、翻訳ではなく実行の問題。
375デフォルトの名無しさん:04/10/08 00:04:41
オプションでいいからエラーにしてほしいな・・・。
どっちにしろそんなコードまともに動かないし。
376デフォルトの名無しさん:04/10/08 00:08:47
>>374
残念ながら、確実な未来というのはあるのだよ。
377デフォルトの名無しさん:04/10/08 00:18:15
規格的にどうかはともかく、
>>370が規格的に正しいのなら、
>>354はVC++のほうが自然に感じる。
困った規格だ。
378デフォルトの名無しさん:04/10/08 00:20:15
禿はノーセンスだからね
379デフォルトの名無しさん:04/10/08 00:20:59
>>376
基準が明確化されていない洞察をしてはならないのが基本。
コピーコンストラクタが排除できても private ならはじくように。
380331:04/10/08 00:23:01
>>333>>346
非常に参考になります
ありがとうございました
381デフォルトの名無しさん:04/10/08 00:25:55
catch(const char*)にchar*が捕まるのって明確化されてないの?
382デフォルトの名無しさん:04/10/08 00:55:57
>>377
>>370は規格的に正しくないよ
383デフォルトの名無しさん:04/10/08 00:57:53
>>382
「文字列リテラルはchar*に代入できる。」
プログラミング言語C++第3版 5.2.2より
384デフォルトの名無しさん:04/10/08 00:58:40
>>383
マジすか…
失礼しました
385デフォルトの名無しさん:04/10/08 01:11:13
文字列定数に書き込めたとしても、strchrで番兵法を使う
ときぐらいしかメリットが感じられなかった。バグ出しやすいし。
実用上は必ずコンパイルオプションで書き込めなくしてしまう。
386デフォルトの名無しさん:04/10/08 01:13:13
>>385
「文字列リテラルはchar*に代入できる。…(中略)…しかし、
このようなポインタを介して文字列リテラルを変更しようと
すると、エラーになる。」
プログラミング言語C++第3版 5.2.2より
387デフォルトの名無しさん:04/10/08 01:19:30
>>386
禿本いい加減だなw
388デフォルトの名無しさん:04/10/08 01:20:15
いや、厳密さは求めていないが・・・
389デフォルトの名無しさん:04/10/08 01:22:53
いや、Cとの互換を保つため…
390デフォルトの名無しさん:04/10/08 01:27:10
>>387
ISO/IEC 14882:1998 2.13.4 String literals -2
"The effect of attempting to modify a string literal is undefined."
391デフォルトの名無しさん:04/10/08 01:32:25
>>390
>undefined
392デフォルトの名無しさん:04/10/08 01:36:04
>>380
>d.hで 定義されていない基底クラスAが使われています。
だってこのままじゃAがどういう型か判らないもん。c.hでストップかけてんじゃん。
だから、
// c.h ///////////////////
class D;
class C{ D* d; };
にすればいいだけなのでは?
まっ。見てねーんだろーけど。
393超絶Rubyhakka−:04/10/08 01:37:51
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
394デフォルトの名無しさん:04/10/08 02:06:38
395デフォルトの名無しさん:04/10/08 02:08:36
class Base1 { protected : int x; };
class Base2 { protected : int x; };
class Foo {
  public:
  Foo(int x) : x(x);
}
曖昧だって言われた。(涙
不可能なのか・・。
396デフォルトの名無しさん:04/10/08 02:09:13
>>395
Base? にコンストラクタがない以上(ry
397デフォルトの名無しさん:04/10/08 02:14:44
>>395
>>396の前にFooにメンバー変数xがない。以上。
398デフォルトの名無しさん:04/10/08 02:18:35
>>397
それを言うなら曖昧(ry
399デフォルトの名無しさん:04/10/08 02:33:56
>>395
貴方は何かにつけて過剰な省略をする傾向が強いようですね。たとえば本を読むときに一度の何十ページもめくってみたり、
タバコを吸うとき一度に5本ぐらいくわえていたり、お好み焼きにはキャベツしか入れなかったり、食事のとき箸を一本しか持たなかったり、
してしまうタイプではないでしょうか?表現に不十分な部分がないか、チェックお願いします。
400395:04/10/08 02:52:51
>>397
確かにそうでした。書き直します。

class Base1 { protected : int x; };
class Base2 { protected : int x; };
class Foo ; public Base1, Base2 {
  public:
  Foo(int x) : x(x);
}

で、これが曖昧だってのは、納得。
2つの派生元クラスの、それぞれの x を初期化する方法としては、
各派生元クラス (Base1, Base2) に、自クラスのメンバ x を初期化するコンストラクタをそれぞれ用意して、
それら2つのコンストラクタを Foo のコンストラクタから呼んでやる、ってことね。
401デフォルトの名無しさん:04/10/08 03:05:43
派生元のクラスがひとつでも同じ結果かと思うんですが…
402デフォルトの名無しさん:04/10/08 03:08:03
全角空白はいいとしても、スペルミスでエラーが出るソースを張るなよ
class Foo : public Base1, Base2 {
  public:
  Foo(int x) : x(x){};
};
そもそも曖昧以前に、基底クラスのメンバを直接初期化できん。
403デフォルトの名無しさん:04/10/08 03:08:20
-class Foo ; public Base1, Base2 {
+class Foo : public Base1, Base2 {

-Foo(int x) : x(x);
+Foo(int x) : x(x){}

全角もウザイ
404デフォルトの名無しさん:04/10/08 03:09:57
-class Foo : public Base1, Base2 {
+class Foo : public Base1, /*private*/ Base2 {
405デフォルトの名無しさん:04/10/08 03:11:59
>>400
最後のセミコロン忘れてるし・・・
406デフォルトの名無しさん:04/10/08 03:22:14
>>400
要するにダメダメ。
407デフォルトの名無しさん:04/10/08 12:28:37
全角はしょうがないだろ
この程度のちゃちなコードなら、実行よりパッと見の可読性重視でOK

2chブラウザ全盛の昨今、&nbsp;とかも厳しいのが多いしなぁ
ちと試してみるか…

    Hoge* p_hoge = new Hoge;
408407:04/10/08 12:29:42
うん、やっぱりコピペするとついて来ちゃうな…
409デフォルトの名無しさん:04/10/08 14:28:01
質問させていただきます。
たびたび関数ポインタテーブルを使って処理してきたのですが、今度
クラスのメソッドでやろうと思ってプログラムを書いてみたのですが、

'int (__thiscall クラス名::*)(void)' から 'int (__cdecl *)(void)' に変換することはできません

とエラーがでてしまい、ダメなようです。
メソッドポインタでGoogleするとC++について語ってるところがさっぱり見当たりませんでした。
C++ではメソッドポインタを取得し、利用することはできないのでしょうか?
410デフォルトの名無しさん:04/10/08 14:33:16
まともな本読めばメンバ関数ポインタの使い方ぐらい載ってる。
411デフォルトの名無しさん:04/10/08 14:39:38
あ、なるほど。
メソッドではなくメンバ関数と呼ぶのですね。
メンバ関数ポインタでぐぐったら、色々出たのでがんばれそうです。
ありがとうございました^^
412デフォルトの名無しさん:04/10/10 15:15:22
regexって何の略?
413デフォルトの名無しさん:04/10/10 15:19:30
regular expression トカ
414デフォルトの名無しさん:04/10/10 19:06:11
以下のプログラムで、コンソールにwcoutで表示したい文字が表示されません。
stringとcoutを使ったら表示されるのですが・・・
何が悪いのでしょうか・・・・・・・・・・・・・・・・


#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

#include <conio.h>

int main(int argc, char* argv[])
{

wstring wstr;
wstr = L"こんにちわ世界!";
wcout << wstr << endl;

getch();

return 0;
}

415デフォルトの名無しさん:04/10/10 19:08:42
ロケールあってる?
あともしVC6だったら標準ライブラリがバグってるからまともに使えないよ。(.NETは未確認)
416>>414:04/10/10 19:22:07
>>415
ΩΩΩナ...ナンダッテー

VC6です。バグなのですね・・・
417デフォルトの名無しさん:04/10/10 19:44:16
>>416
std::locale::global(std::locale("japanese"));
C++は糞だとまたもや証明された!
419デフォルトの名無しさん:04/10/10 20:51:43
C++で2重のforループを使い実行結果が以下のようになるように
したいのですが・・・誰か教えて下さい。
A
AB
ABC
ABCD
ABCDE
420デフォルトの名無しさん:04/10/10 20:56:23
>>419
#include <iostream>

int
main()
{
    char str[] = "ABCDE";

    for( int i = 0; i < 5; ++i )
    {
        for( int j = 0; j <= i; ++j )
        {
            std::cout << str[ j ];
        }
        std::cout << std::endl;
    }

    return 0;
}
421デフォルトの名無しさん:04/10/10 20:57:36
>>419
for(;;){
for(int i=1;i<=5;i++)
printf("%.*s\n",i,"ABCDE");
break;
}
422デフォルトの名無しさん:04/10/10 21:02:34
ありがとうございました☆
423デフォルトの名無しさん:04/10/10 21:08:59
>>419-422
ここはいつの間に宿題請負のスレになったんだ?
しかも>>420間違ってるし。
424デフォルトの名無しさん:04/10/10 21:24:28
class mycls{
public:
static int x;
};
int main(){
mycls c;
c.x = 2;
return 0;
}
とするとgccのコンパイラに以下のように怒られるのですがなぜでしょうか.
hoge/hoge/hoge.o(.text$_...(略)...) undefined reference to mycls::x
collect2: ld returned 1 exit status
425デフォルトの名無しさん:04/10/10 21:26:08
int mycls::x;
426デフォルトの名無しさん:04/10/10 21:31:25
>>424
undefined reference to mycls::x
これくらい読めるようになっとけ。
427424:04/10/10 21:35:02
それをどこで宣言するのでしょうか?
myclsのstatic int x;がint mycls::xじゃないんでしょうか?
428デフォルトの名無しさん:04/10/10 21:36:55
>>424
>undefined reference to mycls::x
mycls::xへの参照が未定義てす。
未定義については
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
429デフォルトの名無しさん:04/10/10 21:38:01
>>427
まずは宣言と定義の意味をきちんと調べること。

myclsのstatic int x; は宣言。これとは別に定義が要る。
これが定義になっちゃったら、このクラスを複数のファイルで使えないだろ。
430デフォルトの名無しさん:04/10/10 21:38:38
>>428 最悪
431デフォルトの名無しさん:04/10/10 21:46:13
要はこんな感じだ。
mycls.h
────────
class mycls{
public:
static int x;
};

mycls.cpp
────────
int mycls::x;
432デフォルトの名無しさん:04/10/10 21:53:07
>>425-431
ありがとうございました.
手元の本を読んで定義と宣言の違いを再勉強してきました.
static指定するからにはオブジェクトの生成と同時に変数を定義してしまっては
意味がないということですね.

ところで,int mycls::xをmain()関数内で宣言すると同じエラーが発生するのは
なぜでしょうか?
433432:04/10/10 21:54:05
>>432
正確には定義ですね(訂正
434デフォルトの名無しさん:04/10/10 22:05:17
>>432
いや、あんた理解できてないよ。安心して出直せ。

> int mycls::xをmain()関数内で宣言すると同じエラーが発生
まともなコンパイラならそんな糞な挙動しないと思うんだが。
本当だと言いたいんなら、コンパイラとソースを貼ってみな。
435デフォルトの名無しさん:04/10/10 22:08:41
>>432
mycls a;

struct hoge
{
int y;
hoge() { y = a.x; }
};

hoge b;

main()
{
int mycls::x = 1234;
std::cout << b.y;
}
436デフォルトの名無しさん:04/10/10 22:10:04
>>434
> まともなコンパイラならそんな糞な挙動しないと思うんだが。
グローバルなスコープを持つクラス変数を、関数内で定義はできないと思うが。
こういうコードでしょ?

int main()
{
  int mycls::x;
}

C のグローバル変数もそうだが、グローバルスコープを持つものは関数の
外で定義しないと。

int mycls::x;
int main() {}
437デフォルトの名無しさん:04/10/10 22:13:14
>>434
ハズイヤツ。
438432:04/10/10 22:13:32
>>436
そういうことでしたか.了解しました.
長々とありがとうございました.

# >>432 同じエラーが発生する
というのは間違いでした.まぎらわしいことしてすいません.
>>436 のようなコードで躓いていました.
439デフォルトの名無しさん:04/10/10 23:36:25
fstreamからstd::string strに一行を読み込みたいのですが
getline()は何故か知りませんがstd::stringで受け取れません。
そしてfstream >> str;とすると一行読み込みになりません。
>>で\nまで読み込む設定があるのかと探してみましたが見つかりませんでした。
char[]の一時変数にとりあえず読み込むしかないのでしょうか?
440デフォルトの名無しさん:04/10/10 23:40:22
>>439
std::getline
441デフォルトの名無しさん:04/10/10 23:42:15
>>439
std::getlineを調べてみてください。
442デフォルトの名無しさん:04/10/10 23:54:30
C++ で Java の final にあたるものってありますか?
443439:04/10/11 00:02:21
<string>にて発見しました。どうもです。
中身は私には解読不可能でしたが。。。
444デフォルトの名無しさん:04/10/11 00:04:03
>>442
何をしたいのかもう少し具体的に書いた方が良い
それによって答えが変わってくると思う
445デフォルトの名無しさん:04/10/11 00:32:05
継承を制限したいんだろうとESPを駆使してみる
446デフォルトの名無しさん:04/10/11 00:40:00
コンストラクタをprivateにすれば?
447デフォルトの名無しさん:04/10/11 00:59:10
>>446
先生、コンストラクタをprivateにしてもメンバ関数の中のローカルクラスで継承できてしまいました。
448デフォルトの名無しさん:04/10/11 01:12:06
>>442
thisを見て、自分じゃなかったらエラー吐いて死ぬようにすりゃーいいかも。
449デフォルトの名無しさん:04/10/11 01:14:10
ん名門無理
450448:04/10/11 01:14:12
コンパイル時の制限じゃないと意味無いか
451439:04/10/11 01:16:11
続けての質問ですがお願いします。
一行読み込んでその先頭位置と一緒に出力するプログラムです。
\r\n区切りのテキストだと上手くいくのですが\n区切りのテキストだと無限loopに陥ってしまいます。

while ( !fs.eof() ) {
  std::streampos pos = fs.tellg();
  std::getline(fs,str);
  std::cout << pos << ":" << str << std::endl;
}
tellg()を実効しなければ上手く動作しますが、何がいけないのでしょうか?
環境はwindows2000とVC6SP6です。
452デフォルトの名無しさん:04/10/11 01:36:41
>>448
どの関数でチェックを入れる?
まさか全ての関数に入れるとか?

ちなみにコンストラクタじゃムリだよ
453439:04/10/11 01:41:06
tellg bug VC6 で多数引っかかりましたorz
454デフォルトの名無しさん:04/10/11 01:47:33
>>453
もう解決しちゃったみたいだけど、一応。
Visual C++ Toolkit 2003では解決してたよ。
455デフォルトの名無しさん:04/10/11 02:55:05
グローバルスコープにあるポインタを使うのと
ポインタをコピーして同じオブジェクトを指すポインタを複数
使うのでは処理速度とか違うの?
スマートポインタ云々は抜きにして。
456デフォルトの名無しさん:04/10/11 02:58:36
>>455
前者と後者の違いをソースで示してください。
457デフォルトの名無しさん:04/10/11 03:10:44
前者は普通のグローバル変数(ポインタ)
後者はあるクラスのメンバであるポインタを別のクラスの
メンバにコピー(別のクラスのメンバの方はコピー用に作成)
//前者
class Global
{
public:
static LPDATA pData; //コピーは行わない
}

//後者
class A
{
public:
LPDATA pData; //こっちでオブジェクト作成
}
class B
{
public:
LPDATA pCopyData;
}
B::pCopyData = pData; //コピーして使いまわし
458デフォルトの名無しさん:04/10/11 09:41:35
>>457
メンバ変数は遅くなる。
const 修飾すれば速くなることがある。
どっちもループカウンタにでも使わない限り誤差の範囲。
459デフォルトの名無しさん:04/10/11 11:58:03
>>455
そりゃグローバルの方が速いだろ
コンパイラによるがグローバルは最適化がかかりにくかったりするが
1つで済むものを複数で管理する必要はない

ただし「本当に1つで済むんだな?」と、自分に小一時間問いただしてみることを薦める
後者を使うことになるケースは多いから
460デフォルトの名無しさん:04/10/11 11:58:59
メンバ変数はグローバル変数より更に最適化がかかりにくいよ
461デフォルトの名無しさん:04/10/11 12:00:39
そうでもないよ
462デフォルトの名無しさん:04/10/11 12:14:16
ここでも見たのか?
ここのは多分使ってるコンパイラが古いんだろ。
http://www.emit.jp/prog/prog_opt0.html
463デフォルトの名無しさん:04/10/11 12:24:21
自分の考えと違う事実をコンパイラが古いからで片付けようとする態度は
相手が携わっている分野を侮辱していることがあるから気を付けた方がいいぞ
もっとも煽り目的ならこの限りではないが
464デフォルトの名無しさん:04/10/11 12:32:51
VC++7.1 -O2
最適化前 0.991秒
最適化その 1.001秒
最適化その2 0.991秒
最適化その3 0.991秒

自分で試しもしないで個人サイトの情報を真に受けるバカはこれだから困るね。
465デフォルトの名無しさん:04/10/11 12:35:30
なるほどVC使いだったかw
466デフォルトの名無しさん:04/10/11 12:39:13
メンバ変数の最適化もかからないようなコンパイラよりはVC++の方がマシだろ
467デフォルトの名無しさん:04/10/11 12:43:24
あ? メンバ変数の最適化?? 何の話だ
468デフォルトの名無しさん:04/10/11 12:46:04
以下池沼だか上のサイトの盲信者だかよくわからん香具師は放置で
469デフォルトの名無しさん:04/10/11 12:52:37
最近もどっかのスレでfomit-frame-pointer論争があったし、
特に最適化関連の話は、Web上の情報が本当かどうか自分で確かめた方がイイね。
470デフォルトの名無しさん:04/10/11 13:16:08
自分で試した結果が絶対正しいと思い込んでる馬鹿がいるようなので補足しておくと、
そのサイトのサンプルコードがだめだめ。

VC++7.1 -O2 で実行すると、ループが展開されてしまって、

for(int i = 0; i < 100000; i++) test.SetValue(i);
の行が
for(int i = 0; i < 100000; i++);
test.SetValue(99999);
のように最適化されてしまう。
これではまともな速度比較が出来ない。
test.SetValue(int);を __declspec(noinline) 指定する必要がある。

次に、
>メンバ変数の値が書き換えられ、ループの条件が変わるかもしれない
と言っているにもかかわらず、ループカウンタ用メンバ変数が書き換えられていないことが自明なループをまわしている。
これではよほど馬鹿なコンパイラで無い限り最適化できてしまう。
m_pBuffer[m_nCounter] = n;
の行をメンバ変数にくくりだす必要がある。
void CTest::SetBuffer( int* pBuffer, int nCounter, int n );
もちろん __declspec(noinline) 指定することを忘れない。

んで、その結果。
最適化前:9.141秒
最適化後:4.860秒

倍近く速くなった。
471470:04/10/11 13:18:10
- の行をメンバ変数にくくりだす必要がある。
+ の行をメンバ関数にくくりだす必要がある。
472デフォルトの名無しさん:04/10/11 13:21:59
>>464
どんな最適化がかかってその結果になるのか教えてください。
473デフォルトの名無しさん:04/10/11 13:25:18
> ループカウンタ用メンバ変数が書き換えられていないことが自明

m_pBuffer = &m_nCounter;
というケースをコンパイラは考慮しなくていいのか?
474デフォルトの名無しさん:04/10/11 13:32:19
__declspec(noinline) =関数内部の挙動が分からないわけで、
コンパイラどころか、人手でも勝手に最適化(というか、省略)してはダメだと思うんだが……。
475デフォルトの名無しさん:04/10/11 13:37:22
471訂正。
もうちょい調べてみたらSetValueの呼び出し自体が無くなってた。
これじゃ「まともな速度比較が出来ない」どころか、「まったく比較できない」

>>473
すまん。問題なかった。
# さっき試したときは同じ速度になってしまったんだが・・・。
476デフォルトの名無しさん:04/10/11 13:40:35
結局のところ小手先の最適化なんぞコンパイラにかかれば無意味ってことじゃないか。
どうやってコンパイラの最適化を抑止するかって話になってるぞ。
477デフォルトの名無しさん:04/10/11 13:47:49
int main(){
wstring w = L"あいうえお";

printf("w is %s", wstring.c_str());

}

以上のプログラムを実行すると、めちゃくちゃな文字が表示されます。
これはおそらくprintfがマルチバイト文字(Shift-Jis)に対応したものであると考えられますが、
printfに該当するようなワード文字に対応する関数はないのでしょうか?
478デフォルトの名無しさん:04/10/11 13:50:07
>>417
ロケールって具体的には何のためにあるのでしょうか?

wstringを使うには、その国の言語を指定しないと使えないってこと?
479デフォルトの名無しさん:04/10/11 13:50:41
>>476
それは飛躍しすぎ。
結論は、>>462のリンク先で最後に書いてある考察が適切。
480471:04/10/11 13:50:45
>>473
いや、やっぱり必要だった。
メンバ関数にくくりださないと、最適化後、のやつがrep stosに最適化されてしまって、比較にならない。

>>474,476
事態を混乱させてすまん。m(_ _ )m

SetValue を noinline 指定しないと、ループが消えて rep stos になってしまう。
実際のコードで、これをしてくれればハッピーだが、
これはベンチ用のもっともシンプルなコードで、現実的にはそう期待通りには行かないだろ?

俺らが必要なのは、ブロックフィルの速度ではなくて、メンバ変数のアクセス速度だから
481デフォルトの名無しさん:04/10/11 14:09:25
>>477
%lsかwprintfとか。
ロケールも設定しないと駄目かも。
482デフォルトの名無しさん:04/10/11 14:13:06
C++歯糞なのですか?
483デフォルトの名無しさん:04/10/11 14:57:51
>>481
ありがとうございます!

int main(int argc, char* argv[])
{
locale::global(locale("japanese")); // ★


wstring wstr;
wstr = L"あいうえお";
wcout << wstr << endl;

getch();

return 0;
}

以上のプログラムコードで★の部分をコメントにすると、コンソールに何も表示されないのは、
なんででしょうか?
484デフォルトの名無しさん:04/10/11 16:36:25
485デフォルトの名無しさん:04/10/11 18:06:54
sscanfをistringstreamに置き換えたいんですが、
下記のような場合はどうすればいいですか?

string s = "0:1:2";
sscanf(s.c_str(), "%d:%d:%d", &n, &n1, &n2);


下記のように、charを挟むというのが考えられますが、
':'に限ることは出来ないのでしょうか。

char c, c1;
istringstream(s) >> n >> c >> n1 >> c1 >> n2;
486デフォルトの名無しさん:04/10/11 18:09:38
>>485
sscanf()でいいじゃん。
487デフォルトの名無しさん:04/10/11 18:46:01
ファイルのオープン,クローズについて意見をください☆

int main(){

  class Log log();

  //ループ
  for(int i=0;i<100;i++){
    /*
    処理
    */
    log.saveLog(i);
   }

  ~log();
  return 0;
}


案1
コンストラクターでfopen(),ディストラクターでfclose

案2
saveLog()で毎回fopen(),fclose

どちらでもいい気がするのですが,気になります!!
クラスの設計としてはどちらが優秀でしょうか?
488デフォルトの名無しさん:04/10/11 18:46:49
クラスの設計としてはfstream使った方が優秀です。
489デフォルトの名無しさん:04/10/11 18:52:01
文字の幅(setw)や精度(setprecision)を使うとソースが読みにくくなりませんか?
やはりfprintf(pfstr,"%15s,%15.5f","Great Class",someDoubleValue)の方が簡単で(^o^)

490デフォルトの名無しさん:04/10/11 18:54:03
fstreamならデストラクタで勝手に閉じてくれるのでfstreamの方が優秀です。
491デフォルトの名無しさん:04/10/11 19:06:53
>>487
そのログが、プログラム終了時まで必要のないものならどちらでもいいが、
作業終了時には書き込まれていることを保証しないといけない性質のものなら
毎回オープンクローズした方がいい。
で、streamよりもFILEに慣れているならそちらでもいいと思う。
492デフォルトの名無しさん:04/10/11 19:15:20
以下のプログラムコードで★の部分をコメントにすると、コンソールに何も表示されないのは、
なんででしょうか?


int main(int argc, char* argv[])
{
locale::global(locale("japanese")); // ★


wstring wstr;
wstr = L"あいうえお";
wcout << wstr << endl;

getch();

return 0;
}

493デフォルトの名無しさん:04/10/11 19:17:29
>>487です
488-491
ご意見ありがとうございましたm(__)m

通常はfstreamを使うのですが,今回はdouble型を多用するため
FILEで,saveLogで毎回open,closeにします
これで私の優秀なクラスがさらに優秀になります☆☆
494デフォルトの名無しさん:04/10/11 19:26:46
>>492
コンパイラーは g++ , vc7.1, vc7.0, bc++ or vc6 この中のどれ? 
495デフォルトの名無しさん:04/10/11 19:28:23
デストラクタのcloseに任せると、クローズの失敗が美味く処理できないぞ。
496デフォルトの名無しさん:04/10/11 19:29:44
クローズなんざ失敗しようがどうでもいい
497デフォルトの名無しさん:04/10/11 19:33:04
>>496
クローズの失敗だけならいいが、fclose()はバッファのフラッシュもするから要注意。
なんてことは当然承知の上で言ってるんだよね?
498デフォルトの名無しさん:04/10/11 19:42:49
fopenは失敗しても,fcloseが失敗するとは思えませんが,,,
499デフォルトの名無しさん:04/10/11 19:46:00
fcloseの戻り値使ってるプログラム見たこと無いな・・・
500デフォルトの名無しさん:04/10/11 19:48:20
仮に失敗したとして、ひ弱な人間どもにはどうすることもできまい。
501>>492:04/10/11 20:01:37
>>494
vc6です!
502デフォルトの名無しさん:04/10/11 20:08:42
>>498
リムーバブルディスクでメディア引き抜かれた場合とか、あとはメディア
不良で一部セクタに書き込めない場合。たいてい OS やライブラリが
バッファリングしてるから fwrite() は成功しちゃう。
503デフォルトの名無しさん:04/10/11 20:13:47
おいおい、大丈夫かよお前ら。書き込み後のfclose()の戻り値チェックしないなんて有り得ねぇよ。
504デフォルトの名無しさん:04/10/11 20:46:35
やべー
505デフォルトの名無しさん:04/10/11 20:48:09
チェックするヤツの方がすくねぇよ
506デフォルトの名無しさん:04/10/11 20:58:31
>>505
まぁ、用途によるよな。

別にファイル壊れてても構わん状況ならチェックしないだろうし、
定期バックアップを行うアプリを書いてるならチェックしないのは
論外。

俺もあまりチェックしてない。
507デフォルトの名無しさん:04/10/11 20:59:21
わざわざ書き込み後のfclose()の戻り値チェックするなんて有り得ねぇよ
508デフォルトの名無しさん:04/10/11 21:00:20
>>503が煽ってるだけなのか、まともなPGならチェックしてるのかどっちだ?
509デフォルトの名無しさん:04/10/11 21:02:08
これだけの情報がそろってチェックしないやつの気が知れない。
今まで自分の書いたノーチェックなコードを正当化したいだけなんだろ。
いいんだよ、これから気をつければ。
510デフォルトの名無しさん:04/10/11 21:02:15
fstreamは閉じるのに失敗したときどうなるの?
いや、C++スレだしさ、いちおう。
511デフォルトの名無しさん:04/10/11 21:08:19
>>510
closeに戻り値有るよ。
ついでに badbit だか failbit だか立つよ。
512デフォルトの名無しさん:04/10/11 21:10:05
closeに失敗したらどうすりゃいいですか
513デフォルトの名無しさん:04/10/11 21:16:23
>>511
でも普通はデストラクタで勝手に閉じてもらうわけで
514デフォルトの名無しさん:04/10/11 21:23:34
エラーコードを見てから考えろ。
515デフォルトの名無しさん:04/10/11 21:24:05
fcloseの戻り値をチェックすればそれで書き込みが保証されると思ってる
バカがいるスレはここですか?
516デフォルトの名無しさん:04/10/11 21:25:09
>>513
普通?エラーを検知できない方法がどうして普通だと言い切れるのかね?
517デフォルトの名無しさん:04/10/11 21:26:12
>>515 エスパーキター
518デフォルトの名無しさん:04/10/11 21:26:36
エラーを検知できることの大切さを知らない>>515は学生。
519デフォルトの名無しさん:04/10/11 21:27:14
普通もう一回読んでベリファイ
520デフォルトの名無しさん:04/10/11 21:29:23
>>519
一回で安心するやつは素人
521デフォルトの名無しさん:04/10/11 21:29:27
だれだこんなに雑魚が群がる餌撒いたやつは
522デフォルトの名無しさん:04/10/11 21:30:26
ネタかマジか解からなくなってきたのでageときますね
523495:04/10/11 21:31:20
俺だよ。俺オレ
524デフォルトの名無しさん:04/10/11 21:34:54
>>523
誰だよ、お前。
おれだよ
525デフォルトの名無しさん:04/10/11 21:36:48
とりあえず示談金の前払いで500万円振り込んでおいてください
526デフォルトの名無しさん:04/10/11 21:39:12
オレはチェックしねーよ。チェックしても、その後どーしよーもねぇじゃん。
527デフォルトの名無しさん:04/10/11 21:39:39
エラーメッセージくらい出せるだろ
528デフォルトの名無しさん:04/10/11 21:39:53
そこまで厳密にやりたいなら、CRTなんか使わずシステムコール直に発行しろよ。
529デフォルトの名無しさん:04/10/11 21:50:36
書き込んだフリしてエラーが出てても黙ってるアプリはいやだな・・・
530デフォルトの名無しさん:04/10/11 21:54:46
書き込んだフリしてエラーが出てても黙ってるのがCRT
531デフォルトの名無しさん:04/10/11 21:57:03
>>530
え?どういうこと?
532デフォルトの名無しさん:04/10/11 22:07:42
Cathode Ray Tube だったら輝点の一つや二つ欠けててもmおndawe
533デフォルトの名無しさん:04/10/11 23:11:23
おい、Cathode Ray Tube の輝点をヴェリファイできんぞ
534>>492:04/10/11 23:11:34
誰か答えてください!
環境はVC6です。
535デフォルトの名無しさん:04/10/11 23:21:31
>>534
ユニコードを使用するようにオプション変更してみると
ロケール設定しなくても動くかもよ。
ただの勘だけど。
536デフォルトの名無しさん:04/10/11 23:22:27
うごかないし、そういうもんだ。
通常のロケールはjapaneseではなくCだし
537デフォルトの名無しさん:04/10/11 23:28:00
>>536
通常のロケールがCだというのはわかりましたが、
なんで、それで表示されないんですか?

そもそもロケールってなんあんでしょうか?
538デフォルトの名無しさん:04/10/11 23:28:42
ロケールって、わざわざワイド文字列の有効性をチェックするの?
例えば、Windowsだと WriteConsoleW() にそのまま流し込めば表示されると思うんだが、
ロケールに合わない文字を取り除く処理が入るってこと?
539デフォルトの名無しさん:04/10/11 23:30:43
>>637
お前無能の極みだな
少しは自分で調べろよ
540デフォルトの名無しさん:04/10/11 23:31:50
×>>637
>>537
541デフォルトの名無しさん:04/10/11 23:32:09
>>537
そういう仕様だから。VC6は。
542sage:04/10/11 23:32:40
>>539
ワラタ
543デフォルトの名無しさん:04/10/11 23:34:02
>>539
体をはったギャグですね(プッゲラ
544デフォルトの名無しさん:04/10/11 23:35:24
WriteConsoleWはすべてのプラットフォームでサポートされているんだ。
545デフォルトの名無しさん:04/10/11 23:46:06
streamに対してprintf書式指定使いたかったらboost使えばええやん。
546デフォルトの名無しさん:04/10/11 23:50:06
>>545
C++ではprintfは全部cout<<で置き換えるべきなのですか?
547デフォルトの名無しさん:04/10/11 23:51:29
そうすべきだね
548デフォルトの名無しさん:04/10/11 23:58:06
でもscanfはcinで置き換えられないhホ
549デフォルトの名無しさん:04/10/12 00:04:40
>>548
自前でどうにかしたほうがscanfよりまだましだと思うが。
550デフォルトの名無しさん:04/10/12 00:06:30
printf と sprintf の関係みたいに
文字列も stream と同じ様に扱うにはどうすればいいですか?
551デフォルトの名無しさん:04/10/12 00:07:44
>>550
stringstream
552デフォルトの名無しさん:04/10/12 00:07:54
>546
どうでもいいと思う
553545:04/10/12 00:09:03
いや、その、ごめん。ネタだったんだ。そんなに食いつかないで。
554546:04/10/12 00:09:47
あわわ。>>553の名前は間違いです。546です。
555デフォルトの名無しさん:04/10/12 00:20:20
>>549
自前でscanf作るのと何か違うのか?
556デフォルトの名無しさん:04/10/12 00:22:16
C++でのscanfのような危険どころを教えてください。
557デフォルトの名無しさん:04/10/12 00:25:29
scanf
558デフォルトの名無しさん:04/10/12 00:29:29
型安全じゃない事とか
559デフォルトの名無しさん:04/10/12 00:30:48
型クルクルパーな奴が使う限り同じ
560デフォルトの名無しさん:04/10/12 00:31:42
低脳のフリをすることを、自分が本当に低脳なことの隠れ蓑にする害獣ども
561デフォルトの名無しさん:04/10/12 00:40:24
Rubysaikyou !!!!!!!!!!!!!!!!!!!!!!
562デフォルトの名無しさん:04/10/12 00:48:52
正直、C++に型安全なんか期待していない
563デフォルトの名無しさん:04/10/12 00:54:55
C++ で無名関数がサポートされるのはいつになりますか?
564デフォルトの名無しさん:04/10/12 00:59:02
明日
565デフォルトの名無しさん:04/10/12 01:10:47
明日という名の永遠
566デフォルトの名無しさん:04/10/12 01:17:34
>>563
boost::lambdaでも使っとけ
567デフォルトの名無しさん:04/10/12 01:23:25
>>566
重い
568デフォルトの名無しさん:04/10/12 01:24:34
>>567
そうでもない
569デフォルトの名無しさん:04/10/12 01:25:18
>>567 コンパイル時間の話だよな?
570デフォルトの名無しさん:04/10/12 01:25:46
boostは標準ではないのでまだ使いたくない。
→自分で実装するか。
571デフォルトの名無しさん:04/10/12 01:27:02
→自分で実装してドツボ
→やっぱboost使うか
572デフォルトの名無しさん:04/10/12 01:27:51
そんなこたぁない
573デフォルトの名無しさん:04/10/12 01:39:12
自分で実装するぐらいならboostだろ
574デフォルトの名無しさん:04/10/12 01:42:22
STLにもファンクションオブジェクトならある。
575デフォルトの名無しさん:04/10/12 02:12:41
>>569
他に何があんだよ
576マイク ◆yrBrqfF1Ew :04/10/12 03:34:52
C++はtype safeで最高だな。
577デフォルトの名無しさん:04/10/12 04:55:02
boost本もけっこう重いね
578Ruby!!!!!!!!!!!!!!!!!!:04/10/12 05:00:19
糞本だろ。アレ
579デフォルトの名無しさん:04/10/12 06:56:02
>>578
糞本いいながら買ってるのか。
580デフォルトの名無しさん:04/10/12 10:20:38
>>579
買ったから糞本だと解かるんじゃないの
581デフォルトの名無しさん:04/10/12 10:46:04
クラス内でループ処理が必要でx[3]の様に配列を作成しているのですが、
クラス外からは、abc.aやabc.bの様に参照したいと思っています。

現在は
class abc{
    int x[3];
public
    int *a,*b*,c;
};
abc::abc()
{
    a=&x[0];
    b=&x[1];
    c=&x[2];
}
の様に書いているのですが、これだと*abc.aとしないといけません。
処理スピードを落とさずに、abc.aでアクセスできるようにする方法はないでしょうか。
582デフォルトの名無しさん:04/10/12 10:56:27
>>581
どうしても、どっちかからのアクセスは間接参照になる(けど、本当に遅くなるか?)。
あと、配列の方を実体とするなら、公開用の変数はポインタではなくて参照にするのが普通だと思います。
583デフォルトの名無しさん:04/10/12 11:29:15
public:
 int &a, &b, &c;

abc::abc()
 : a(x[0]), b(x[1]), c(x[2])
584デフォルトの名無しさん:04/10/12 12:29:29
そこでunionですよ。

>>582
コンストラクタがinlineじゃ無いと a, b, c が何をさしてるのか外からはわからないから最適化とかに影響を与えると思う。
ポインタの場合も同じ話だが。
585デフォルトの名無しさん:04/10/12 12:44:06
>>584
unionだと、規格で保証されている訳じゃないから微妙に不安。
組み込み系とか、ポータビリティを意識しない場合にはやるけど。

そもそも変数を公開している時点で、最適化する時にはクラスabcを知らなきゃできない、と思う。
586デフォルトの名無しさん:04/10/12 13:47:52
>>585
unionは、ISO標準C++では保証されてないの?
587デフォルトの名無しさん:04/10/12 14:44:10
こういう使い方は保証されてない
588デフォルトの名無しさん:04/10/12 14:46:28
>>586
メモリ配置がどうなるかは保証されてません。
でもま、実際ほとんどの環境で予想通りに動くと思うけどね。
589デフォルトの名無しさん:04/10/12 14:46:36
>581
関数じゃだめなの?
int &a() {return x[0];}
590デフォルトの名無しさん:04/10/12 14:51:39
>>581
つーかそういう時こそテンプレでしょ
public:
  template<int i>
  int Ret() const { return x[i]; }
591デフォルトの名無しさん:04/10/12 15:01:44
えー?
592デフォルトの名無しさん:04/10/12 15:02:47
>>590 それどうやって使うつもりヨ
593デフォルトの名無しさん:04/10/12 15:13:04
>>592

int main()
{
 abc a;
 std::cout << a.template Ret<1>() << std::endl;
}
594デフォルトの名無しさん:04/10/12 15:13:45
というかtemplateは不要だったスマソ
595デフォルトの名無しさん:04/10/12 15:17:57
>>587-588
勉強になりますたー
596デフォルトの名無しさん:04/10/12 15:38:38
char *p=
でchar配列の先頭にポインタを合わせた後、
*pからこのchar配列の長さを知る方法を教えてくれないと泣きます。
教えてくれると喜びます。
597デフォルトの名無しさん:04/10/12 15:41:03
char*だけ渡されてそんなの出来るわけねーだろアホか
598デフォルトの名無しさん:04/10/12 15:43:59
>597
ありがとうございます。
三度の飯より喜んでおります。大体8飯くらいです。
599デフォルトの名無しさん:04/10/12 16:05:10
>>596-598
なぞはすべて解けた。自作自演だな。
600デフォルトの名無しさん:04/10/12 16:27:52
>>523
おれおれ詐欺
601デフォルトの名無しさん:04/10/12 18:06:31
もうstrcatなんてうさんくさいものは使わないでマロックで自分で結合する!
602デフォルトの名無しさん:04/10/12 18:07:40
>>596
template <int N> int Hoge(char (&foo)[N]) {
char (*p)[N] = foo;
return sizeof *p;
}
603デフォルトの名無しさん:04/10/12 18:50:38
>>601
それ、C++じゃないし。
604デフォルトの名無しさん:04/10/12 21:31:51
605デフォルトの名無しさん:04/10/12 21:38:35
606デフォルトの名無しさん:04/10/12 21:41:20
>>601( ´,_ゝ`)プッ
607デフォルトの名無しさん:04/10/12 21:41:46
あほばっかだな
608デフォルトの名無しさん:04/10/12 21:43:02
まあ2chには色んなレベルの香具師が来るからな
609デフォルトの名無しさん:04/10/12 22:45:47
なんだよ2匹だけか
610デフォルトの名無しさん:04/10/12 23:51:57
メンバ変数の初期化順序なんですが

class A
{
public:
A(int a) : a_(a), b_(a*2), c_(b_*2) {}

const inta_, b_;
const intc_;
};

だと意図通りに初期化がされるのですが、c_の宣言をa_, b_の前に持ってくるとc_の値がおかしくなります。
初期化順が、コンストラクタの : 以降(イニシャライザって言うんでしたっけ?)の初期化順に関係なく
宣言順に依存しているからだと思うのですが、これは規格で決められているのでしょうか?
611デフォルトの名無しさん:04/10/12 23:56:52
>>610
決まってる。初期化は宣言された順序で行われる。
612デフォルトの名無しさん:04/10/12 23:56:59
>>610
そうです
613デフォルトの名無しさん:04/10/12 23:59:15
>>610
つEffective C++, Exceptional C++
614610:04/10/13 00:11:13
>>611-613
ありがとうございます。
>つEffective C++, Exceptional C++
C++やる人には必須なんでしょうけど…なかなかいい値段ですね…(´・ω・`)

あと、>>610のclass Aのようにあるメンバ変数が他のメンバ変数に依存している設計はどうなのでしょうか?
constが無ければコンストラクタの{ }内で順番に初期化すればいいのですが
constが付いていると : の所でしか初期化の機会がありませんよね。
そうすると宣言順が重要になって、うっかり変えてしまうと…
こういう設計は良くないのでしょうか?
615デフォルトの名無しさん:04/10/13 00:14:39
うん、設計がよくない気がする。
616デフォルトの名無しさん:04/10/13 00:18:26
やっぱりクソ言語だな
617デフォルトの名無しさん:04/10/13 00:21:53
>>614
ここまでの情報だと、実際のデータメンバはひとつにして、
おとなしくメンバ関数で値を返すようにするのが正解なんだろうな。
618デフォルトの名無しさん:04/10/13 00:23:52
const_cast して代入しちゃえば?
619デフォルトの名無しさん:04/10/13 00:25:04
>>614
必須じゃない
そんな値段で引いていたら本当に必須の本(PDF)が買えない
620デフォルトの名無しさん:04/10/13 00:26:22
>>613
「つ」ってよくみるけど、どういう意味があるの?
621デフォルトの名無しさん:04/10/13 00:27:56
つーか(ていうか)の略
622デフォルトの名無しさん:04/10/13 00:29:39
( ・∀・)つ
これの手だろ。
623デフォルトの名無しさん:04/10/13 00:30:00
>>620

モナー、ギコなど、猫の手であることが多い
624デフォルトの名無しさん:04/10/13 00:30:16
いや↓の「つ」の部分でしょ

(・∀・)つ
625デフォルトの名無しさん:04/10/13 00:31:17
性器か?
626デフォルトの名無しさん:04/10/13 00:31:35
>>619
必須の本(PDF)って何です?
627デフォルトの名無しさん:04/10/13 00:31:50
マジレスすんなカスども
628デフォルトの名無しさん:04/10/13 00:32:42
>>626
ぐぐれ
629デフォルトの名無しさん:04/10/13 00:36:00
>>626
14882
630626:04/10/13 00:37:54
>629
あれは$18だから買えないってことはないような・・・
631デフォルトの名無しさん:04/10/13 00:39:52
数万円はする
632デフォルトの名無しさん:04/10/13 00:41:15
>>5
633デフォルトの名無しさん:04/10/13 00:42:42
>>632
あれって合法なの?
634デフォルトの名無しさん:04/10/13 00:43:52
んなわけねーべ
635デフォルトの名無しさん:04/10/13 00:45:07
636デフォルトの名無しさん:04/10/13 00:45:57
>>635
本当だ。安くなったな〜
637デフォルトの名無しさん:04/10/13 00:45:58
5のはFinal Draftで著作権が発生していない版だから合法・・・のはず・・・
638635:04/10/13 00:50:02
>>5のPDFは違法。PDFじゃない方はFinal Draftなので合法。
ちなみに>>5のISOで買うよりも何故か>>635のANSIで買ったほうが安い。
内容は同じらしい。
639デフォルトの名無しさん:04/10/13 04:01:59
0 == 0 で返される値って何型ですか?
bool?int?
640デフォルトの名無しさん:04/10/13 04:06:40
>>639
cout << (typeid (0 == 0) == typeid (bool)) << endl;
641デフォルトの名無しさん:04/10/13 05:04:14
>>640って規格?環境依存?
642デフォルトの名無しさん:04/10/13 05:06:34
>>641
640の何が?

#include <typeinfo>
か?
643デフォルトの名無しさん:04/10/13 05:10:40
>>642
結果でしょ。
VC++6だとtypeid(0==0).name()がlongだったり
644デフォルトの名無しさん:04/10/13 05:16:22
マジ!?
g++(3.3.4)でbool
645デフォルトの名無しさん:04/10/13 05:40:38
このへん?
13.6 Overloading
12 For every pair of promoted arithmetic types L and R, there exist candidate operator functions of the form
LR operator*(L, R);
LR operator/(L, R);
LR operator+(L, R);
LR operator-(L, R);
bool operator<(L, R);
bool operator>(L, R);
bool operator<=(L, R);
bool operator>=(L, R);
bool operator==(L, R);
bool operator!=(L, R);
where LR is the result of the usual arithmetic conversions between types L and R.
646デフォルトの名無しさん:04/10/13 06:00:01
>>645
当たり前っていったら当たり前な結果だな。うん。
647デフォルトの名無しさん:04/10/13 10:47:09
どっちでも困らないが
648デフォルトの名無しさん:04/10/13 11:18:37
オーバーロードの解決とか、template引数の推測とか、意味を持ちそうなところはいくらか思い当たるな。
649デフォルトの名無しさん:04/10/13 15:09:27
int変数を都合よくchar配列に入れてくれる関数って無いんですか?
検索の仕方が悪いのか、別なのが出てきます。
int 100を元に、
char c[]="100";のchar配列と同等の結果を返す関数です。
650デフォルトの名無しさん:04/10/13 15:15:55
>>649
snprintf() でドゾ。
651デフォルトの名無しさん:04/10/13 15:22:09
>>649
const char *でいいんだったら
boost::lexical_cast <string> (100).c_str ();
とかもあるけど
配列だとコンパイル字に10進での桁数を求めないといけないんだよね
652デフォルトの名無しさん:04/10/13 16:12:23
>>610の初期化順序の仕様のメリットを教えてください。
653デフォルトの名無しさん:04/10/13 16:13:30
もしくは、そんな仕様になってしまった理由を教えてください。
654デフォルトの名無しさん:04/10/13 16:22:03
ムシャクシャして決めた。
順番なら何でもよかった。
今は反省している。
655デフォルトの名無しさん:04/10/13 16:33:14
>>649
非標準だけど_itoa
656デフォルトの名無しさん:04/10/13 16:35:53
657デフォルトの名無しさん:04/10/13 17:35:13
コンストラクタで昇順、デストラクタで逆順に破棄されるほうが都合がいいから。

親子関係のあるオブジェクトを同時に持つ場合に、親が先に死んだら困る場合もあるだろ。

これが初期化パラメータ順に破棄する仕様にすると、初期化の順序をオブジェクトごとに
記憶しなければいけない。
実際にやるとしたら使用したコンストラクタを一個覚えとくだけだと思うが、かなり無駄。
658デフォルトの名無しさん:04/10/13 18:02:18
親子なら子を殺すのは親の義務ではないのですか
私が直接殺すのは親だけではないのですか
659デフォルトの名無しさん:04/10/13 19:25:19
std::stringに格納されたアルファベットの文字列を大文字が含まれていれば小文字にしたいのですが
(e.g. This→this)、どうすればいいでしょうか?
660デフォルトの名無しさん:04/10/13 19:36:27
char character;
if (charcter <= 'A' && character >= 'Z')
 charcter = character + 0x20;
661デフォルトの名無しさん:04/10/13 19:40:07
>>659
for (size_t i=0; i<s.size(); ++i) {
if (isupper(s[i])) s[i] = tolower(s[i]);
}
662デフォルトの名無しさん:04/10/13 19:41:00
>>659
string str="Hello, World!";
transform(str.begin(), str.end(), tolower)
663デフォルトの名無しさん:04/10/13 19:43:45
transformだと日本語がダメ
664659:04/10/13 19:45:53
>>660-662
ありがとうございます。1ヶ月かかって作ったショボいアプリがこれで完成します。
665デフォルトの名無しさん:04/10/13 19:57:10
>>662-663
そこでファンクタですよ
666デフォルトの名無しさん:04/10/13 20:14:08
すみませんが質問させて下さい。

vc6.0+win32環境です。

ツールバーをカスタムドローしてボタンのアイコンを書いています。
NM_CUSTOMDRAWメッセージを処理してNMCUSTOMDRAWのRECTメンバ
からアイコンの位置を取得する時に、ドロップダウンを持つボタンのみ
縦の位置がずれてしまいます(XP環境でテーマ(manifest)を置いている時に限りです)。

何方か位置がずれない方法を知りませんでしょうか?
よろしくお願いします。


667デフォルトの名無しさん:04/10/13 20:21:09
>>666
適切なスレに行って聞き直せ。
668デフォルトの名無しさん:04/10/13 20:23:19
>667
そうします。
669デフォルトの名無しさん:04/10/13 21:25:34
>>661
tolowerは英大文字でなければなにもしないことになっているからifは不要。
670デフォルトの名無しさん:04/10/13 21:46:49
>>669
マジで?
知らなかった
671デフォルトの名無しさん:04/10/13 21:59:18
>>670
大文字じゃなかった場合どうなると思ってたんですか
672デフォルトの名無しさん:04/10/13 22:02:45
>>671
知りたいか?あ?
673デフォルトの名無しさん:04/10/13 22:03:53
>>663
>>659は「アルファベットの文字列」と言っているんだから別に
いいとは思うが、transformでダメなら自分でループ回しても
ダメなんではないか?普通はtransformも中でループ回してる
わけだし。
674デフォルトの名無しさん:04/10/13 22:07:07
>>669
かきこんでからきづいた
675デフォルトの名無しさん:04/10/13 22:09:04
>>673
いまさらだけど、transformの第3引数にstr.begin()いれるの忘れてた。

std::wstringにしようよ
676デフォルトの名無しさん:04/10/13 22:15:42
今時wstringなんてダレも使ってねーよ
677デフォルトの名無しさん:04/10/13 22:23:31
>>673
自前のループなら、
前が日本語の1バイト目ならっていう部分を追加すればいいんだけど、
transformじゃそれが出来ないってことなんだろう。
で、それを受けて、
前が日本語の1バイト目であることを保存できるファンクタを使え、
というのが、>>665なんだと思う。
678デフォルトの名無しさん:04/10/13 22:24:26
使いまくってるが
679デフォルトの名無しさん:04/10/13 22:28:23
fstream系がファイル名にwchar_t cosnt*を受け取れないからなぁ。
なんか片手落ち。
680デフォルトの名無しさん:04/10/13 22:32:18
wstringってちょっと環境依存なところもあるよね。
681デフォルトの名無しさん:04/10/13 22:34:31
stringもバリバリ環境依存だと思うが
682デフォルトの名無しさん:04/10/13 22:35:33
UNIX上のgccなんかだとのっけからstd::wstringのtypedefがコメントアウトされてたりとかな…
683デフォルトの名無しさん:04/10/13 22:37:06
MBCS対応basic_stringってありますか?
reverseとかfindが日本語混ざるとだめぽ。
684デフォルトの名無しさん:04/10/13 22:39:05
CJK問題とか欧米の人々はアスキー以外どうでもいいと思ってるからなぁ
685デフォルトの名無しさん:04/10/13 22:39:53
>>665,677
25.2.3 Transform -2
Requires: op and binary_op shall not have any side effects.
686デフォルトの名無しさん:04/10/13 22:40:36
>>683
と言うことで、自分で作るしかない。
687デフォルトの名無しさん:04/10/13 22:42:57
VC++でmbstring.hってあるじゃないですか、
あれって、MSの勝手な拡張なんですか?
CRTがjapanese-awareになって素敵なんですが。
あと、TCHARとか。
688デフォルトの名無しさん:04/10/13 22:46:53
マイクロソフトはすげえ会社なんだよ
689デフォルトの名無しさん:04/10/13 22:47:07
>>687
その通り。
690デフォルトの名無しさん:04/10/13 22:51:38
>>683
MBCS仕様のchar_traitsを自作してみたらどう?

>>687
MSの独自拡張。但しBCCでも結構使える。
691デフォルトの名無しさん:04/10/13 23:04:06
MBCS対応のchar_traits作るのってまず無理だろ。
結局内部はwchar_tで入出力時に適宜変換しかない。
692デフォルトの名無しさん:04/10/13 23:04:24
template <class T>
void destroy( T* p )
{
    p->~T();
}

template <class FwdIter>
void destroy( FwdIter first, FwdIter last )
{
    while( first != last )
    {
        destroy( &*first ); // 1
        ++first;
    }
}

なんですが、1 の所は destroy( first ); とするのじゃダメなのでしょうか?
693デフォルトの名無しさん:04/10/13 23:06:21
ぽいんたじゃないから
694デフォルトの名無しさん:04/10/13 23:10:26
>692
イテレータが渡される可能性があるので,&*でポインタを取得する必要があります.
(ポインタが渡された場合,&*は意味なし)
695デフォルトの名無しさん:04/10/13 23:12:45
あ,ポインタもイテレータのモデルの一つか.

誤:イテレータが渡される
正:ポインタでないイテレータが渡される
696デフォルトの名無しさん:04/10/13 23:23:55
>>691
んじゃー、サロゲートペアなんか考えるとUTF対応も不可能だし
C++の文字列クラスは実質ASCIIとUCS4専用で使い物にならないでFAなのか?
697デフォルトの名無しさん:04/10/13 23:26:10
>>696
べつに ISO-2022 系列でも構わんが。いずれにしても固定長じゃないと
難しい気はする。
698デフォルトの名無しさん:04/10/13 23:30:55
basic_stringのMBCS対応って、メンバ関数だけの問題なんじゃないの?
std::stringを継承して、
findとかreverseとかの、MBCS時に問題になるメソッドをオーバライドすりゃーいいだけのように思えるんだけど。
char_traitsは関係無いって言うか。

的外れなこと言ってたらごめんなさい。
699デフォルトの名無しさん:04/10/13 23:33:42
ネット上か書籍でC++におけるマルチバイト文字列(+locale)の扱いに関する
良いリファレンスご教授願えませんか?英語でも構いません.
(もしかしてそんなもの無い?)
700デフォルトの名無しさん:04/10/13 23:34:06
stringは継承しない方が・・・
701デフォルトの名無しさん:04/10/13 23:38:27
char_traits は設計的にマルチバイトに対応できないというの結論でよろしいのか?
……数多の文字列クラスが巷に溢れているのも仕方なしだな。
702デフォルトの名無しさん:04/10/13 23:54:09
Shift_JIS/CP932ならまだ16bit化とかいう冗談があるがEUC-JPやISO-2022-JPはそれも無理だからな。
703デフォルトの名無しさん:04/10/13 23:57:07
UTF-16のサロゲートなしで行こう
704デフォルトの名無しさん:04/10/13 23:57:44
>>701
文脈依存のバイト列を扱うために char_traits<T>::state_type っつー型が
定義されてるみたいだけど、これだけだと道具不足なの? どう使われてるか
調べてないので、何とも言えんが。
705ああああ:04/10/14 02:01:44
wstring word = L"あいうえお";

とした場合に、wordには何かしらの文字コードが入ると思うのですが、
たとえば、UTF-16だとして、そのことはどこをみればわかりますか?
706デフォルトの名無しさん:04/10/14 02:04:33
>>705
自前でコード判定をするしかない。スレ違い。
【UTF8】文字コード変換【SJIS】
http://pc5.2ch.net/test/read.cgi/tech/1063177450/
707>>705:04/10/14 02:37:48
>>706
いや・・・全然スレ違いではないと思うのですが・・・

ようは、wstringあつかうときに、文字コードの何を使うかを何処で決定しているかを知りたい。
たとえば、それが環境変数で設定されている値だとか、何かの設定ファイルがあるとか・・・
windowsとunixでは、決定の仕方が違うとか・・・そういうこと。
708デフォルトの名無しさん:04/10/14 02:40:39
マニュアルだろ
709706:04/10/14 02:42:49
>>707
いや、スレ違い。なぜならば、文字コードはC++規格に含まれていない。
710デフォルトの名無しさん:04/10/14 02:45:08
規格にないboostの話をする奴らの立場は
711デフォルトの名無しさん:04/10/14 02:52:04
>>709
強情な人だな...
わからないなら、わからないといえばいいのに...

712デフォルトの名無しさん:04/10/14 02:54:05
localeconv
713デフォルトの名無しさん:04/10/14 03:00:56
>>707
決定とか、そういうの無いから
714デフォルトの名無しさん:04/10/14 03:28:04
>>707
氏ね
715デフォルトの名無しさん:04/10/14 11:48:50
テンプレートを勉強中なのですが、以下のコードがVC++.NET2003上でうまくコンパイルできません。
エラーの原因を教えていただけませんか?
#include <iostream>
#include <string>
template<class stringT>
class test {
private:
stringT str_;
public:
test(stringT str) : str_(str) {}
stringT::size_type get_str(){
return str_.find("e", 0);
}
};
int main() {

test<std::string> str("test");

std::cout<<str.get_str()<<std::endl;

return 0;
}
これをコンパイルすると以下のようなエラーメッセージが出ます。

warning C4346: 'stringT::size_type' : 依存名は型ではありません。
error C2146: 構文エラー : ';' が、識別子 'get_str' の前に必要です。
warning C4183: 'get_str': 戻り値の型がありません。'int' を返すメンバ関数とみなします。
716デフォルトの名無しさん:04/10/14 11:54:44
-stringT::size_type get_str(){
+typename stringT::size_type get_str(){
717デフォルトの名無しさん:04/10/14 11:55:54
>>716
あ!そんな簡単なことだったのですね。
どうもありがとうございます^^
718デフォルトの名無しさん:04/10/14 19:10:25
>>705
c_str()やbegin()から順にたどっていくのは?
719デフォルトの名無しさん:04/10/14 19:35:52
>>718
ha?
720デフォルトの名無しさん:04/10/14 19:38:50
hi?
721デフォルトの名無しさん:04/10/14 19:40:53
ho?
722デフォルトの名無しさん:04/10/14 22:12:28
がるぽ
723デフォルトの名無しさん:04/10/14 22:20:04
>>722
ヌッ
724デフォルトの名無しさん:04/10/14 23:33:54
ぬるッ
725デフォルトの名無しさん:04/10/15 00:05:22
>>724
ガぽ
726デフォルトの名無しさん:04/10/15 01:51:25
>>715
別にテンプレートの勉強するのはいいけれども、それは何かの
役に立つのかな…

template <typename charT>
class test {
private:
std::basic_string<charT> str_;


とかならまだ分かるが…
727デフォルトの名無しさん:04/10/15 02:03:15
>>726
std::string::size_typeって例えばfindメソッドなどの引数の型になっているね。
これは大抵size_t型がtypedefされているものだけど、Alphaマシン
とかだと必ずしもsize_tとは限らないからstd::string::size_type
で宣言するんだよ。
728デフォルトの名無しさん:04/10/15 02:13:14
>>727
そういう話ではないんじゃ
729デフォルトの名無しさん:04/10/15 07:00:47
>>726
そんなこと言ったら、 CharTraits や Allocator も引数に追加しないといけないんじゃないの?
730デフォルトの名無しさん:04/10/15 13:12:29
>>729
             ,. - ─── - 、
             /    ,       `ヽ.
            /〃//,. ,ィl/|l ト、 !、 、  ヽ
          ー'´| | l |1 | !l. l| ! | l.|ヽ ! !、 ',
             YレV!ヒエ「! |l.「_ト!Ll」| l l  l
           ! lハイJ |  ´|_jヽ. リ,! ! l. l |
             |l |l.} ー ,   L _,ハl.lトl l. | l
             |l ilト、   n  ''  ,1l|ィ| |l l |   パパ、大丈夫だよ♥
           _ 二,ニ^tュ--ェ_t1」l.|l !リ|_lノ   
       r7´   f r┐| 〔/ミヽ>,-、 ̄´
       Y       ー个‐'t  ハ-、_'ゝ、
        ヽ ._・ rく ̄ヽト-'丿  ヽ l
        / (・__,)ゝi┬'´ハ`     '`|
          |ヽ, イ   ノ┴くヽヽ、    /
        `´ ゝ┬ヘ`ヽ   |  `ー‐1
           ゝノ-‐^ー'一''丶  ヽ ヽ
           ト、_       `ーァ'¨不ヽ
            | | 「 ̄「 ̄l ̄ト、,イトヒi′
             l l. l   l  !  !└' l |
             └ L 」_,|__l_l.__L.l′
             |   |  |   |
              l   l   !   !
                l   l.   l   l
            ト--┤   !--‐1
              f‐t央j.   ト央ァヘ
              |  甘l、  / 甘  |
             l  ,.-‐ヽ レ'⌒ヽ/
            `く.__ ノ ゝ--‐′
731デフォルトの名無しさん:04/10/15 18:17:28
>>730
ハァハァお嬢ちゃんの臭いオシッコ飲みたい!!
(;´Д`)ハァハァハァ
732726:04/10/15 23:25:49
>>730-731
言語系のスレでそういうのはやめてくれ、吐き気がする。

>>729
いや、まぁ、現実的にはそうなるかもしれないけれども、
例としての良さの問題だから。
733デフォルトの名無しさん:04/10/15 23:42:49
別にstringをテンプレート引数にしても全然おかしくねーよタコ
734デフォルトの名無しさん:04/10/16 00:04:44
>>733
いや、そういう話ではないだろう。
735デフォルトの名無しさん:04/10/16 00:32:17
>>734
どういう話なの?
736デフォルトの名無しさん:04/10/16 02:03:18
放置しろよ
737デフォルトの名無しさん:04/10/16 02:50:53
basic_stringをテンプレート引数にする意味がないからだろ。
string・wstring以外で同じメンバ関数をもったクラスなんてあまりないし、
そもそもテンプレートじゃなくて派生させるだろうし。
738デフォルトの名無しさん:04/10/16 03:18:38
>>737
どうやってメソッドの引数や戻り値の型が異なるクラスを
派生でキレイに実現するのかぜひ教えてください。
739デフォルトの名無しさん:04/10/16 03:22:04
仮想デストラクタをもたないクラスから派生するのはちょっと・・・
740737:04/10/16 03:27:26
>>738
まずは、basic_stringと酷似するメソッドを持つクラスを
「string/wstringとその派生」以外で提示して頂いた方が良いでしょう。

そんなわけで、
私めはここにて縄を持って待ち伏せ致しますので、
>>738さんは屏風から虎を追い出してください。
741デフォルトの名無しさん:04/10/16 03:31:46
自分が間違った事を言ったことぐらい素直に認めろよ
742デフォルトの名無しさん:04/10/16 03:36:20
だから放置しろっつったのに
743デフォルトの名無しさん:04/10/16 05:51:01
>>739
PODだけ持たしとけば問題ない。
744デフォルトの名無しさん:04/10/16 19:09:51
>>743
ポインタを持ってたら?
745デフォルトの名無しさん:04/10/17 13:58:56
さがりすぎ
746デフォルトの名無しさん:04/10/17 17:37:00
std::stringを使用してSQLクエリを組み立てているんですけど

std::string s;

s += "SELECT ";

s += "COL";

s+= "FROM";

とかやってると効率が悪い感じです

stringstream?とか使うと効率はアップするんでしょうか
747デフォルトの名無しさん:04/10/17 17:50:49
C++以前の問題。
パラメータ付きクエリを使ってない以上、何やっても効率は最低。
748デフォルトの名無しさん:04/10/17 17:52:07
sprintfか、boost::format とか。
749デフォルトの名無しさん:04/10/17 17:54:21
sprintf(s, "SELECT %s FROM %s", "col1, col2", "table");
750デフォルトの名無しさん:04/10/17 18:15:53
>>749
御社では包括的sprintf使用禁止条約に調印してないんですか?
751デフォルトの名無しさん:04/10/17 18:16:56
snprintf にして、戻り値もチェックすれば OK?
752デフォルトの名無しさん:04/10/17 19:32:17
文字の前に@を付けるにはどうしたらいい?

例えば
こんにちは
おはよう
と書き込んで変換したい場合

@こんにちは
@おはよう
見たいな感じで開いてるTXTファイルに書き込み

C++でサンプルソース作って下さい。
753デフォルトの名無しさん:04/10/17 19:34:36
>>752
こっちのほうが適切では?
【初心者歓迎】C/C++室 Ver.10【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1097416187/
754デフォルトの名無しさん:04/10/17 19:38:47
>>752-753
自演乙
755752:04/10/17 19:56:13
自己解決しますた。

756デフォルトの名無しさん:04/10/17 20:16:20
次スレからGotWをテンプレに加えないか?
http://www.gotw.ca/
757デフォルトの名無しさん:04/10/17 20:23:13
Stroustrup が禿なら、Sutter は髭だな
758デフォルトの名無しさん:04/10/17 20:27:02
Sutter はあんまり話題にあがらないけどな
759デフォルトの名無しさん:04/10/17 20:33:56
去ったんだろ
760デフォルトの名無しさん:04/10/17 20:42:31
この秋一番の寒波
761デフォルトの名無しさん:04/10/17 20:45:55
762デフォルトの名無しさん:04/10/17 20:46:40
Scott Meyersはフサフサか
763デフォルトの名無しさん:04/10/17 20:47:37
>>759
おもしろい
764デフォルトの名無しさん:04/10/17 20:54:46
765デフォルトの名無しさん:04/10/17 21:02:18
>>762
フサフサ過ぎるくらいだな
ttp://www.aristeia.com/images/sdm-big.jpg
766デフォルトの名無しさん:04/10/17 21:37:26
まつもと >>>>>>>>>>>>>>>>>>>>> ScottMeyeyeyers
767デフォルトの名無しさん:04/10/17 22:35:21
だれ、まつもとって?
768デフォルトの名無しさん:04/10/17 22:38:30
松本コンチータだろ
769デフォルトの名無しさん:04/10/17 23:16:02
>>759はこの秋一番の豊作
才能を感じる

世界の中心で
愛を酒奉行
770デフォルトの名無しさん:04/10/18 00:52:09
Scott Meyersってもっと年食った人かと思ってたよ。ちょっとビックリ。
771デフォルトの名無しさん:04/10/18 01:07:48
おいらもびっくり
772デフォルトの名無しさん:04/10/18 01:12:56
ブラウンがお気に入りなんですな
7735:04/10/18 01:22:59
ifsream in("test.dat");
string line;

while( !in.eof() )
{
getline(in, line);
if( lineが1個以上の空白文字のみからなるとき飛ばす条件 ) continue;

}

のようにtestファイルから行単位で読み込む時、1個以上の空白文字
のむを含む行の処理をとばすにはどうすればいいのでしょうか?
774デフォルトの名無しさん:04/10/18 01:45:30
>>773
line.find_first_not_of(' ', 0) == std::string::npos
775デフォルトの名無しさん:04/10/18 01:46:44
>>773
if (find_if (line.begin (), line.end (), bind2nd (not2 (equal_to <char> ()), ' ')) == line.end ())
かな?
776775:04/10/18 01:48:58
>>774
へぇ〜そんなメンバ関数があったんだ
777デフォルトの名無しさん:04/10/18 01:53:27
>>776
実はさっきちょうどトーカナイザの実装をしていて、そのメソッドの文字列を
タイピングしていたところだったりする。
778773:04/10/18 03:28:47
test.datが秀丸からみて
sum 5.0 3.0↓
sub 3.0 5.0↓
sum 4.0 2.0↓
sub 3.0 12.0↓
[EOF]
の場合はうまくいくんですが
sum 5.0 3.0↓
sub 3.0 5.0↓
sum 4.0 2.0↓
sub 3.0 12.0↓
↓ ここに関連する処理をお二人に教えてもらった方法で飛ばせるかどうかやったのですが駄目でした。
[EOF]

根本的に実装方法が悪いのかな

779デフォルトの名無しさん:04/10/18 03:38:18
>>778
それ「1個以上の空白文字」ないじゃん
780デフォルトの名無しさん:04/10/18 03:43:37
>>778
while(getline(in, line))
{
if (line.find_first_not_of(' ', 0) == std::string::npos)
continue;
}
781773:04/10/18 04:12:49
>>779
sum 5.0 3.0↓
sub 3.0 5.0↓
sum 4.0 2.0↓
sub 3.0 12.0↓
 ↓ とか一マス以上あけても同じです、cygwinGCC使ってるんですがそのせいでしょうか。
[EOF]
782デフォルトの名無しさん:04/10/18 04:25:26
>>781
780
783デフォルトの名無しさん:04/10/18 07:01:27
今C++を勉強しています。
教則本をみながらやっているのですが、ウィンドウを作成するにもHINSTANCEやらよくわからない型がでてきます。
こういう教則本のソースなどは、隅々まで理解する必要がないのでしょうか。

とりあえず、コンパイルして(例えば)CreateWindowはどういう働きをするのかなどが理解できれば先に進んでもいいんですかね?
784デフォルトの名無しさん:04/10/18 07:19:06
>>783
あなたが勉強しているのはWindowsAPI。
言語の勉強と環境の勉強をごっちゃにして混乱されぬよう、気をつけられよ。
ちなみにここはC++スレ、質問はWindowsAPIでスレ違いにて、あしからず。

こちらなどを伺われよ。
http://pc5.2ch.net/test/read.cgi/tech/1095534704/
785デフォルトの名無しさん:04/10/18 07:25:20
それC++ちゃう。Win32 APIや! だから、スレ違い!

んで、Win32 APIの関数はMSDNで調べるといいよ
786デフォルトの名無しさん:04/10/18 07:40:04
ご指摘ありがとうございます。
スレ違いでしたか…すみません。

わからない関数があるときはMSDNで調べればいいわけですね。
>>784さんのスレも一通り読んで見ます。

ありがとうございました。
787デフォルトの名無しさん:04/10/18 09:38:41
stricmp("AAA","aaa")
をC++流に書くとどうなるのですか?
788デフォルトの名無しさん:04/10/18 10:03:59
>>787
まずはパラメータの個数と型を正しくする。
789788:04/10/18 10:08:11
>>787
あーごめん、strncmp()かと思ったよ。stricmp()なんて非標準関数持ち出すとは思わなくてね。
で、その関数の仕様は?
790デフォルトの名無しさん:04/10/18 10:22:44
>>788
stricmpのどこが非標準なのかと小一時間・・・
791デフォルトの名無しさん:04/10/18 10:26:54
>>790
はぁ?
792787:04/10/18 10:52:14
>>789
大文字は小文字としてstrcmpをしてくれます。
stricmp("AHO","aho") == 0 となります
793デフォルトの名無しさん:04/10/18 15:39:37
>>783
プログラミングの前に、まずは適切なスレを見分ける能力を養え。
794デフォルトの名無しさん:04/10/18 18:57:36
問題の切り分けなんて、本を読んだり実際にプログラムを読み書きしながら学んでいくしかないだろ。
795デフォルトの名無しさん:04/10/18 22:03:40
com研究所のURL教えれ
796デフォルトの名無しさん:04/10/18 22:06:30
>>790
stricmpは規格にない。それだけで十分だろう。
797デフォルトの名無しさん:04/10/18 22:07:27
>>796
ここはC++のスレだぞ。
stricmpはCにはないがC++にはある。
798796:04/10/18 22:15:16
>>797
ISO/IEC 14882:1998にはないが何か?
799デフォルトの名無しさん:04/10/18 22:17:26
com研究所のURL教えれ
800デフォルトの名無しさん:04/10/18 22:48:52
800ゲットですが何か?
801デフォルトの名無しさん:04/10/18 22:58:23
やおいゲット!!
802デフォルトの名無しさん:04/10/18 22:59:15
そうはいっても、gccにはあるみたいだね。
snprintfと似たような状況だね。
snprintfが標準になる日は何時だろう・・・。
つか普通の開発じゃsprintf()禁止令出るもんだし、はやく標準にしてもらいたい。
803デフォルトの名無しさん:04/10/18 23:01:25
stricmpか
localまで考え出すとキリが無いわな
804デフォルトの名無しさん:04/10/18 23:02:21
>>802
あれだ、stringstreamを頑張って使え
805デフォルトの名無しさん:04/10/18 23:06:15
まっ、糞みてーなライブラリだけど、boost::formatでも使っとけ
806カナガワ:04/10/18 23:42:04
MDIを使ったアプリケーションで、チャイルドフレームをSDIのように扱う方法はありませんか?
807デフォルトの名無しさん:04/10/18 23:51:59
>>803
まさか locale と間違えてたりする?
808カナガワ:04/10/19 00:03:54
MDIを使ったアプリケーションで、チャイルドフレームをSDIのように扱う方法はありませんか?
809デフォルトの名無しさん:04/10/19 00:12:33
>>807
てへ
810デフォルトの名無しさん:04/10/19 00:13:56
>>802
gccにあるだけで標準扱いかよ。
ウンコ野郎だな
811796:04/10/19 00:49:37
>>802
ま、C99には入っているし、C++の改定で入る予定では
あるみたいだけれども。
"will likely be in C++0x"
ttp://gotw.ca/publications/mill19.htm
812カナガワ:04/10/19 01:34:12
MDIを使ったアプリケーションで、チャイルドフレームをSDIのように扱う方法はありませんか?
813デフォルトの名無しさん:04/10/19 01:43:31
ない
MSの伝統
814デフォルトの名無しさん:04/10/19 01:43:45
ない
815デフォルトの名無しさん:04/10/19 20:44:14
int* p = new int();
std::cout << *p << std::endl;
std::cout << int() << std::endl;

VC6SP6
どちらも0になると思ったのですが、newの方は非0になりました。
(デバッグモード・リリースモードどちらも同じ結果でした)
C++的にこれは正しいのでしょうか?
816デフォルトの名無しさん:04/10/19 21:05:13
>>815
正しくないです。
"If the new-initializer is of the form (), default-initialization shall be performed"
(5.3.4 New -15- より)
817815:04/10/19 21:09:06
>>816
ありがとうございます。
VC6を窓から投げ捨てようと思います。
818デフォルトの名無しさん:04/10/19 21:16:26
C++使いたいならVC6は使うなっていうやりとりをもう何回も見てきたが、
いっそのことテンプレにでもいれたらどうなんだ?
819デフォルトの名無しさん:04/10/19 21:26:54
会社の事情でVC6を使わざるを得ない人もいるのよ。
820デフォルトの名無しさん:04/10/19 21:37:24
ARM 仕様の処理系を ISO/IEC 14882 で論じるバカどもがまた蛆虫のように涌いて出てるな
821デフォルトの名無しさん:04/10/19 21:48:32
1.start_engine
2.StartEngine
3.startEngine

みなさんは 1, 2, 3 のどのスタイル使ってますか?
自分はスタイルがAPIやSTLとかぶらないように
Java風な3を使ってるんですが、正直美しいとは
思えませんです。他に何かいいスタイルありますかね…?
822デフォルトの名無しさん:04/10/19 21:50:16
>>819
だから、VC6はC++じゃないからあきらめろ、っつーかこのスレに来るな、ってことでしょ。
VC6が悪いんであって、VC6を使う人は悪くないよ。念のため。
823デフォルトの名無しさん:04/10/19 21:54:30
>>821
ここでやる話ではない。むしろ、ここでやってはいけない話かもしれない。
824デフォルトの名無しさん:04/10/19 21:56:51
識別名のつけ方は、パラダイムや言語の特徴に依存する面もあるから、いいんじゃないか?
825デフォルトの名無しさん:04/10/19 21:57:15
>>821
3でいいと思うよ。2だとクラス名で被るし、1だとタイプ数が増える
826デフォルトの名無しさん:04/10/19 21:58:14
>>821
どのスタイルというよりコーディング基準に従うだけだ
はっきり言われてなくても周り乖離しないように気をつけてる
827デフォルトの名無しさん:04/10/19 22:45:22
>>821
(メンバ)変数は1
(メンバ)関数は2
3は最近知ったから,特に使ってなかったけどどっかに使おうかなぁと考え中

まだ社会に出てないお子ちゃまなので参考にはならんだろうけど
828デフォルトの名無しさん:04/10/19 23:10:22
>>827
社会に出るまでにスタイルを統一しなさい
829デフォルトの名無しさん:04/10/19 23:19:26
>>828
社会に出ればスタイルの統一なんて自分の一存ではできないだろ。
「統一しなさい」なんて言ってできるわけない。
830デフォルトの名無しさん:04/10/19 23:32:59
なにいってんだ
831827:04/10/19 23:36:26
>>828
いや、一応↑で統一してるんだけども…
でも>>825のクラス名と被るの言い分は納得。
もう一度洗いなおしてみるかな。

コーディング規約スレもっと伸びないかな
ああいう情報もっと欲しいYO
832デフォルトの名無しさん:04/10/19 23:39:15
くだらねえんだよ
833デフォルトの名無しさん:04/10/19 23:52:19
ねぇ、C++を作ったってどういうこと?
一体Bjarne Stroustrup 彼は何を作ったの?
834デフォルトの名無しさん:04/10/19 23:55:00
C++の基本的言語仕様を作った。
835デフォルトの名無しさん:04/10/20 00:06:39
ちょっと待て。
>>815
そのコードはDebugビルドで実行していないか?
もしそうならReleaseビルドだとどうなる?
836デフォルトの名無しさん:04/10/20 00:10:36
>>835 よく見ろ。
837デフォルトの名無しさん:04/10/20 00:16:48
がーん
838デフォルトの名無しさん:04/10/20 00:20:39
>>837
フフフフフフフフフフフフフフフフフフフフフフ
839デフォルトの名無しさん:04/10/20 00:24:24
「フ」が10こ(ぐらい)で豆腐

なーーんちゃって!
840デフォルトの名無しさん:04/10/20 00:25:22
全米が泣いた
841デフォルトの名無しさん:04/10/20 00:33:43
ふとんがふっとんだーーー!!
842デフォルトの名無しさん:04/10/20 00:37:11
ふっとんだのはふとんですか?
843デフォルトの名無しさん:04/10/20 01:05:10
ふっとんだのはぬるぽです
844デフォルトの名無しさん:04/10/20 01:08:22
グーでガッしていいですか?
845デフォルトの名無しさん:04/10/20 01:08:28
ぶどうがぶっとんだ
846デフォルトの名無しさん:04/10/20 01:15:49
ぶっとんだのはぶどうですか?
847デフォルトの名無しさん:04/10/20 01:43:34
ふっ飛ばしたのは台風ですが。
なんかネタないんかい。
848デフォルトの名無しさん:04/10/20 07:20:34
おまいら夜は激しいですね
849デフォルトの名無しさん:04/10/20 10:36:36
激しいのは夜だけですか?
850デフォルトの名無しさん:04/10/20 11:12:00
(*´ー`)漏れはまだまだ若いさ
851デフォルトの名無しさん:04/10/20 13:25:43
http://pc5.2ch.net/test/read.cgi/tech/1097880265/
から誘導されてきました。

#include <memory>
struct A { virtual ~A() {} };
class B : public A {};
class C : public A {};

int main(int argc, char* argv[]) {
int i = 0;
std::auto_ptr<A> p(i == 0 ? new B : new C);
return 0;
}

VC++6SP6 。このコードをコンパイルすると
error C2446: ':' : 'class C *' 型から 'class B *' 型への変換ができません。指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
error C2664: '__thiscall std::auto_ptr<struct A>::std::auto_ptr<struct A>(struct A *)' : 1 番目の引数を '' から 'struct A *' に変換できません。
と出ます。理由がわかりません。何が間違っているのでしょうか?
852デフォルトの名無しさん:04/10/20 13:41:16
i == 0 ? new B : new C の結果は何型?
853851:04/10/20 13:46:52
>>852
B*ですよね?
でauto_ptr<A>のコンストラクタの引数の型はA*だからそのまま渡せると思うのですが。
std::auto_ptr<A> p2(new B);
が通るので正しいはずですよね?
もしかして私何か勘違いしてますか?
854デフォルトの名無しさん:04/10/20 13:54:12
>>853
じゃi = 1なら
i == 0 ? new B : new C の結果はC*かい?
そうすると「?:」は返り値の方がダイナミックに変わる演算子ってことになるけど
855デフォルトの名無しさん:04/10/20 14:04:09
>853
コンパイラは x ? y : zという演算の型を,
yとzの型を元にいくつかの複雑なルールに従って決めようとします.
そしてyとzの型が関係の無い型のポインタ型であるときには,
この演算結果の型を決めることが出来ずコンパイルエラーとなります.
ちなみにあなたがやりたいことは以下で出来ます.

i == 0 ? (A*)new B : new C
856851:04/10/20 14:15:19
>>854-855
ああなるほどよくわかりました。
今まで何気なく?:を使ってたんですが、今回のようなことは気付きませんでした。
ありがとうございました。
857デフォルトの名無しさん:04/10/20 16:59:20
C++って言語じゃないのか
858デフォルトの名無しさん:04/10/20 17:42:11
>>857
C++はプログラミング言語だが何か。
859デフォルトの名無しさん:04/10/20 17:57:11
すいません、質問です。下のプログラムを g++ -Wall でコンパイルすると
T.cc:9: warning: `struct NonVirtualClass' has virtual functions but non-virtual destructor
って怒られるんですが、原因が理解できません。
~X(){} がなければ怒られないのですが・・・
ちなみに g++ のバージョンは 3.3 です。

struct X {
~X() {}
};

struct VirtualClass {
virtual void Method() = 0;
};

struct NonVirtualClass : VirtualClass {
X m;
void Method() {}
};

860デフォルトの名無しさん:04/10/20 17:59:07
>>859
つEffective C++
861デフォルトの名無しさん:04/10/20 18:00:27
>>859
g++は警告出してくれるんだ・・・やさしいなぁ・・・。
862デフォルトの名無しさん:04/10/20 18:06:45
>>859
つ[英和辞典]
863デフォルトの名無しさん:04/10/20 18:07:55
>>859
つI
864デフォルトの名無しさん:04/10/20 18:08:41
struct X {
virtual ~X() {}
};
865デフォルトの名無しさん:04/10/20 18:11:57
>>864
struct VirtualClass {
virtual ~VirtualClass() {}
virtual void Method() = 0;
};
仮想デストラクタが必要なのはこっちだろ。
866859:04/10/20 18:14:46
>>865
ありがとうございました!
867デフォルトの名無しさん:04/10/20 18:56:00
>>864
アホだ
868デフォルトの名無しさん:04/10/20 19:06:11
おい、ちょっとまて。
>~X(){} がなければ怒られないのですが・・・
これどーゆーいみよ。
869デフォルトの名無しさん:04/10/20 19:37:42
>>868
 クラスじゃないからだろ。
870デフォルトの名無しさん:04/10/20 21:27:10
>>869
~X() があればクラスだっていうのか?
871デフォルトの名無しさん:04/10/20 21:40:55
うまくつながってないんじゃ?
872デフォルトの名無しさん:04/10/20 22:28:54
>>868
~X() があると NonVirtualClass にもコンパイラによって自動的にデストラクタが作成される。
おそらくg++はこの暗黙のデストラクタをvirtual指定無しとして扱って件の警告が出るのではないかと。
873デフォルトの名無しさん:04/10/20 22:56:24
>>872
デストラクタのあるメンバを置いただけでも警告が出るようになるな。

12.4 Destructors の -3- -4- に従って
non-trivial なデストラクタを持つかどうかが警告の出る条件になるんだろう。
874デフォルトの名無しさん:04/10/21 00:10:31
これってどうよ?

#include <iostream>
using namespace std;
class CBase
{
int m_id1;
public:
CBase(int id1 = 1):m_id1(id1){}
int GetID1() const { return m_id1; }
};
class CDerived : public CBase
{
int m_id2;
public:
CDerived(int id2 = 1):m_id2(id2),CBase(id2*10){}
int GetID2() const { return m_id2; }
};
class CFactory
{
protected:
CFactory(){}
public:
static CBase* GetInstance(){ return new CBase(111); }
};
int main()
{
CBase* p = CFactory::GetInstance();
cout << ((CDerived*)p)->GetID2() << endl;
}
875デフォルトの名無しさん:04/10/21 00:15:30
>>874 意味不明
876デフォルトの名無しさん:04/10/21 00:17:59
>>875
初心者は口出すなよ
877デフォルトの名無しさん:04/10/21 00:19:21
>>876
エスパー以外は初心者か。おめでてーな。
878デフォルトの名無しさん:04/10/21 00:21:07
「どうよ」っていう言葉ってどうよ?
879デフォルトの名無しさん:04/10/21 00:23:35
>>874
「結果は未定義」が正解。
880デフォルトの名無しさん:04/10/21 00:24:42
ただのダウンキャストがどうかしたのか
881デフォルトの名無しさん:04/10/21 00:27:00
どうよもくそもねぇじゃん。
まじめに読んで損した。
882デフォルトの名無しさん:04/10/21 00:49:06
QueryInterface がどうだかって言いたいのか?
883デフォルトの名無しさん:04/10/21 01:26:07
>>874
 SEGV
884デフォルトの名無しさん:04/10/21 06:56:31
ファクトリを持ち出したところに何か隠された意味があるのではなかろうか
885デフォルトの名無しさん:04/10/21 07:05:08
だめ!!もう限界。
>>874、答えを教えてください。
886デフォルトの名無しさん:04/10/21 08:18:58
template<class T> T* Allocate( ptrdiff_t n, T* ) {
  return (T*)operator new((size_t)n * sizeof (T));
}
こんなnewの使われ方をはじめて見たのですが、なにを表しているのですか?
動作させてみたところ、指定したサイズを確保し、コンストラクタは呼ばれないようですが。
「プログラミング言語C++第3版 」を買えばこういったことがすべて書いてありますでしょうか?
887デフォルトの名無しさん:04/10/21 08:32:26
>>886
通常のnew演算子で呼び出されるメモリ確保の直接呼出しです。
その本には確かに書いてあります。
888デフォルトの名無しさん:04/10/21 08:38:36
通常の方法ですか。どうもです
STLの中身を見ていたら上記のような疑問が山ほど出てきて一人で1000レス行きそうな勢いなので
素直に「プログラミング言語C++第3版 」で勉強してきます
889デフォルトの名無しさん:04/10/21 22:57:35
class Widget{ ... };
bool f( const Widget& w ){ ... }

int main(){
    std::vector<Widget> v;
    std::find_if( v1.begin(), v1.end(), std::not1( std::ptr_fun( &f ) ) ); //1
    return 0;
}

1で、
error C2529: '_Left' : 参照への参照は無効です。
warning C4181: 参照型に適用された修飾子は無視されました。

とエラーが出てしまいます。どうすればうまくいきますでしょうか…?
コンテナを vector<Widget*> にして bool f( const Widget* w ) にすれば
ちゃんと動いたのですが、こうするしか解決方法はありませんでしょうか?
890デフォルトの名無しさん:04/10/21 23:05:12
そこでboostですよ
891デフォルトの名無しさん:04/10/21 23:06:15
そこでるbyですよ。
892デフォルトの名無しさん:04/10/21 23:08:04
>>889
fを関数オブジェクトに変えてmem_fun_refでいいんじゃいないの?
893デフォルトの名無しさん:04/10/21 23:11:12
>889
> std::find_if( v1.begin(), v1.end(), std::not1( std::ptr_fun( &f ) ) ); //1

std::find_if( v1.begin(), v1.end(), std::not1( std::ptr_fun<Widget>( &f ) ) );

これで通りませんか?試してないのでもし通らなかったらごめんなさい.
#reference to reference問題は良いい加減修正して( ゚д゚)ホスィ…
894893:04/10/21 23:13:46
std::find_if( v1.begin(), v1.end(), std::not1( std::ptr_fun<const Widget>( &f ) ) );

の方が適切です.すいません.
895デフォルトの名無しさん:04/10/21 23:20:41
>>894
レスありがとうございます
しかし
error C2784: 'std::pointer_to_binary_function<_Arg1,_Arg2,_Result> std::ptr_fun(_Result (__cdecl *)(_Arg1,_Arg2))' : 'T3 (__cdecl *)(const Widget,T2) 用のテンプレート引数を 'bool (__cdecl *)(Widget &)' から減少できませんでした。
error C2784: 'std::pointer_to_unary_function<_Arg,_Result> std::ptr_fun(_Result (__cdecl *)(_Arg))' : 'T2 (__cdecl *)(const Widget) 用のテンプレート引数を 'bool (__cdecl *)(Widget &)' から減少できませんでした。
となってしまいます…
896デフォルトの名無しさん:04/10/21 23:22:17
すいません.893, 894は誤りです.無視してください.
892さんが書いているようにfをファンクタにするのが良いと思います.
(mem_fun_refはいらないような?)
897デフォルトの名無しさん:04/10/21 23:29:38
つまり
struct Hoge : std::unary_function<Widget, bool>
{ bool operator ()( const Widget& w ) const{ return false; } };
std::find_if( v1.begin(), v1.end(), Hoge() );
ということでしょうか…?

関数ではダメですか…
898デフォルトの名無しさん:04/10/21 23:55:44
>>897
もし失望されているようならboostというライブラリを一度見てみることをお勧めします.
functionalというライブラリに改善されたファンクタアダプタがあります.
http://boost.cppll.jp/HEAD/libs/functional/negators.html
899デフォルトの名無しさん:04/10/22 00:38:37
>>874 実行したら3行目エラーでたよ
900デフォルトの名無しさん:04/10/22 00:41:25
boostってソースしか参考にしていない…
実際に使うには標準じゃないし。。。
901デフォルトの名無しさん:04/10/22 00:50:09
>>900
ばっかでーーー。
自分で使う範囲では標準など気にする必要などない。
第一、会社によってSTLすら使わせてくれない
ところがあるそうじゃないですか?俺はプログラマーじゃないから詳しくはないけど。
902デフォルトの名無しさん:04/10/22 01:03:55
try〜catchの形式で一般的なものは、次のうちどちらですか?
理由も合わせて述べて下さい。

■パターンA
int hoge() {
try {
int a = 0;
a = 1;
return a;
} catch(...) {
throw;
}
}

■パターンB
int hoge() {

int a = 0;

try {
a = 1;
} catch(...) {
throw;
}
return a;
}

903大学生:04/10/22 01:20:37
どうしてもエラーがでるので教えてください

class Concept{
public:
vector<int> number;
double* ave_signal;
}

class GSG{
public:
vector<Concept> m_VecConcept;
int m_length;
};

void Concept::Concept(int length){
ave_signal = new double[length * sizeof(double)];
memset(ave_signal, 0x00, length * sizeof(double));
}
904大学生:04/10/22 01:21:20
のようにクラスを作っておいて、

void GSG::func(){
if (flag){
Concept *pCon = new Concept(m_length);
m_VecConcept.push_back(*pCon);
delete pCon;
}
}

ってやると、コンパイラは通るのですが実行時に
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
ってエラーが出てプログラムが強制終了してしまいます。
それもm_lengthが3の時は普通に動いて8のときは死にます。
VC6.0のMFC使ってやっているのですがここで詰まってしまいました。
分かる方教えてくださいまし。
905デフォルトの名無しさん:04/10/22 01:27:41
>902
例外を投げる場所と、catch節の処理内容によるのでは。
この例ではどちらもないので、AもBも変わらないと思います。
906デフォルトの名無しさん:04/10/22 01:28:05
>>904
取り敢えず、Concept::ave_signalのdeleteをしていないことと
要素数がlength * sizeof(double)なのは変だろうってことと
なんでmemset()するんだかってことが気になった。
907デフォルトの名無しさん
>>904
Conceptにコピーコンストラクタ書いてないとか?