C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは
>>2-20 あたり
4様
C++プログラミング入門(オライリー)の書評探してるんですが全然見つかりません。
薄くてよさげなんですがどうなんでしょう?
テンプレ差分
・[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スレ追尾
テンプレ終了です。
STLつかうと一気に実行ファイルサイズが10倍に?!
>>15 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
>>17 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
>>19 #include <stdafx.h>
後死ね。
>>20 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
>>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; //: 何故か単独なら表示される
}
行列計算用のライブラリで計算速度が速く使いやすいおすすめのものがあれば
紹介していただけないでしょうか?
std::wcout.imbue(std::locale("japanese"));
を加えたらうまくいきました。
(結果)
:
F
":"をUnicodeに変換したものとL":"が
一致しないのが原因みたいでした。
なぜこんなことに....
size_t s_len = mbstowcs(NULL,":",0); //2
size_t w_len = wcslen(L":"); //1
cのロケール設定し忘れてた...orz
setlocale(LC_ALL,"Japanese");//これがあれば一致した
原因はロケールの設定してなかったからですね。(お騒がせしました,,
>>25 Blitz++
boost::ublas
lapack
>>28 ここのスレには関係ない話なのであまり伸ばしたくないのですが
vc7.1ってlocaleをいちいち設定しなくても勝手にやってくれるのではなかったっけ。あれ?
すくなくても、俺はlocaleなんて設定しなくてもうまく表示してくれる。
もしかして、versionの違いかも。
STL周りは明らかにオブジェクト指向というより
関数型プログラミングの臭いがする。
そのへんのカオスつーかハイブリッド具合がC++っぽいんだろうけど。
なにこのコピペ━━━(゚∀゚)━━━ !!!
カオス?
意味わかってんのかな?
多分覚えたの単語を使ってみただけだろうけど・・・
ちなみにケイオスと発音しないと恥ずかしいよ
指定のディレクトリ以下のファイルを読み込む方法てありますか?
>>36 C++標準機能にはないので、各環境のスレで聞いてください。
>>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って、ワイド文字なの?マルチバイト文字なの?
一応独習C終わったんですが、このままCを深く掘り下げていくのと、
今の早い段階でC++に移行するのだとどっちがいいんでしょうか?
個人的にはオブジェクト指向のC++を使ってみたいような気はするんですが、
Cも理解しきらないうちにC++が理解できるのか不安なんです。
>>40 早めにC++に移れ。Cにしがみついていると嫌な癖がどんどん身に付いて、
後から引きはがすのに苦労するぞ。
Cは文法的な理解だけで十分。
ただし、アルゴリズム的な感覚が身についていない場合はもう少し
Cで勉強してからの方が良い。
他言語を既に習得している場合はそのままC++の習得に移っても良い。
>>40 一年や二年ぐらいで付いた癖なんて直すのは簡単なような気がするけど。俺にはわからない。
でも、早いうちにC++に移行したほうがいいのは確かだな。
もれなく、STLやBOOSTが付いてくるから楽しさ満点。
さらに、WIN32プログラムを組もうと考えたらMFCやWTLをやるにはC++の知識(たいした知識じゃないけど)が必要。
>>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)を表示するプログラムを作成し、その実行結果を考察せよ。
おことわりです。
これから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)
{
}
・・・・・
};
という表記を、「オブジェクト指向計算力学入門」という本で見つけました
コンストラクタの引数の後ろに、継承でもないのにコロンが付いて
コンストラクタ内の引数が非公開メンバに代入される事を意味するようですが、
こんな表記法を他の書籍で見かけることは出来ませんでした。
この表記法を使っていて、分かりやすく解説している書籍を紹介して下さい
とりあえず、イニシャライザでぐぐっとけ。
それと、この書き方を書いてない本は窓から投げ捨てておくこと。
他の書籍のタイトルをさらしておけ
57 :
デフォルトの名無しさん:04/09/29 15:17:30
派生クラスでは、どうあがいても関数呼び出しが
仮想関数テーブル経由になってしまうのは避けられないのでしょうか?
高速化の必要から悩んでいます。
>>57 テーブル経由になるのはvirtual指定したメンバ関数だけだよ。
派生クラスは関係ない。
>>58 おおお!ありがとうございます。
基底でvirtualが指定してある関数の場合は、派生側同名の関数で
例えvirtual指定が無く、かつ派生型ポインタで呼び出しても駄目ですよね?
その場合は同じ振る舞いのメソッドを、派生側で別に用意すればいいのか…。
いや本当に助かりました。
>>59 基底クラスのメンバー関数がprivateで無い限り派生型でそのメンバー関数を呼べるよ
つか仮想関数でもコンパイル時に型が確定してりゃvtblなんか経由しないコンパイラもある。
もしくは基底クラスの関数で派生のメンバー関数を使いたいなら
template<class T>
struct base{ void fun(){ static_cast<T&>(*this).fun(); } };
struct My : public base<My>
{ void fun(){} };
でokのはず。
>>61 そうなのか。でもVC7.1は違うだろうな。
VC7.1でも出来るんじゃないの?
コンパイルタイムで明らかなのであれば
例えばこんなん
class po
{
public:
virtual void f() = 0;
};
class null : public po{ (ry };
void hoge()
{
null n;
n.f();
}
しばしば、「仮想メンバー関数の呼び出しは遅い」
というトピックが提供されるみたいだけど、実際どのくらい遅くなるのでしょうか。
目に見えてパフォーマンスが変わるものなのでしょうか。
実測した人とか居ます?
仮想関数でもinline展開してくれるコンパイラならいいんでは
//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;
}
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_; }
$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?)
仮想関数でパフォーマンス低下に大きく影響を与えるのは
vtable 経由になることではなくインライン展開できないことだと思う。
//おまけ ポインタ経由しないとき
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
まあ、他のコストがテーブルの初期化と正しい関数のオフセットへのアクセスだけだからねえ
get()が十分重い関数のときには律速段階にならない罠
一言でいえばほとんどまったく影響ない
>>67 get()が軽い場合と重い場合で
VirtSub / Virt
NonVirtSub / NonVirt
を算出してみてよ
要するに仮想関数であることを問題にするのは、
他の最適化をやりつくした後でいいってこと?
まずは設計ね
81 :
デフォルトの名無しさん:04/09/29 20:31:58
教えてください。
VC6.0でダイアログベース+MFC+winsock2で、サーバを作ってます。
で質問なんですが、あるクラスのメンバ関数ってスレッド化する事ができるでしょうか?
つまり、クラス内のメンバ関数ってプログラム内でクラス定義されて初めて
関数のメモリが割り当てられるような気がするんですが、
例えば、
_beginthreadex(0 NULL, Func ・・・
このFuncがメンバ関数の時、そのアドレスがわからないような気がするのですが。
親切な人お願いします。
VC6とVC7で違ってくるのかな?
VC6だと仮想と非仮想に全く違いがなかった。
VC7だと非仮想関数と、ポインタじゃない呼び出しの仮想が同じくらい速くなった。
>>66の指摘している通り、VC7で明示的にインスタンスを作った場合は、テーブルを使わないみたい。
//----ケースA
CHoge* p = new CHoge;
p->VirtualFunc();
//----ケースB
CHoge obj;
obj.VirtualFunc();
このA,Bの2種類では、Bはテーブルを使わないようです。(VC7の場合)
>>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, ・・・
ということは VC6の最適化機能は不完全?スタンダード版?
VC++とC++って別物なの?
86 :
デフォルトの名無しさん:04/09/29 20:49:12
最適化に完全も不完全もねえだろ
ある意味、ボランティアみたいなものじゃん
>>85 C++は言語名でしょ。
VC++はC++ソースのコンパイル環境。
MicroSoft C/C++コンパイラという意味。
他にはBC++やg++などもある。
>>85 C++ :プログラミング言語
VC++:MicrosoftのC++コンパイラと周辺ツール類の製品名(の略称)
>>86は貧乏でGCCを使おうとしたが難しくて使えなくてBCCで我慢してる
誰か、VC6で試してくれないか?
>>82の意外な書き込みが気になる。
あんがと。しかしわかったようなわからんような。
どうやらBACICから始めたほうがよさそうだな。
ポケコンかお
>>92 それはどうかと...
ところでポケコンって今日びまだ売ってんの? いくらくらい?
>>93 結構進化してるよ。
2〜3万くらいじゃない?
PDA使ったらポケコンって用済みじゃない?
手軽にプログラミングするならPCがあるし、PDAでもシリアル出力できるし。
>>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);
3万あれば自作して(中古じゃないと無理かな?)PC-UNIXがいいような気がする。
>>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
デバッガで混合表示したほうが早いと思うが
何はともあれVC7が圧勝
>>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;}
-------------------------------------------
自分の環境での
>>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
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
105 :
40:04/09/29 22:52:25
>>41-
>>43 亀レスでスマソですが、レスどうもです。
まだまだ経験が浅い自分だけではふんぎりが付かなかったので、
非常に参考になりました。では、C++やってみますー。
106 :
36:04/09/29 23:37:38
>>37 標準でないんですか (´・ω・`)
>>38 ソースまでわざわざありがとうございます。
>>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で誰かやってみて〜
>106
そもそもディレクトリがない環境っていうのもあるんで。
>>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;
}
結果はご自分の目でお確かめください.
109に関して補足するまでもないとは思いますが,
このような仮想関数呼び出しのコストが致命的になるのは
コード全体の中でその仮想関数呼び出しがホットスポットになっていて,
なおかつ仮想関数内部の処理が十分軽いときに限られます.
いずれにせよ効率の話なので,この手のことを気にするのは2の次にするべきでしょう.
後,効率の話をするなら99さんの言うように結局はアセンブリを見ないといけないんでしょうね.
す,すいません.109の最後のprintfですけれどtypoです.
>printf("ptr-v:%u\n", clock() - t);
printf("ptr-v:%u\n", t2 - t);
恥ずかしいったらありゃしない.
サーバーでデータ処理でもするんじゃなきゃ、呼び出しコストなんぞ考える必要もない時代だよなぁ。
組み込みで8ビットCPUでC++使ってるなら考えないといかんけど。
std::vector<int> a;
std::vector<int>::iterator i;
i = a.begin;
と括弧を書き忘れたのにコンパイルが完了してしまいました
std::vector<int>::iterator i = a.begin;
はエラーとなり、コピーコンストラクタと演算子の違いということは分かるのですが
なぜ代入できるのでしょうか?
コンパイラのバグ。
>>114 そうだったのですか。コンパイラを書き忘れていましたがVCのver6でした。
for(のループ変数がスコープをはみ出すので
>>113のように書いたところ間違えてしまいました。
完全にはめられていますね。
いい加減VC6は捨てろ
117 :
デフォルトの名無しさん:04/09/30 07:58:01
プログラムの本質的な意味を理論的に説明してくれる人いませんか?
プログラムの本質的な意味?どういうこと?
>>119 少なくともどういう経緯でその質問が出てきたのか書いてくれんと答えられん。
>>119 ある作業を自分以外へ通知・委託するための行為。
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' : 依存名は型ではありません。
とエラーが出るのですが、何故でしょうか…
>>123 - typedef s<T>::u u;
+ typedef typename s<T>::u u;
>>124 即レス感謝です
Tに依存することを失念してました、、失礼しました…
とあるクラス 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") がリークする?)
デストラクタが例外を投げるという設計が120%間違ってる
>>127 漏れが設計したクラスではないので・・・
とりあえず release してから reset することにしました。
>>128 俺ならその例外を握りつぶすラッパクラスを作る。
デストラクタが例外を投げてはいけないことはまともな本を
読んだことがあれば必ず書いてあるはずなんだがなぁ…
いまだにそんな設計をする人間がいるのか(_ _;
>>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 が参照)
>>133 で、その本の11章のプログラムはどんな物ですか。
説明不足ですよ。
すいません二重投稿してしまいました。。。
以下、ソースコードです。
/* 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()
{
(略)
}
(略)
/* 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;
}
手元にある本がCの本で(まだ読んでない
手元にあるソフトがVC++とVB6.0なんだけど
Cの本を読んでVC++の役に立ちますか?
まったく別物なら素直にVC++の本買おうと思うんだけど
ちょっと貧乏で3週間は買えないから。
プログラムはまったくした事ないのでパラパラ本を見ても(cとC++の違いが)よくわかりません。
>>137 言っておくけれど、VC++とはMicrosoftのソフトの名前で、言語はC++なのですよ。
だから、本を買うならVC++と書いてある本よりもC++と書いてある本を
買うのがよろしい。
また、C++はCの拡張言語なので、Cを知った上でC++を学ぶのが正当な学習です。
ちなみに、Cを覚えるときの参考書は プログラミング言語C、
C++を覚えるときの参考書は C++ Primer、
がおすすめです。
>>135 それはテンプレートクラスの実装を別ファイルにしているのが原因。
現実的な話、ほぼすべてのコンパイラはそれをサポートしていない。
解決法はヘッダに実装を直接書くしかない。
>>138 詳しくありがとうございました。
Cの本をじっくり読み進めてみます。
>>137 C++を学習するのにCを先に学習せねばならないかは、どちらとも
使える人間の間でも議論のあるところ。俺個人は必要ないと
思っている。それから、VC++を使おうがBCCを使おうがC++を学習
しなければ使いようがない。VC++の本とか言ってVC++という
ものすごく環境依存の本を読むよりも、C++という言語については
その専門書を、VC++という環境についてはその専門書を、別に
読むことをお勧めする、金がなくても。結局はそれが近道。
Cの内容を兼ねたC++の本も多いような気がする。
というか自分がそれに騙された。Cの入門書をただC++に
直しただけの本。
>>139 どうもありがとうございます。
ヘッダに直接展開したらMAKEできました!
ファイルをまたがってのテンプレートはできないのですね。
勉強になりました。
>>137 Cの勉強は要らないに一票。
あと、書籍代を惜しんでいては勉強は出来んぞ。
どうしても金が無かったら図書館を利用すべし。
政令指定都市クラスならなら公立図書館でも
プログラミング書は結構置いている。
Cはの勉強はいらないと言っている奴はたぶん学術的な下積みも無いに違いない。
高卒プログラマかな。
C++やるならC++で勉強すりゃいいよ。
>>137 図書館だったら返さないといけないから忘れた時に調べたい
とき不便。基本的には買う方がいいような気がする。自分は、だけど
実際、あれはどうだったっけって思った時本無いから不便に思った事あるし。
>>148 同意。
しかし最近は結構ウェブで事足りることも多いからなぁ
ここで質問するのもどうかと思うけど
今勉強するべきプログラミング言語ってなにがいいかな?
自分で思うのは
@JAVA
AC
BVB
なんだけど。
アングラ探してPDFをDLしろ。英語版か中文版しかないが。
タイ━━━━||Φ|(|゚|∀|゚|)|Φ||━━━━ホ!?
いまどきCなんかやってクソッタレなCの文字列処理関数とか覚える暇があるんならアセンブラでもやったほうがまだマシだろ。
まさにスレ違いの流れ!
アセンブラって言語?
(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#に置き換えられていくのでは
ないだろうか。
アセンブリ言語をアセンブラでアセンブルしようか。
コンパイラは知ってるぞ。漫画だよな。
アセンブラも知ってるぞ。漫画だよな。
158 :
デフォルトの名無しさん:04/10/01 03:11:35
おまいら、これでも実行してろ
E8 FD FF
バイナリエディタを使うんですね
>>146 学術的な下積みって何?
駅弁大学で万年助手すること?
C++できるってことはCもできるんじゃない。
ていうか
>>153に同意
スレ違いは分かってて質問するけど(何故ならC++が好きだから)
日本以外に行ったら三文字表記は今でも使われてるのですか。
??=include <iostream>
int main()
??<
int n??(1??)={10};
cout<<"Hello, World??/n"<<n??(0??)<<endl;
return 0;
??>
なんかすごいよね。
あっusing namespace std;が抜けてる
ならCでパターン全部書いてみろと
>>152 こんな風に考えているのが大勢いるんだろうね。
着眼点が下等すぎ。
>>165 釣られんな(w
ユーザライクな文字列処理を必要とする人がアセンブラに走るわけがない。
>152
あの突っこむべきかどうか本当に必死に考えた結果、突っこみます
ここC++のスレです
ここはCwwのスレじゃありません。
派生クラス固有の値を派生元のポインタから仮想関数経由でセットする方法を教えてください。
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・・・といろんなサイズ・型の各派生先固有の構造体があります。
↑の人の使わせてもらうけど
class A{
public:
virtual void Initialize( void* )=0;
};
class B : public A{
BStruct bs;
public:
virtual void Initialize( void* p){
bs = *(BStruct*)p;
}
};
こんな感じに段落をつけてる(文の最初に空白を数行いれてる)のは
見易くするためだけ?
>>170 dynamic_castとかCOMのIUnknown::QueryInterfaceみたいな仕組みを導入するとか。
つーか派生先で独自の初期化関数作ればいいじゃない。
>>170 受け渡しに使いたい派生クラス固有のオブジェクトをboost::anyかなにかで渡せば?
175 :
デフォルトの名無しさん:04/10/01 19:45:37
>>170 保証がないということは、
正しくなかった場合にどうしたいのかを
まず決めなければ話を始められない
bs = *(BStruct*)p; というところを
bs=*dynamic_cast<BStruct*>(p); としても動作するようにいたるところ修正...とおもったけど
BStruct は構造体で無いとだめ?
177 :
デフォルトの名無しさん:04/10/01 20:22:15
>>176 dynamic_castに必要な条件を述べよ
>>177 わかんない。まわりくどい事いわないで教えろ
179 :
デフォルトの名無しさん:04/10/01 20:25:31
キャスト前のポインタの先に virtual
つ仮想関数
サンクス。
キミたちに幸せが来るように祈ってる
183 :
デフォルトの名無しさん:04/10/01 20:29:35
おまえらみんな金ヤンだ
この流れにワラタ
>>183 _._
_|_|_|_ |_|_| / __ ___
| |_| |_|_| | ヽ
| /| | \ | ───一 |
|___ ノ | レ ヽ_ _ノ
_/__〃 | _|_ __
/ __ | .| / / ヽ
/ | | / / |
/ ヽ__ レ ノ \/ /
へ へ|\ へ √ ̄| へ
( レ⌒) |\ ( |\)| |/~| ノ ,__√ /7 ∠、 \ . 丶\ _ __
|\_/ /へ_ \) | | | |∠ | |__ | / ! | | |_〜、 レ' レ'
\_./| |/ \ .| |( ̄ _) | ) | | i | へ_,/ ノ ,へ
/ / ̄~ヽ ヽ. | | フ ヽ、 ノ √| | ! レノ | !. \_ ー ̄_,ー~' )
/ /| | | | | |( ノ| |`、) i ノ | | \_ノ ノ / フ ! (~~_,,,,/ノ/
| | | | / / | | . し' ノ ノ | | / / | |  ̄
\\ノ | / / | |___∠-". | | ノ / ノ | /(
\_ノ_/ / (____) し' ノ/ / / | 〜-,,,__
∠-''~ ノ/ (_ノ 〜ー、、__)
>>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してやるくらいで十分です。
つまり、未定義ではなく何らかの保証をするってことだな。
>>188 そういうことですかね。
boost::anyを使用することによって少なくとも希望の型が渡されたことが保証できますね。
boost::any_castはtype_id で判定しているのですね。
今回の用途にはこれで十分だと思われます。
みなさんありがとうございました。
実行時にユーザープログラムが型判定しなきゃいけない例ってのは
どんな場合なんでしょう?
スクリプトの実装くらいしか思いつきません
・ドラッグ&ドロップ
・コピー&ペースト
・アーカイブファイルからの読み込み
192 :
デフォルトの名無しさん:04/10/02 16:07:49
printf("");
って一見何もしないように見えて厳密には一体何が起こってるんでしょうか?
これを書くとエラーが出ないのに省くとメモリ関係のエラーで強制終了でした
コンパイラはBCC32です5.5です
謎です 紐解いて下さい
>>192 引数をケツから積んでるかと
>これを書くとエラーが出ないのに省くとメモリ関係のエラーで強制終了でした
おそらく別の箇所でスタックを壊したりしてる予感
周りのコードを見直して見れ
194 :
デフォルトの名無しさん:04/10/02 19:20:28
処理系によって扱いが違うのかも。
"" が格納されている位置の前に格納されている
別の文字列に対してオーバーランな書き込みしてるとか
"は文字列ではありません。"は区切り記号です。
return でなく exit で終了させて問題が起こらなければ
スタックの異常
>192
あーおんなじ状況になったことがある
メモリまわりのバグなんだよね
不適切なメモリアドレスを操作していないかチェックしたほうがいいよ
何故にprintf("");を記述したのか...
""はサイズ0の文字列で終端コードである"\0"は含まれるからね。"\0"と書いてあるのと差はない。(はず)
それが格納されるのはあたゆる初期値付き変数と同じところになる。(そうじゃない場合もあるが)
当然それの前の部分でオーバーランをしていたらクッションになってくれてることも考えられる。
静的関数だけで構成されていて、インスタンスなんか作っても何もないので意味無いクラスを
つくっても良いものなのですか?なんかアホっぽい質問でスマソ
>>202 作りたかったら作ったら良いけど、
その関数をnamespaceに入れたらすむんでないけ?
自分もそう思ったのですが、名前空間のネストが深くなって打つのが面倒になったとか、
単にズボラしたくなったとかで、使う人間(他人でも自分でも)がusing namespaceした時に
(例)play()やresume()とかよくありそうな名前がかち合うのではないかとも思ったのです。
Cの時のようにxxx_プレフィックス(gtk_somefuncとかssl_somefuncとか)付けるのもアレなので
クラスで囲んでおけばいいかなと思ったので。
何か勘違いしてたら指摘してくれると嬉しいです。一人でやってると分からんことが多いので。
namespaceもstaticメンバ関数も打鍵量は全く一緒じゃないか?
JavaのMath系なんかみたいに、static関数前提のクラスというのもあることはあるよ。
Javaは名前空間グローバルな関数が作れないという事情はあるけど、
C++にもtraitsなんかがあるしね。
Effective C++にも、namespaceの代替手段として載っている。
だけどnamespaceの完全な代用には出来ない、ともね。
ただ、using namespaceを前提に考えるのはどうかな。
using hoge::hage; を使うのを推奨するけどね。
(using std::stringとして、ソース内ではstd不要のstringだけで使うとか)
あれは namespace が使えない場合でしょ?
クラスにする意味がないんだからこういう設計は絶対しないよ
「絶対」ではないよ。
traitsという例をわざわざ挙げたのに。
template引数ってのはnamespaceが使えない状況じゃないの?
210 :
デフォルトの名無しさん:04/10/03 09:07:49
Ruby >>>>>>>>>>>>>>>>>>>>>> なめsぱcえ
>>209 そうだよ。
>>208はまだお風呂からでてシャツを着ただけの情況なのでしょ。残りはスッポンポン。
Rbuyb >>>>>>>>>>>>>>>>>>>>>>.Rubyho!!!!!!!
209って具体的にどういうことなんですか?
>>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になってるのですが、
なぜなのでしょうか?
>>201 ""はサイズ1の配列。"\0"はサイズ2の配列。
誰も配列ではなく配列へのポインタだって所には突っ込まないのね
>>220 C++では文字列リテラルはconst char[n]型である。
プログラミング言語C++第3版5.2.2「文字列リテラル」を参照
>>215 ロケールが管理しているオブジェクトだから。
VC6の頃はデストラクタはPROTECTEDマクロ=publicだった。
VC7でPROTECTEDマクロ=protectedになった。
意味わからんね。
ばーぁ
225 :
デフォルトの名無しさん:04/10/05 00:17:03
なんでC+ではなくC++となったのか
だれかCをBASIC風に機能削減したバージョンのC--を作ってください。
Ruby!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>229 お前Rubyの事ほとんど知らない奴だろう?
231 :
超絶Rubyhakka−:04/10/05 00:38:41
Ruby!!!!!!!!!!!!!!!!!!
最近の小学生は激しいな。
>227
>だれかCをBASIC風に機能削減したバージョンのC--を作ってください。
Cって言語の基本的なことはとても少ないと思うんだが…
特許ってうざいよね。
アイデアを特許にする人たちは俺から見たらお気楽だけど。
実際に特許の部分を有効活用して開発する人たちの血と汗と涙の結晶は特許の前では意味を
なさなくなるんだからやってらんないのでわ。
ま〜勝手にアイデアを使われて怒るのは分るけど
だからといって、訴訟を起こしての損害賠償が高すぎ。
今日の特許の乱立実態だからこそ、損害賠償額のルールを決めたほうがいいような。
もしかしてガイシュツだったりする。
std:auto_ptr って何で get メソッドを持ってるんですか?
ポインタの管理を全て auto_ptr が面倒見るから利点があるのだと思うのですが
>>238 生ポインタを引数に取る関数とか呼び出せないじゃん
>>236 >Kodakの特許はWang Laboratoriesのイメージングソフトウェア部門が開発した技術を
>Kodakが1997年に買い取ったもので、2個のソフトウェアが協調動作する技術、
>つまりオブジェクト指向プログラミングのキーコンセプトであり、
>ユーニス氏によれば、1960年代に開発されたSimulaコンピュータ言語にまでさかのぼることができるという。
公知で特許成立しないんじゃないの? 解説よろしく
よくわからんがC++のクラスは大概の実装において仮想関数ポインタのテーブル持ってるだけだから、
逆にそれが特許侵害と認められるとCなどの非OOのコードすら危うくなってくるわけだ・・・。
>>241 ちょっと見てみたけど、もっと抽象的なレイヤーでの特許みたい。
OOベースのRPC (Remote Method Invokation の類) と、ORB の基本概念あたりをカバーしてる。
出願時点(1993 年)に既に公知だったような気がするけど・・・
スラドが大好きそうなネタだけど誰もたれこんでないのん?
245 :
デフォルトの名無しさん:04/10/05 20:00:33
>>239 生ポインタに限定って時点でSTLじゃねえな
246 :
デフォルトの名無しさん:04/10/06 00:34:43
ヘッダにusing namespace xxx;使う場合と、
ソースにusing namespace xxx;を使うのとでは意味が違うんでしょうか?
>>246 どんなしょぼい参考書にも必ず書いてあると思うが。
意味は同じ。
効果範囲はスコープ内。
249 :
デフォルトの名無しさん:04/10/06 00:48:54
>>248 ヘッダはグローバルスコープで、
ソースだとそのファイルがスコープになるということかしら?
書いた場所から次の
}
まで。普通のauto変数と一緒。
>>246=249
C++にヘッダとソースの区別なんか無いよ。
ヘッダを#includeした先でusing namespaceしちゃうから迷惑
253 :
デフォルトの名無しさん:04/10/06 00:53:01
>>250 なるほど!
たとえば、
usingnamespace std;
Unko::Unko() {
}
Unko::~Unko() {
}
これだと、コンストラクタだけ、usingnamespace std;が有効になるということか。
変な仕様だなぁ。
頼むからヘッダファイルで using namespace しないで欲しい
>>253 それじゃauto変数と一緒じゃないだろ
{
using namespace std;
string hoge0;
}
std::string hoge1
string hoge2; //エラー
エラー ;がありません。
258 :
デフォルトの名無しさん:04/10/06 08:31:25
>>255 ↓のように書いた場合は、どこまで有効になるの?
----Hage.cpp-----------
#include <stdio>
using namespace std;
Hage::Hage(){
}
Hage::~Hage(){
}
-------------------------
>>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のほうで使えないのですが
どうすれば使えるようになるでしょうか?初心者なのでよくわからないのです。
教えてください。よろしくお願いします。
>>262 Date::yearが定義されてないに10000ホゲー
265 :
デフォルトの名無しさん:04/10/06 11:09:53
>>int Date::year;
262さんありがとうございます。これをどこに書けばいいのでしょうか?
わからなくてごめんなさい。。
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 宣言に関数の内容も一緒に書く)してもダメか?
コンパイラが悪いのでは?
270 :
デフォルトの名無しさん:04/10/06 12:25:55
>>267 VC はサービスパック必ずあてとけ
只でさえバグ(珍妙な仕様も含む)だらけだが、少しはマシになる
いい加減VC6は(r
C使いならVC6でもいいかもC++使うんならVC6じゃ話になんね
operator <<, >>の定義が別ファイルにあってヘッダを読んでないとかじゃないの?
ISO C++が策定されたの98年だっけ?
VC6もたしか98年だから対応して無くて当然だと思われ。
さっさと.NET2003に乗り換えれ。良いぞ。boostもLokiも動く。
コンパイラだけならただなんだろ?
275 :
デフォルトの名無しさん:04/10/06 13:09:11
時代考証については
>>274 が言っているのが正しい
VC6 は今でも思いっきり現役で、他に選択肢がなく ISO と違うと嘆いても始まらない場面が少なくない
VC6軽いんだよ…
VC6はC++ではない、と割り切って使えば構いません。
でも、C++スレで質問しないでね。
>>277 __closureだの__propertyだのが大量に入ってるBCBのコードはどうしましょう
窓から投げ捨てろ
>>278 奴は構文がC++に似ているDelphiの一種だと思え。
潔癖性が多いな
282 :
デフォルトの名無しさん:04/10/06 15:20:09
>>277 まだ ISO が定義する「C++」は出荷されていないはず
VC6 は ARM C++ と理解すればいい
>237 :デフォルトの名無しさん :04/10/05 14:44:36
> 特許ってうざいよね。
> アイデアを特許にする人たちは俺から見たらお気楽だけど。
> 実際に特許の部分を有効活用して開発する人たちの血と汗と涙の結晶は特許の前では意味を
> なさなくなるんだからやってらんないのでわ。
> ま〜勝手にアイデアを使われて怒るのは分るけど
> だからといって、訴訟を起こしての損害賠償が高すぎ。
> 今日の特許の乱立実態だからこそ、損害賠償額のルールを決めたほうがいいような。
> もしかしてガイシュツだったりする。
特許を誤解しているよ。特許ってのは役人と大企業のためにある。
そして損害賠償請求をする為に取得するんだ。
C++で書かれたゲーム(出来ればSTG)のソースコードを公開されているゲームを探してるんだけど
もし知ってるのがあれば教えてくださいな
追記、3Dのゲームでお願いします
サンクス!英語が辛いけど、読んでみまっす
あとこれの置き場所を見てsourceforgeから探すことを思いつきましたですYo
288 :
デフォルトの名無しさん:04/10/06 19:27:49
classや構造体の、メンバへのアクセスは遅いので、
ループの際はなるべく一時変数に取った方が良いそうですが、
これはやっぱり階層が深まるほど遅いのでしょうか。
A: temp = class->child->grandchild->great-grandchild->data;
B: temp = class->data;
それともAとBは、内部的には同じ速さになったりするのでしょうか。
>>288 君が気にしなきゃならないほど遅くないからほっといていいよ。
>>289 生成物の実行速度はほとんど変わらないが、
開発チームの保守速度は確実に低下する。
>>288 計ってみましょうよ.
VC++だったらこのスレの上にrdtscを貼ってくれたひとがいるし,(型は__int64でいいの?)
Linuxだったら
#include <asm/msr.h>
にrdtscはある.
間違えやすいし見にくいし横に長くなって鬱陶しいから保存しろ
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;
}
お前らは、プロもしくはノンプロのプログラマであって、断じてパスタ職人ではないはずだ。
誰ですか、スパゲッティコードを奨励している人は?
レスありがとうございます。
分かりやすくしようと、ちょっと大げさに書きすぎたかなw
実際はイテレータによるアクセス程度です
>>291 簡単なテストコードだと、吐いたアセンブラを見る限りどちらも
全く差は無いのですが、私が思いつかないような条件が重なったりすると
どうなのかなぁ…と思い質問お願いした次第なんです。
やっぱり皆さんのレスみても、まるっきり同じって感じでは無いですね。>ほとんど、〜ほど
負の数に%を適用した結果ってどうなるんですか?不定?
>>294 どう失敗したのか書けよ。
あとint配列の最後に0が入っているとは限らない。
>>298 つーか最初のループ条件で偽になるな、これ。
301 :
294:04/10/06 20:26:23
>298 最初に0が入ってるからループに入らないだけでした。Thx。
で、別な疑問が沸いたのですが、
int i[不定の自然数];
int *p;
p = &i[0]
で、iの終わりまで処理を行いたい場合、
whileループで回すにはどうすればいいでしょ。
while(*p == null){だとnullなんて知らんと怒られます。
>>301 頼むから、あてずっぽうでコード書くな。
なんか知らんけど動いたからいいやっつー新人が一番手に負えない・・・。
while( *p == null )
pの指してる先の値が null?
いつ終端に null なんか入れた?
つーかそもそも null 定義して無いだろ?
つーかそれだと *p が null の間繰り返すだろ。
304 :
294,301:04/10/06 20:31:00
>302,303
少し頭冷やしてきます....すいません。
>>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;
}
>>301 ARRAYNUM っていうマクロにするかどうかは別として、個数の定まった
配列に対してsizeof(T) / sizeof(T[0]) で個数を得るのはC / C++のイディオムの一つ。
C++ではマクロでなくテンプレートだな
template <typename T> int arraynum( const T& t ){ return sizeof( t ) / sizeof( t[ 0 ] ); }
template< typename T, size_t N > size_t arraynum( T (&)[N] ){ return N; }
だろ。
template <typename T, std::size_t N> std::size_t arraynum( T (&)[N] ){ return N; }
な
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
やっぱり気が狂ったようなところのある言語だな
カットオペレータを追加すれば、そのまま Prolog になりそうだよね。
俺は配列の要素数を求める式を見た時はふ〜ん、こんなこと出来るんだ。
ふつうにテンプレートってすごいなって具合に感動したけど、
char (&test(...))[2];
この式を見た時はマジC++に感動した。
普通の人間なら typedef なりして見やすくしろと思うだろうけどな
>301
sizeofで配列のサイズを測るか
その部分を関数化して、関数の引数に何文字操作するかをしてるするのかが普通。
まずは、配列と文字列の区別をしっかりした方がいいと思う。
あと>294のソースは
return i+48;
}else if((i<16)&&(i>9)){
return i+55;
この辺りは、頼むから、'0'や'A'って書いてくれ。
>>288 階層が深まるほど評価に必要な命令数は当然増える。
でも、階層に比例して処理時間が増大するかどうかは
最適化に依存するので実測しないとわからない。
ループ前に一時変数に取っておくようにソースを書いておけば、
ほとんどの場合で無視できる差に抑えることができる。
DLLで作ったクラスを、exe側で継承した場合、何か問題出る?
dll
EXPORT class DllClass{
・・
};
-----------------------
exe側
class ExeClass : public DllClass{
・・
}
exe側で派生クラスを使用
ExeClass *pExeClass = new ExeClass ;
delete pExeClass ;
問題なかったとしても、DLL変更したら、exe側もリビルド必要?
DLLとクラスは、やっちゃいけないけど動くこともあるとか微妙な説明が多くて混乱する・・
>>317 > DLLとクラスは、やっちゃいけないけど動くこともあるとか微妙な説明が多くて混乱する・・
これが問題。わかってんじゃん。
319 :
デフォルトの名無しさん:04/10/07 11:52:42
Cで構造体の中に構造体をいれてつかってんだけど
C+でクラスにしたいときってクラスの中のクラスってできる?
出来るにょ
321 :
デフォルトの名無しさん:04/10/07 11:55:40
1にょっき
包含っていう。
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++
コアチームに入るしかないな。
-z muldefs でりんくできないかなーー。
でも、どっちのstrcmpが使われるのかシラン。
いや、これはコアになれという要件だよ。
間違っても 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 ありがちなパターンで、ヘッダの最後を改行してないってオチとか・・・
>>331 根本的に設計見直せ。
と、それだけだとなんだから一応。
b.hの#include "c.h"を消して代わりにclass C;と書く。
ここでpimpleイディオムですよ
pimpl ダタorz
336 :
デフォルトの名無しさん:04/10/07 22:11:24
>328
試してみます。
>330
ちょっとはしょってかきましたけど、組み込み向けCPUのバイナリ作ってるんです。
卒研である機器の制御用のプログラム書いてます。機器側にはライブラリ持ってないんで、staticなバイナリの生成が必要です。
337 :
326=336=悩める初心者:04/10/07 22:12:50
です。m(_ _)m
てかそもそもここはgccに限定したスレじゃないのでスレ違い。
答えてる香具師も一緒にgccスレ逝け
339 :
超絶Rubyhakka−:04/10/07 22:15:07
ハァ?
#include <iostream>
using namespace std;
int main(){
try{
throw "nullpo!";
}
catch(char *e){ cout << "GA!" << e << endl;}
return 0;
}
なぜか文字列をcatchできないんですが、なぜでしょうか?
Cygwinのgcc3.3.1です。
Linux+sh3=Shnux
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 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 vc7.1でも死刑?ガクガクブルブル。
>>350 「const char[N]→char*の変換は、throwに対しては適用されない。」
ということでしょ?
353 :
悩める初心者:04/10/07 22:57:00
328さん、
-z muldefsでやってみたら、コンパイル通過しました!
リンクの詳細しらべてみましたけど、ちゃんと自前の関数読んでるようです。
ほんとありがとうございます。
#まだまだ勉強不足ですね。。。
試しに
catch(char *e){ cout << "GA!" << e << endl;}
catch(const char *e){ cout << "ga!" << e << endl;}
としてみると、
VC++では "GA!nullpo!"
GCCでは"ga!nullpo!"
となってしまう
catch(const char *e){ cout << "ga!" << e << endl;}
catch(char *e){ cout << "GA!" << e << endl;}
とやったらVC++でも"ga!nullpo!"と吐くんだろうか
>>355 今度はコンパイルできなくなった
test.cc(9) : error C2312: 'char *' : is caught by 'const char *' on line 8
嘘
バージョンによる。
2005 でも
error C2312: 'char *' : is caught by 'const char *'
VC++ Toolkit 2003
error C2312: 'char *' : is caught by 'const char *' on line 10
やっぱりコンパイラを作るときにMicrosoftが規格を勘違いしてる。
>>359 やられた。
つーか、発揮し言ってどうでもいい問題なんだけど。
bccだと順b
あ、誰も聞いてない
363 :
デフォルトの名無しさん:04/10/07 23:33:58
>>362 その先を知りたい。もしかして順番によって結果が変わる?
>>361,363
よくないだろう、正しいはずのコードがコンパイルすらされないんだから。
367 :
デフォルトの名無しさん:04/10/07 23:38:25
いや、char*がconst char*に先に捕まるのは当然だし、
コンパイルすらされないのはエラーレベルの設定の話でしょう。
>>365 そもそも正しいはずのコードとはなんですか?
お?なんか哲学的になってきたね
char* p;
p = "literal";
こいつにVC++7.1もg++も文句言ってくれません。
仕様的には
>>344なんですか?
>>370 あまりに多くなされる書き方なので文句を言わないようになってる
>>370 ISO/IEC 14882:1998 4.2 Array-to-pointer conversion -2による。
#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 は間違ったことを言っていないぞ?
例外が捕獲できるかどうかは、翻訳ではなく実行の問題。
オプションでいいからエラーにしてほしいな・・・。
どっちにしろそんなコードまともに動かないし。
>>374 残念ながら、確実な未来というのはあるのだよ。
規格的にどうかはともかく、
>>370が規格的に正しいのなら、
>>354はVC++のほうが自然に感じる。
困った規格だ。
禿はノーセンスだからね
379 :
デフォルトの名無しさん:04/10/08 00:20:59
>>376 基準が明確化されていない洞察をしてはならないのが基本。
コピーコンストラクタが排除できても private ならはじくように。
catch(const char*)にchar*が捕まるのって明確化されてないの?
>>382 「文字列リテラルはchar*に代入できる。」
プログラミング言語C++第3版 5.2.2より
文字列定数に書き込めたとしても、strchrで番兵法を使う
ときぐらいしかメリットが感じられなかった。バグ出しやすいし。
実用上は必ずコンパイルオプションで書き込めなくしてしまう。
>>385 「文字列リテラルはchar*に代入できる。…(中略)…しかし、
このようなポインタを介して文字列リテラルを変更しようと
すると、エラーになる。」
プログラミング言語C++第3版 5.2.2より
387 :
デフォルトの名無しさん:04/10/08 01:19:30
388 :
デフォルトの名無しさん:04/10/08 01:20:15
いや、厳密さは求めていないが・・・
いや、Cとの互換を保つため…
>>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
>>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
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
398 :
デフォルトの名無しさん:04/10/08 02:18:35
>>395 貴方は何かにつけて過剰な省略をする傾向が強いようですね。たとえば本を読むときに一度の何十ページもめくってみたり、
タバコを吸うとき一度に5本ぐらいくわえていたり、お好み焼きにはキャベツしか入れなかったり、食事のとき箸を一本しか持たなかったり、
してしまうタイプではないでしょうか?表現に不十分な部分がないか、チェックお願いします。
>>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 のコンストラクタから呼んでやる、ってことね。
派生元のクラスがひとつでも同じ結果かと思うんですが…
全角空白はいいとしても、スペルミスでエラーが出るソースを張るなよ
class Foo : public Base1, Base2 {
public:
Foo(int x) : x(x){};
};
そもそも曖昧以前に、基底クラスのメンバを直接初期化できん。
-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
全角はしょうがないだろ
この程度のちゃちなコードなら、実行よりパッと見の可読性重視でOK
2chブラウザ全盛の昨今、&nbsp;とかも厳しいのが多いしなぁ
ちと試してみるか…
Hoge* p_hoge = new Hoge;
うん、やっぱりコピペするとついて来ちゃうな…
409 :
デフォルトの名無しさん:04/10/08 14:28:01
質問させていただきます。
たびたび関数ポインタテーブルを使って処理してきたのですが、今度
クラスのメソッドでやろうと思ってプログラムを書いてみたのですが、
'int (__thiscall クラス名::*)(void)' から 'int (__cdecl *)(void)' に変換することはできません
とエラーがでてしまい、ダメなようです。
メソッドポインタでGoogleするとC++について語ってるところがさっぱり見当たりませんでした。
C++ではメソッドポインタを取得し、利用することはできないのでしょうか?
まともな本読めばメンバ関数ポインタの使い方ぐらい載ってる。
あ、なるほど。
メソッドではなくメンバ関数と呼ぶのですね。
メンバ関数ポインタでぐぐったら、色々出たのでがんばれそうです。
ありがとうございました^^
regexって何の略?
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;
}
ロケールあってる?
あともしVC6だったら標準ライブラリがバグってるからまともに使えないよ。(.NETは未確認)
416 :
>>414:04/10/10 19:22:07
>>415 ΩΩΩナ...ナンダッテー
VC6です。バグなのですね・・・
>>416 std::locale::global(std::locale("japanese"));
C++は糞だとまたもや証明された!
419 :
デフォルトの名無しさん:04/10/10 20:51:43
C++で2重のforループを使い実行結果が以下のようになるように
したいのですが・・・誰か教えて下さい。
A
AB
ABC
ABCD
ABCDE
>>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
ありがとうございました☆
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
int mycls::x;
>>424 undefined reference to mycls::x
これくらい読めるようになっとけ。
427 :
424:04/10/10 21:35:02
それをどこで宣言するのでしょうか?
myclsのstatic int x;がint mycls::xじゃないんでしょうか?
>>427 まずは宣言と定義の意味をきちんと調べること。
myclsのstatic int x; は宣言。これとは別に定義が要る。
これが定義になっちゃったら、このクラスを複数のファイルで使えないだろ。
要はこんな感じだ。
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()関数内で宣言すると同じエラーが発生するのは
なぜでしょうか?
>>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;
}
>>434 > まともなコンパイラならそんな糞な挙動しないと思うんだが。
グローバルなスコープを持つクラス変数を、関数内で定義はできないと思うが。
こういうコードでしょ?
int main()
{
int mycls::x;
}
C のグローバル変数もそうだが、グローバルスコープを持つものは関数の
外で定義しないと。
int mycls::x;
int main() {}
>>436 そういうことでしたか.了解しました.
長々とありがとうございました.
#
>>432 同じエラーが発生する
というのは間違いでした.まぎらわしいことしてすいません.
>>436 のようなコードで躓いていました.
fstreamからstd::string strに一行を読み込みたいのですが
getline()は何故か知りませんがstd::stringで受け取れません。
そしてfstream >> str;とすると一行読み込みになりません。
>>で\nまで読み込む設定があるのかと探してみましたが見つかりませんでした。
char[]の一時変数にとりあえず読み込むしかないのでしょうか?
>>439 std::getlineを調べてみてください。
C++ で Java の final にあたるものってありますか?
<string>にて発見しました。どうもです。
中身は私には解読不可能でしたが。。。
>>442 何をしたいのかもう少し具体的に書いた方が良い
それによって答えが変わってくると思う
継承を制限したいんだろうとESPを駆使してみる
コンストラクタをprivateにすれば?
>>446 先生、コンストラクタをprivateにしてもメンバ関数の中のローカルクラスで継承できてしまいました。
>>442 thisを見て、自分じゃなかったらエラー吐いて死ぬようにすりゃーいいかも。
ん名門無理
コンパイル時の制限じゃないと意味無いか
続けての質問ですがお願いします。
一行読み込んでその先頭位置と一緒に出力するプログラムです。
\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です。
>>448 どの関数でチェックを入れる?
まさか全ての関数に入れるとか?
ちなみにコンストラクタじゃムリだよ
tellg bug VC6 で多数引っかかりましたorz
>>453 もう解決しちゃったみたいだけど、一応。
Visual C++ Toolkit 2003では解決してたよ。
グローバルスコープにあるポインタを使うのと
ポインタをコピーして同じオブジェクトを指すポインタを複数
使うのでは処理速度とか違うの?
スマートポインタ云々は抜きにして。
>>455 前者と後者の違いをソースで示してください。
前者は普通のグローバル変数(ポインタ)
後者はあるクラスのメンバであるポインタを別のクラスの
メンバにコピー(別のクラスのメンバの方はコピー用に作成)
//前者
class Global
{
public:
static LPDATA pData; //コピーは行わない
}
//後者
class A
{
public:
LPDATA pData; //こっちでオブジェクト作成
}
class B
{
public:
LPDATA pCopyData;
}
B::pCopyData = pData; //コピーして使いまわし
>>457 メンバ変数は遅くなる。
const 修飾すれば速くなることがある。
どっちもループカウンタにでも使わない限り誤差の範囲。
459 :
デフォルトの名無しさん:04/10/11 11:58:03
>>455 そりゃグローバルの方が速いだろ
コンパイラによるがグローバルは最適化がかかりにくかったりするが
1つで済むものを複数で管理する必要はない
ただし「本当に1つで済むんだな?」と、自分に小一時間問いただしてみることを薦める
後者を使うことになるケースは多いから
メンバ変数はグローバル変数より更に最適化がかかりにくいよ
そうでもないよ
463 :
デフォルトの名無しさん:04/10/11 12:24:21
自分の考えと違う事実をコンパイラが古いからで片付けようとする態度は
相手が携わっている分野を侮辱していることがあるから気を付けた方がいいぞ
もっとも煽り目的ならこの限りではないが
VC++7.1 -O2
最適化前 0.991秒
最適化その 1.001秒
最適化その2 0.991秒
最適化その3 0.991秒
自分で試しもしないで個人サイトの情報を真に受けるバカはこれだから困るね。
465 :
デフォルトの名無しさん:04/10/11 12:35:30
なるほどVC使いだったかw
メンバ変数の最適化もかからないようなコンパイラよりはVC++の方がマシだろ
467 :
デフォルトの名無しさん:04/10/11 12:43:24
あ? メンバ変数の最適化?? 何の話だ
以下池沼だか上のサイトの盲信者だかよくわからん香具師は放置で
最近もどっかのスレでfomit-frame-pointer論争があったし、
特に最適化関連の話は、Web上の情報が本当かどうか自分で確かめた方がイイね。
自分で試した結果が絶対正しいと思い込んでる馬鹿がいるようなので補足しておくと、
そのサイトのサンプルコードがだめだめ。
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秒
倍近く速くなった。
- の行をメンバ変数にくくりだす必要がある。
+ の行をメンバ関数にくくりだす必要がある。
>>464 どんな最適化がかかってその結果になるのか教えてください。
> ループカウンタ用メンバ変数が書き換えられていないことが自明
m_pBuffer = &m_nCounter;
というケースをコンパイラは考慮しなくていいのか?
__declspec(noinline) =関数内部の挙動が分からないわけで、
コンパイラどころか、人手でも勝手に最適化(というか、省略)してはダメだと思うんだが……。
471訂正。
もうちょい調べてみたらSetValueの呼び出し自体が無くなってた。
これじゃ「まともな速度比較が出来ない」どころか、「まったく比較できない」
>>473 すまん。問題なかった。
# さっき試したときは同じ速度になってしまったんだが・・・。
結局のところ小手先の最適化なんぞコンパイラにかかれば無意味ってことじゃないか。
どうやってコンパイラの最適化を抑止するかって話になってるぞ。
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を使うには、その国の言語を指定しないと使えないってこと?
>>473 いや、やっぱり必要だった。
メンバ関数にくくりださないと、最適化後、のやつがrep stosに最適化されてしまって、比較にならない。
>>474,476
事態を混乱させてすまん。m(_ _ )m
SetValue を noinline 指定しないと、ループが消えて rep stos になってしまう。
実際のコードで、これをしてくれればハッピーだが、
これはベンチ用のもっともシンプルなコードで、現実的にはそう期待通りには行かないだろ?
俺らが必要なのは、ブロックフィルの速度ではなくて、メンバ変数のアクセス速度だから
>>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;
}
以上のプログラムコードで★の部分をコメントにすると、コンソールに何も表示されないのは、
なんででしょうか?
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;
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
どちらでもいい気がするのですが,気になります!!
クラスの設計としてはどちらが優秀でしょうか?
クラスの設計としてはfstream使った方が優秀です。
489 :
デフォルトの名無しさん:04/10/11 18:52:01
文字の幅(setw)や精度(setprecision)を使うとソースが読みにくくなりませんか?
やはりfprintf(pfstr,"%15s,%15.5f","Great Class",someDoubleValue)の方が簡単で(^o^)
fstreamならデストラクタで勝手に閉じてくれるのでfstreamの方が優秀です。
>>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にします
これで私の優秀なクラスがさらに優秀になります☆☆
>>492 コンパイラーは g++ , vc7.1, vc7.0, bc++ or vc6 この中のどれ?
デストラクタのcloseに任せると、クローズの失敗が美味く処理できないぞ。
クローズなんざ失敗しようがどうでもいい
>>496 クローズの失敗だけならいいが、fclose()はバッファのフラッシュもするから要注意。
なんてことは当然承知の上で言ってるんだよね?
498 :
デフォルトの名無しさん:04/10/11 19:42:49
fopenは失敗しても,fcloseが失敗するとは思えませんが,,,
fcloseの戻り値使ってるプログラム見たこと無いな・・・
仮に失敗したとして、ひ弱な人間どもにはどうすることもできまい。
501 :
>>492:04/10/11 20:01:37
>>498 リムーバブルディスクでメディア引き抜かれた場合とか、あとはメディア
不良で一部セクタに書き込めない場合。たいてい OS やライブラリが
バッファリングしてるから fwrite() は成功しちゃう。
おいおい、大丈夫かよお前ら。書き込み後のfclose()の戻り値チェックしないなんて有り得ねぇよ。
やべー
チェックするヤツの方がすくねぇよ
>>505 まぁ、用途によるよな。
別にファイル壊れてても構わん状況ならチェックしないだろうし、
定期バックアップを行うアプリを書いてるならチェックしないのは
論外。
俺もあまりチェックしてない。
507 :
デフォルトの名無しさん:04/10/11 20:59:21
わざわざ書き込み後のfclose()の戻り値チェックするなんて有り得ねぇよ
>>503が煽ってるだけなのか、まともなPGならチェックしてるのかどっちだ?
これだけの情報がそろってチェックしないやつの気が知れない。
今まで自分の書いたノーチェックなコードを正当化したいだけなんだろ。
いいんだよ、これから気をつければ。
fstreamは閉じるのに失敗したときどうなるの?
いや、C++スレだしさ、いちおう。
>>510 closeに戻り値有るよ。
ついでに badbit だか failbit だか立つよ。
closeに失敗したらどうすりゃいいですか
>>511 でも普通はデストラクタで勝手に閉じてもらうわけで
エラーコードを見てから考えろ。
fcloseの戻り値をチェックすればそれで書き込みが保証されると思ってる
バカがいるスレはここですか?
>>513 普通?エラーを検知できない方法がどうして普通だと言い切れるのかね?
エラーを検知できることの大切さを知らない
>>515は学生。
普通もう一回読んでベリファイ
だれだこんなに雑魚が群がる餌撒いたやつは
522 :
デフォルトの名無しさん:04/10/11 21:30:26
ネタかマジか解からなくなってきたのでageときますね
俺だよ。俺オレ
とりあえず示談金の前払いで500万円振り込んでおいてください
オレはチェックしねーよ。チェックしても、その後どーしよーもねぇじゃん。
エラーメッセージくらい出せるだろ
そこまで厳密にやりたいなら、CRTなんか使わずシステムコール直に発行しろよ。
書き込んだフリしてエラーが出てても黙ってるアプリはいやだな・・・
書き込んだフリしてエラーが出てても黙ってるのがCRT
Cathode Ray Tube だったら輝点の一つや二つ欠けててもmおndawe
おい、Cathode Ray Tube の輝点をヴェリファイできんぞ
534 :
>>492:04/10/11 23:11:34
誰か答えてください!
環境はVC6です。
>>534 ユニコードを使用するようにオプション変更してみると
ロケール設定しなくても動くかもよ。
ただの勘だけど。
うごかないし、そういうもんだ。
通常のロケールはjapaneseではなくCだし
537 :
デフォルトの名無しさん:04/10/11 23:28:00
>>536 通常のロケールがCだというのはわかりましたが、
なんで、それで表示されないんですか?
そもそもロケールってなんあんでしょうか?
ロケールって、わざわざワイド文字列の有効性をチェックするの?
例えば、Windowsだと WriteConsoleW() にそのまま流し込めば表示されると思うんだが、
ロケールに合わない文字を取り除く処理が入るってこと?
>>637 お前無能の極みだな
少しは自分で調べろよ
542 :
sage:04/10/11 23:32:40
543 :
デフォルトの名無しさん:04/10/11 23:34:02
>>539 体をはったギャグですね(プッゲラ
WriteConsoleWはすべてのプラットフォームでサポートされているんだ。
streamに対してprintf書式指定使いたかったらboost使えばええやん。
>>545 C++ではprintfは全部cout<<で置き換えるべきなのですか?
そうすべきだね
でもscanfはcinで置き換えられないhホ
>>548 自前でどうにかしたほうがscanfよりまだましだと思うが。
printf と sprintf の関係みたいに
文字列も stream と同じ様に扱うにはどうすればいいですか?
>546
どうでもいいと思う
いや、その、ごめん。ネタだったんだ。そんなに食いつかないで。
あわわ。
>>553の名前は間違いです。546です。
555 :
デフォルトの名無しさん:04/10/12 00:20:20
>>549 自前でscanf作るのと何か違うのか?
C++でのscanfのような危険どころを教えてください。
scanf
型安全じゃない事とか
559 :
デフォルトの名無しさん:04/10/12 00:30:48
型クルクルパーな奴が使う限り同じ
560 :
デフォルトの名無しさん:04/10/12 00:31:42
低脳のフリをすることを、自分が本当に低脳なことの隠れ蓑にする害獣ども
561 :
デフォルトの名無しさん:04/10/12 00:40:24
Rubysaikyou !!!!!!!!!!!!!!!!!!!!!!
正直、C++に型安全なんか期待していない
C++ で無名関数がサポートされるのはいつになりますか?
明日
明日という名の永遠
>>563 boost::lambdaでも使っとけ
boostは標準ではないのでまだ使いたくない。
→自分で実装するか。
→自分で実装してドツボ
→やっぱboost使うか
そんなこたぁない
自分で実装するぐらいならboostだろ
STLにもファンクションオブジェクトならある。
C++はtype safeで最高だな。
boost本もけっこう重いね
578 :
Ruby!!!!!!!!!!!!!!!!!!:04/10/12 05:00:19
糞本だろ。アレ
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でアクセスできるようにする方法はないでしょうか。
>>581 どうしても、どっちかからのアクセスは間接参照になる(けど、本当に遅くなるか?)。
あと、配列の方を実体とするなら、公開用の変数はポインタではなくて参照にするのが普通だと思います。
public:
int &a, &b, &c;
abc::abc()
: a(x[0]), b(x[1]), c(x[2])
そこでunionですよ。
>>582 コンストラクタがinlineじゃ無いと a, b, c が何をさしてるのか外からはわからないから最適化とかに影響を与えると思う。
ポインタの場合も同じ話だが。
>>584 unionだと、規格で保証されている訳じゃないから微妙に不安。
組み込み系とか、ポータビリティを意識しない場合にはやるけど。
そもそも変数を公開している時点で、最適化する時にはクラスabcを知らなきゃできない、と思う。
>>585 unionは、ISO標準C++では保証されてないの?
こういう使い方は保証されてない
>>586 メモリ配置がどうなるかは保証されてません。
でもま、実際ほとんどの環境で予想通りに動くと思うけどね。
>581
関数じゃだめなの?
int &a() {return x[0];}
>>581 つーかそういう時こそテンプレでしょ
public:
template<int i>
int Ret() const { return x[i]; }
えー?
>>592 int main()
{
abc a;
std::cout << a.template Ret<1>() << std::endl;
}
というかtemplateは不要だったスマソ
char *p=
でchar配列の先頭にポインタを合わせた後、
*pからこのchar配列の長さを知る方法を教えてくれないと泣きます。
教えてくれると喜びます。
char*だけ渡されてそんなの出来るわけねーだろアホか
>597
ありがとうございます。
三度の飯より喜んでおります。大体8飯くらいです。
601 :
デフォルトの名無しさん:04/10/12 18:06:31
もうstrcatなんてうさんくさいものは使わないでマロックで自分で結合する!
>>596 template <int N> int Hoge(char (&foo)[N]) {
char (*p)[N] = foo;
return sizeof *p;
}
604 :
デフォルトの名無しさん:04/10/12 21:31:51
606 :
デフォルトの名無しさん:04/10/12 21:41:20
あほばっかだな
まあ2chには色んなレベルの香具師が来るからな
609 :
デフォルトの名無しさん:04/10/12 22:45:47
なんだよ2匹だけか
メンバ変数の初期化順序なんですが
class A
{
public:
A(int a) : a_(a), b_(a*2), c_(b_*2) {}
const inta_, b_;
const intc_;
};
だと意図通りに初期化がされるのですが、c_の宣言をa_, b_の前に持ってくるとc_の値がおかしくなります。
初期化順が、コンストラクタの : 以降(イニシャライザって言うんでしたっけ?)の初期化順に関係なく
宣言順に依存しているからだと思うのですが、これは規格で決められているのでしょうか?
>>610 決まってる。初期化は宣言された順序で行われる。
>>610 つEffective C++, Exceptional C++
>>611-613 ありがとうございます。
>つEffective C++, Exceptional C++
C++やる人には必須なんでしょうけど…なかなかいい値段ですね…(´・ω・`)
あと、
>>610のclass Aのようにあるメンバ変数が他のメンバ変数に依存している設計はどうなのでしょうか?
constが無ければコンストラクタの{ }内で順番に初期化すればいいのですが
constが付いていると : の所でしか初期化の機会がありませんよね。
そうすると宣言順が重要になって、うっかり変えてしまうと…
こういう設計は良くないのでしょうか?
うん、設計がよくない気がする。
やっぱりクソ言語だな
>>614 ここまでの情報だと、実際のデータメンバはひとつにして、
おとなしくメンバ関数で値を返すようにするのが正解なんだろうな。
const_cast して代入しちゃえば?
619 :
デフォルトの名無しさん:04/10/13 00:25:04
>>614 必須じゃない
そんな値段で引いていたら本当に必須の本(PDF)が買えない
620 :
デフォルトの名無しさん:04/10/13 00:26:22
>>613 「つ」ってよくみるけど、どういう意味があるの?
つーか(ていうか)の略
( ・∀・)つ
これの手だろ。
623 :
デフォルトの名無しさん:04/10/13 00:30:00
>>620 手
モナー、ギコなど、猫の手であることが多い
いや↓の「つ」の部分でしょ
(・∀・)つ
625 :
デフォルトの名無しさん:04/10/13 00:31:17
性器か?
マジレスすんなカスども
629 :
デフォルトの名無しさん:04/10/13 00:36:00
>629
あれは$18だから買えないってことはないような・・・
631 :
デフォルトの名無しさん:04/10/13 00:39:52
数万円はする
632 :
デフォルトの名無しさん:04/10/13 00:41:15
633 :
デフォルトの名無しさん:04/10/13 00:42:42
634 :
デフォルトの名無しさん:04/10/13 00:43:52
んなわけねーべ
5のはFinal Draftで著作権が発生していない版だから合法・・・のはず・・・
>>5のPDFは違法。PDFじゃない方はFinal Draftなので合法。
ちなみに
>>5のISOで買うよりも何故か
>>635のANSIで買ったほうが安い。
内容は同じらしい。
0 == 0 で返される値って何型ですか?
bool?int?
>>639 cout << (typeid (0 == 0) == typeid (bool)) << endl;
>>641 640の何が?
#include <typeinfo>
か?
>>642 結果でしょ。
VC++6だとtypeid(0==0).name()がlongだったり
マジ!?
g++(3.3.4)でbool
このへん?
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.
>>645 当たり前っていったら当たり前な結果だな。うん。
どっちでも困らないが
オーバーロードの解決とか、template引数の推測とか、意味を持ちそうなところはいくらか思い当たるな。
int変数を都合よくchar配列に入れてくれる関数って無いんですか?
検索の仕方が悪いのか、別なのが出てきます。
int 100を元に、
char c[]="100";のchar配列と同等の結果を返す関数です。
>>649 const char *でいいんだったら
boost::lexical_cast <string> (100).c_str ();
とかもあるけど
配列だとコンパイル字に10進での桁数を求めないといけないんだよね
>>610の初期化順序の仕様のメリットを教えてください。
もしくは、そんな仕様になってしまった理由を教えてください。
ムシャクシャして決めた。
順番なら何でもよかった。
今は反省している。
コンストラクタで昇順、デストラクタで逆順に破棄されるほうが都合がいいから。
親子関係のあるオブジェクトを同時に持つ場合に、親が先に死んだら困る場合もあるだろ。
これが初期化パラメータ順に破棄する仕様にすると、初期化の順序をオブジェクトごとに
記憶しなければいけない。
実際にやるとしたら使用したコンストラクタを一個覚えとくだけだと思うが、かなり無駄。
親子なら子を殺すのは親の義務ではないのですか
私が直接殺すのは親だけではないのですか
659 :
デフォルトの名無しさん:04/10/13 19:25:19
std::stringに格納されたアルファベットの文字列を大文字が含まれていれば小文字にしたいのですが
(e.g. This→this)、どうすればいいでしょうか?
char character;
if (charcter <= 'A' && character >= 'Z')
charcter = character + 0x20;
>>659 for (size_t i=0; i<s.size(); ++i) {
if (isupper(s[i])) s[i] = tolower(s[i]);
}
>>659 string str="Hello, World!";
transform(str.begin(), str.end(), tolower)
transformだと日本語がダメ
664 :
659:04/10/13 19:45:53
>>660-662 ありがとうございます。1ヶ月かかって作ったショボいアプリがこれで完成します。
666 :
デフォルトの名無しさん:04/10/13 20:14:08
すみませんが質問させて下さい。
vc6.0+win32環境です。
ツールバーをカスタムドローしてボタンのアイコンを書いています。
NM_CUSTOMDRAWメッセージを処理してNMCUSTOMDRAWのRECTメンバ
からアイコンの位置を取得する時に、ドロップダウンを持つボタンのみ
縦の位置がずれてしまいます(XP環境でテーマ(manifest)を置いている時に限りです)。
何方か位置がずれない方法を知りませんでしょうか?
よろしくお願いします。
668 :
デフォルトの名無しさん:04/10/13 20:23:19
>667
そうします。
>>661 tolowerは英大文字でなければなにもしないことになっているからifは不要。
>>670 大文字じゃなかった場合どうなると思ってたんですか
>>663 >>659は「アルファベットの文字列」と言っているんだから別に
いいとは思うが、transformでダメなら自分でループ回しても
ダメなんではないか?普通はtransformも中でループ回してる
わけだし。
>>673 いまさらだけど、transformの第3引数にstr.begin()いれるの忘れてた。
std::wstringにしようよ
今時wstringなんてダレも使ってねーよ
>>673 自前のループなら、
前が日本語の1バイト目ならっていう部分を追加すればいいんだけど、
transformじゃそれが出来ないってことなんだろう。
で、それを受けて、
前が日本語の1バイト目であることを保存できるファンクタを使え、
というのが、
>>665なんだと思う。
使いまくってるが
fstream系がファイル名にwchar_t cosnt*を受け取れないからなぁ。
なんか片手落ち。
wstringってちょっと環境依存なところもあるよね。
stringもバリバリ環境依存だと思うが
UNIX上のgccなんかだとのっけからstd::wstringのtypedefがコメントアウトされてたりとかな…
MBCS対応basic_stringってありますか?
reverseとかfindが日本語混ざるとだめぽ。
CJK問題とか欧米の人々はアスキー以外どうでもいいと思ってるからなぁ
>>665,677
25.2.3 Transform -2
Requires: op and binary_op shall not have any side effects.
VC++でmbstring.hってあるじゃないですか、
あれって、MSの勝手な拡張なんですか?
CRTがjapanese-awareになって素敵なんですが。
あと、TCHARとか。
マイクロソフトはすげえ会社なんだよ
>>683 MBCS仕様のchar_traitsを自作してみたらどう?
>>687 MSの独自拡張。但しBCCでも結構使える。
MBCS対応のchar_traits作るのってまず無理だろ。
結局内部はwchar_tで入出力時に適宜変換しかない。
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 ); とするのじゃダメなのでしょうか?
ぽいんたじゃないから
>692
イテレータが渡される可能性があるので,&*でポインタを取得する必要があります.
(ポインタが渡された場合,&*は意味なし)
あ,ポインタもイテレータのモデルの一つか.
誤:イテレータが渡される
正:ポインタでないイテレータが渡される
>>691 んじゃー、サロゲートペアなんか考えるとUTF対応も不可能だし
C++の文字列クラスは実質ASCIIとUCS4専用で使い物にならないでFAなのか?
>>696 べつに ISO-2022 系列でも構わんが。いずれにしても固定長じゃないと
難しい気はする。
basic_stringのMBCS対応って、メンバ関数だけの問題なんじゃないの?
std::stringを継承して、
findとかreverseとかの、MBCS時に問題になるメソッドをオーバライドすりゃーいいだけのように思えるんだけど。
char_traitsは関係無いって言うか。
的外れなこと言ってたらごめんなさい。
ネット上か書籍でC++におけるマルチバイト文字列(+locale)の扱いに関する
良いリファレンスご教授願えませんか?英語でも構いません.
(もしかしてそんなもの無い?)
stringは継承しない方が・・・
char_traits は設計的にマルチバイトに対応できないというの結論でよろしいのか?
……数多の文字列クラスが巷に溢れているのも仕方なしだな。
Shift_JIS/CP932ならまだ16bit化とかいう冗談があるがEUC-JPやISO-2022-JPはそれも無理だからな。
UTF-16のサロゲートなしで行こう
>>701 文脈依存のバイト列を扱うために char_traits<T>::state_type っつー型が
定義されてるみたいだけど、これだけだと道具不足なの? どう使われてるか
調べてないので、何とも言えんが。
705 :
ああああ:04/10/14 02:01:44
wstring word = L"あいうえお";
とした場合に、wordには何かしらの文字コードが入ると思うのですが、
たとえば、UTF-16だとして、そのことはどこをみればわかりますか?
707 :
>>705:04/10/14 02:37:48
>>706 いや・・・全然スレ違いではないと思うのですが・・・
ようは、wstringあつかうときに、文字コードの何を使うかを何処で決定しているかを知りたい。
たとえば、それが環境変数で設定されている値だとか、何かの設定ファイルがあるとか・・・
windowsとunixでは、決定の仕方が違うとか・・・そういうこと。
708 :
デフォルトの名無しさん:04/10/14 02:40:39
マニュアルだろ
>>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
テンプレートを勉強中なのですが、以下のコードが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' を返すメンバ関数とみなします。
-stringT::size_type get_str(){
+typename stringT::size_type get_str(){
>>716 あ!そんな簡単なことだったのですね。
どうもありがとうございます^^
>>705 c_str()やbegin()から順にたどっていくのは?
hi?
ho?
がるぽ
723 :
デフォルトの名無しさん:04/10/14 22:20:04
ぬるッ
>>715 別にテンプレートの勉強するのはいいけれども、それは何かの
役に立つのかな…
template <typename charT>
class test {
private:
std::basic_string<charT> str_;
…
とかならまだ分かるが…
>>726 std::string::size_typeって例えばfindメソッドなどの引数の型になっているね。
これは大抵size_t型がtypedefされているものだけど、Alphaマシン
とかだと必ずしもsize_tとは限らないからstd::string::size_type
で宣言するんだよ。
>>726 そんなこと言ったら、 CharTraits や Allocator も引数に追加しないといけないんじゃないの?
>>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 ,.-‐ヽ レ'⌒ヽ/
`く.__ ノ ゝ--‐′
>>730 ハァハァお嬢ちゃんの臭いオシッコ飲みたい!!
(;´Д`)ハァハァハァ
>>730-731 言語系のスレでそういうのはやめてくれ、吐き気がする。
>>729 いや、まぁ、現実的にはそうなるかもしれないけれども、
例としての良さの問題だから。
別にstringをテンプレート引数にしても全然おかしくねーよタコ
放置しろよ
basic_stringをテンプレート引数にする意味がないからだろ。
string・wstring以外で同じメンバ関数をもったクラスなんてあまりないし、
そもそもテンプレートじゃなくて派生させるだろうし。
>>737 どうやってメソッドの引数や戻り値の型が異なるクラスを
派生でキレイに実現するのかぜひ教えてください。
仮想デストラクタをもたないクラスから派生するのはちょっと・・・
>>738 まずは、basic_stringと酷似するメソッドを持つクラスを
「string/wstringとその派生」以外で提示して頂いた方が良いでしょう。
そんなわけで、
私めはここにて縄を持って待ち伏せ致しますので、
>>738さんは屏風から虎を追い出してください。
自分が間違った事を言ったことぐらい素直に認めろよ
だから放置しろっつったのに
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?とか使うと効率はアップするんでしょうか
C++以前の問題。
パラメータ付きクエリを使ってない以上、何やっても効率は最低。
sprintfか、boost::format とか。
sprintf(s, "SELECT %s FROM %s", "col1, col2", "table");
750 :
デフォルトの名無しさん:04/10/17 18:15:53
>>749 御社では包括的sprintf使用禁止条約に調印してないんですか?
snprintf にして、戻り値もチェックすれば OK?
文字の前に@を付けるにはどうしたらいい?
例えば
こんにちは
おはよう
と書き込んで変換したい場合
@こんにちは
@おはよう
見たいな感じで開いてるTXTファイルに書き込み
C++でサンプルソース作って下さい。
754 :
デフォルトの名無しさん:04/10/17 19:38:47
自己解決しますた。
Stroustrup が禿なら、Sutter は髭だな
Sutter はあんまり話題にあがらないけどな
759 :
デフォルトの名無しさん:04/10/17 20:33:56
去ったんだろ
この秋一番の寒波
Scott Meyersはフサフサか
763 :
デフォルトの名無しさん:04/10/17 20:47:37
766 :
デフォルトの名無しさん:04/10/17 21:37:26
まつもと >>>>>>>>>>>>>>>>>>>>> ScottMeyeyeyers
だれ、まつもとって?
松本コンチータだろ
>>759はこの秋一番の豊作
才能を感じる
世界の中心で
愛を酒奉行
Scott Meyersってもっと年食った人かと思ってたよ。ちょっとビックリ。
おいらもびっくり
ブラウンがお気に入りなんですな
ifsream in("test.dat");
string line;
while( !in.eof() )
{
getline(in, line);
if( lineが1個以上の空白文字のみからなるとき飛ばす条件 ) continue;
}
のようにtestファイルから行単位で読み込む時、1個以上の空白文字
のむを含む行の処理をとばすにはどうすればいいのでしょうか?
>>773 line.find_first_not_of(' ', 0) == std::string::npos
>>773 if (find_if (line.begin (), line.end (), bind2nd (not2 (equal_to <char> ()), ' ')) == line.end ())
かな?
>>776 実はさっきちょうどトーカナイザの実装をしていて、そのメソッドの文字列を
タイピングしていたところだったりする。
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]
根本的に実装方法が悪いのかな
>>778 while(getline(in, line))
{
if (line.find_first_not_of(' ', 0) == std::string::npos)
continue;
}
>>779 sum 5.0 3.0↓
sub 3.0 5.0↓
sum 4.0 2.0↓
sub 3.0 12.0↓
↓ とか一マス以上あけても同じです、cygwinGCC使ってるんですがそのせいでしょうか。
[EOF]
今C++を勉強しています。
教則本をみながらやっているのですが、ウィンドウを作成するにもHINSTANCEやらよくわからない型がでてきます。
こういう教則本のソースなどは、隅々まで理解する必要がないのでしょうか。
とりあえず、コンパイルして(例えば)CreateWindowはどういう働きをするのかなどが理解できれば先に進んでもいいんですかね?
それC++ちゃう。Win32 APIや! だから、スレ違い!
んで、Win32 APIの関数はMSDNで調べるといいよ
ご指摘ありがとうございます。
スレ違いでしたか…すみません。
わからない関数があるときはMSDNで調べればいいわけですね。
>>784さんのスレも一通り読んで見ます。
ありがとうございました。
stricmp("AAA","aaa")
をC++流に書くとどうなるのですか?
>>787 まずはパラメータの個数と型を正しくする。
>>787 あーごめん、strncmp()かと思ったよ。stricmp()なんて非標準関数持ち出すとは思わなくてね。
で、その関数の仕様は?
>>788 stricmpのどこが非標準なのかと小一時間・・・
>>789 大文字は小文字としてstrcmpをしてくれます。
stricmp("AHO","aho") == 0 となります
>>783 プログラミングの前に、まずは適切なスレを見分ける能力を養え。
問題の切り分けなんて、本を読んだり実際にプログラムを読み書きしながら学んでいくしかないだろ。
795 :
デフォルトの名無しさん:04/10/18 22:03:40
com研究所のURL教えれ
>>790 stricmpは規格にない。それだけで十分だろう。
>>796 ここはC++のスレだぞ。
stricmpはCにはないがC++にはある。
>>797 ISO/IEC 14882:1998にはないが何か?
799 :
デフォルトの名無しさん:04/10/18 22:17:26
com研究所のURL教えれ
800 :
デフォルトの名無しさん:04/10/18 22:48:52
800ゲットですが何か?
やおいゲット!!
そうはいっても、gccにはあるみたいだね。
snprintfと似たような状況だね。
snprintfが標準になる日は何時だろう・・・。
つか普通の開発じゃsprintf()禁止令出るもんだし、はやく標準にしてもらいたい。
stricmpか
localまで考え出すとキリが無いわな
>>802 あれだ、stringstreamを頑張って使え
805 :
デフォルトの名無しさん:04/10/18 23:06:15
まっ、糞みてーなライブラリだけど、boost::formatでも使っとけ
806 :
カナガワ:04/10/18 23:42:04
MDIを使ったアプリケーションで、チャイルドフレームをSDIのように扱う方法はありませんか?
>>803 まさか locale と間違えてたりする?
808 :
カナガワ:04/10/19 00:03:54
MDIを使ったアプリケーションで、チャイルドフレームをSDIのように扱う方法はありませんか?
>>802 gccにあるだけで標準扱いかよ。
ウンコ野郎だな
812 :
カナガワ:04/10/19 01:34:12
MDIを使ったアプリケーションで、チャイルドフレームをSDIのように扱う方法はありませんか?
ない
MSの伝統
814 :
デフォルトの名無しさん:04/10/19 01:43:45
ない
int* p = new int();
std::cout << *p << std::endl;
std::cout << int() << std::endl;
VC6SP6
どちらも0になると思ったのですが、newの方は非0になりました。
(デバッグモード・リリースモードどちらも同じ結果でした)
C++的にこれは正しいのでしょうか?
>>815 正しくないです。
"If the new-initializer is of the form (), default-initialization shall be performed"
(5.3.4 New -15- より)
>>816 ありがとうございます。
VC6を窓から投げ捨てようと思います。
C++使いたいならVC6は使うなっていうやりとりをもう何回も見てきたが、
いっそのことテンプレにでもいれたらどうなんだ?
会社の事情でVC6を使わざるを得ない人もいるのよ。
820 :
デフォルトの名無しさん:04/10/19 21:37:24
ARM 仕様の処理系を ISO/IEC 14882 で論じるバカどもがまた蛆虫のように涌いて出てるな
1.start_engine
2.StartEngine
3.startEngine
みなさんは 1, 2, 3 のどのスタイル使ってますか?
自分はスタイルがAPIやSTLとかぶらないように
Java風な3を使ってるんですが、正直美しいとは
思えませんです。他に何かいいスタイルありますかね…?
>>819 だから、VC6はC++じゃないからあきらめろ、っつーかこのスレに来るな、ってことでしょ。
VC6が悪いんであって、VC6を使う人は悪くないよ。念のため。
>>821 ここでやる話ではない。むしろ、ここでやってはいけない話かもしれない。
824 :
デフォルトの名無しさん:04/10/19 21:56:51
識別名のつけ方は、パラダイムや言語の特徴に依存する面もあるから、いいんじゃないか?
>>821 3でいいと思うよ。2だとクラス名で被るし、1だとタイプ数が増える
826 :
デフォルトの名無しさん:04/10/19 21:58:14
>>821 どのスタイルというよりコーディング基準に従うだけだ
はっきり言われてなくても周り乖離しないように気をつけてる
>>821 (メンバ)変数は1
(メンバ)関数は2
3は最近知ったから,特に使ってなかったけどどっかに使おうかなぁと考え中
まだ社会に出てないお子ちゃまなので参考にはならんだろうけど
>>827 社会に出るまでにスタイルを統一しなさい
>>828 社会に出ればスタイルの統一なんて自分の一存ではできないだろ。
「統一しなさい」なんて言ってできるわけない。
なにいってんだ
>>828 いや、一応↑で統一してるんだけども…
でも
>>825のクラス名と被るの言い分は納得。
もう一度洗いなおしてみるかな。
コーディング規約スレもっと伸びないかな
ああいう情報もっと欲しいYO
くだらねえんだよ
833 :
デフォルトの名無しさん:04/10/19 23:52:19
ねぇ、C++を作ったってどういうこと?
一体Bjarne Stroustrup 彼は何を作ったの?
C++の基本的言語仕様を作った。
ちょっと待て。
>>815 そのコードはDebugビルドで実行していないか?
もしそうならReleaseビルドだとどうなる?
がーん
>>837 フフフフフフフフフフフフフフフフフフフフフフ
「フ」が10こ(ぐらい)で豆腐
なーーんちゃって!
全米が泣いた
ふとんがふっとんだーーー!!
842 :
デフォルトの名無しさん:04/10/20 00:37:11
ふっとんだのはふとんですか?
ふっとんだのはぬるぽです
グーでガッしていいですか?
ぶどうがぶっとんだ
846 :
デフォルトの名無しさん:04/10/20 01:15:49
ぶっとんだのはぶどうですか?
ふっ飛ばしたのは台風ですが。
なんかネタないんかい。
おまいら夜は激しいですね
激しいのは夜だけですか?
(*´ー`)漏れはまだまだ若いさ
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 *' に変換できません。
と出ます。理由がわかりません。何が間違っているのでしょうか?
i == 0 ? new B : new C の結果は何型?
>>852 B*ですよね?
でauto_ptr<A>のコンストラクタの引数の型はA*だからそのまま渡せると思うのですが。
std::auto_ptr<A> p2(new B);
が通るので正しいはずですよね?
もしかして私何か勘違いしてますか?
>>853 じゃi = 1なら
i == 0 ? new B : new C の結果はC*かい?
そうすると「?:」は返り値の方がダイナミックに変わる演算子ってことになるけど
>853
コンパイラは x ? y : zという演算の型を,
yとzの型を元にいくつかの複雑なルールに従って決めようとします.
そしてyとzの型が関係の無い型のポインタ型であるときには,
この演算結果の型を決めることが出来ずコンパイルエラーとなります.
ちなみにあなたがやりたいことは以下で出来ます.
i == 0 ? (A*)new B : new C
>>854-855 ああなるほどよくわかりました。
今まで何気なく?:を使ってたんですが、今回のようなことは気付きませんでした。
ありがとうございました。
857 :
デフォルトの名無しさん:04/10/20 16:59:20
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() {}
};
>>859 g++は警告出してくれるんだ・・・やさしいなぁ・・・。
struct X {
virtual ~X() {}
};
>>864 struct VirtualClass {
virtual ~VirtualClass() {}
virtual void Method() = 0;
};
仮想デストラクタが必要なのはこっちだろ。
866 :
859:04/10/20 18:14:46
おい、ちょっとまて。
>~X(){} がなければ怒られないのですが・・・
これどーゆーいみよ。
>>869 ~X() があればクラスだっていうのか?
871 :
デフォルトの名無しさん:04/10/20 21:40:55
うまくつながってないんじゃ?
>>868 ~X() があると NonVirtualClass にもコンパイラによって自動的にデストラクタが作成される。
おそらくg++はこの暗黙のデストラクタをvirtual指定無しとして扱って件の警告が出るのではないかと。
>>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;
}
876 :
デフォルトの名無しさん:04/10/21 00:17:59
>>876 エスパー以外は初心者か。おめでてーな。
「どうよ」っていう言葉ってどうよ?
ただのダウンキャストがどうかしたのか
どうよもくそもねぇじゃん。
まじめに読んで損した。
882 :
デフォルトの名無しさん:04/10/21 00:49:06
QueryInterface がどうだかって言いたいのか?
ファクトリを持ち出したところに何か隠された意味があるのではなかろうか
だめ!!もう限界。
>>874、答えを教えてください。
template<class T> T* Allocate( ptrdiff_t n, T* ) {
return (T*)operator new((size_t)n * sizeof (T));
}
こんなnewの使われ方をはじめて見たのですが、なにを表しているのですか?
動作させてみたところ、指定したサイズを確保し、コンストラクタは呼ばれないようですが。
「プログラミング言語C++第3版 」を買えばこういったことがすべて書いてありますでしょうか?
>>886 通常のnew演算子で呼び出されるメモリ確保の直接呼出しです。
その本には確かに書いてあります。
通常の方法ですか。どうもです
STLの中身を見ていたら上記のような疑問が山ほど出てきて一人で1000レス行きそうな勢いなので
素直に「プログラミング言語C++第3版 」で勉強してきます
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 ) にすれば
ちゃんと動いたのですが、こうするしか解決方法はありませんでしょうか?
そこでboostですよ
891 :
デフォルトの名無しさん:04/10/21 23:06:15
そこでるbyですよ。
>>889 fを関数オブジェクトに変えてmem_fun_refでいいんじゃいないの?
>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問題は良いい加減修正して( ゚д゚)ホスィ…
std::find_if( v1.begin(), v1.end(), std::not1( std::ptr_fun<const Widget>( &f ) ) );
の方が適切です.すいません.
>>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 &)' から減少できませんでした。
となってしまいます…
すいません.893, 894は誤りです.無視してください.
892さんが書いているようにfをファンクタにするのが良いと思います.
(mem_fun_refはいらないような?)
つまり
struct Hoge : std::unary_function<Widget, bool>
{ bool operator ()( const Widget& w ) const{ return false; } };
std::find_if( v1.begin(), v1.end(), Hoge() );
ということでしょうか…?
関数ではダメですか…
899 :
デフォルトの名無しさん:04/10/22 00:38:37
boostってソースしか参考にしていない…
実際に使うには標準じゃないし。。。
>>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;
}
どうしてもエラーがでるので教えてください
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));
}
のようにクラスを作っておいて、
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使ってやっているのですがここで詰まってしまいました。
分かる方教えてくださいまし。
>902
例外を投げる場所と、catch節の処理内容によるのでは。
この例ではどちらもないので、AもBも変わらないと思います。
>>904 取り敢えず、Concept::ave_signalのdeleteをしていないことと
要素数がlength * sizeof(double)なのは変だろうってことと
なんでmemset()するんだかってことが気になった。
>>904 Conceptにコピーコンストラクタ書いてないとか?