9 :
デフォルトの名無しさん :04/10/24 00:05:39
age
10 :
v(^・^)v :04/10/24 00:06:29
STLつかうと一気に実行ファイルサイズが10倍に?!
11 :
v(^・^)v :04/10/24 00:06:52
>>10 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
12 :
v(^・^)v :04/10/24 00:07:19
>>11 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
実行ファイルなんていくら大きくなっても気にしない
15 :
v(^・^)v :04/10/24 00:08:49
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
17 :
v(^・^)v :04/10/24 00:09:43
>>15 #include <stdafx.h>
後死ね。
19 :
v(^・^)v :04/10/24 00:10:13
>>17 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
>>17 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
行列計算用のライブラリで計算速度が速く使いやすいおすすめのものがあれば 紹介していただけないでしょうか?
テンプレ終了。 待ってろって言ったのに埋めやがって、 前スレに次スレへのリンク貼れなかったじゃないか愚か者ども。
25 :
デフォルトの名無しさん :04/10/24 00:14:13
>21 あとは ublas とか?
4x4 行列, 単精度浮動小数点数限定なら DirectX でも良いけど。
やっと分かった va_list 版ってのは関数名に v の prefix つけて、va_end をしないのが基本なの?
typeid みてみると va_list って char* なのか… てことはポインタを進ませながら無理矢理キャストするって実装なのか……? もしそうなら参照で渡さない限り va_end しても意味ないのか
30 :
デフォルトの名無しさん :04/10/24 00:37:11
どう実装されているかはstdarg.hを見れば分かる。
>>28 すまん、さっきのコードは間違いだらけだった。
↓正しくはこんな感じ。
ore_printf(const char *format,...) {
static int count = 0;
printf("[%08.8d]", count++);
va_list arg_list;
va_start(arg_list, format);
vprintf(format, arg_list);
va_end(arg_list);
print("\n");
}
関数名云々は趣味の問題だけど標準関数の命名規則に従っておいたほうが第三者が見た時に分かりやすいかと。
va_list まわりの処理は慣れるまでは他人の書いたコードを猿真似するのがいいと思うよ。
あと、va_list の実装は環境や処理系によって極端に異なるから基本的には気にしちゃダメ。
>>28 vprintf とかは、可変長引数をダラダラ渡す代わりに
va_list を1個だけ渡すのよ。そんだけ。
別の言い方をすれば、可変長引数はそのまま渡せないから
va_list として渡すと言うこと。でも、普通の printf では va_list を
単なる値として受け取っちゃうから、va_list を va_list として
受け取って使ってくれる関数が必要になるわけさ。
それが v******** っつー関数群。
そんで、va_end するのは va_start した関数と同じ関数であるべきだから、
va_list を渡された関数が va_end しないのは当然のこと。
>>31 ウホッ。リロードせずに書いたらかぶっちまったスマソ。
>>28 具体例で説明するなら下みたいな感じ。
nurupo(const char* ga, ...) {
va_list arg_list;
va_start(arg_list, ga);
vnurupo(ga, arg_list);
va_end(arg_list);
}
vnurupo(const char* ga, va_list arg_list) {
実装
vprintf(ga, arg_list); みたいな事も出来る。
}
>>33 >ウホッ。リロードせずに書いたらかぶっちまったスマソ。
まぁ気にするな。
∧_∧
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__∧∩
_/し' . V`Д´)/
(_フ彡 / ←
>>33
C++のライブラリを集めるスレッドとか無いの?
計算…uBLAS,blitz++ ネット…ACE 正規表現…boost スレッド…boost その他…boost 暗号…Crypto++ GUI…gtkmm,QT
XML…Xalan-C++,Xerces C++,ICU
38 :
デフォルトの名無しさん :04/10/24 19:01:47
#include <vector> #include <deque> main() { std::vector<int> vec(20); for(int i=0;i<20;++i) vec[i] = i; std::deque<int> deq(vec.begin(), vec.end()); } main() { std::deque<int> deq(20); for(int i=0;i<20;++i) deq[i] = i; std::vector<int> vec(deq.begin(), deq.end()); } 上のmainが通るのに 下のmainが [C++エラー] Could not find a match for 'std::vector<int,std::allocator<int> >::vector(std::deque<int,std::allocator<int> >::iterator, std::deque<int,std::allocator<int> >::iterator)'. で通らないのは、どうしてですか?
トオルよ
通らないとおかしい 環境書け
BCB3です。 Borland C++ 5.3 for Win32 Copyright (c) 1993, 1998 Borland International これコンパイラ部分だけフリーの新しいのに入れ替えられないのかな…
で
>>38 はどういうエラーなの?
BCB3ではイテレータ用のコンストラクタが実装されていないということ?
Copyright の年から考えてISO C++には対応してないと考えるほうが自然かと
44 :
デフォルトの名無しさん :04/10/25 19:08:51
newで作成されたTestクラスのインスタンスをdeleteする場合、 下記のように作成したインスタンスを参照に代入してdeleteしても問題ないのでしょうか? class Test{}; int main() { Test* test = new Test(); Test& rTest = *test; delete &rTest; }
>>45 自身なさげなので敢えて聞くのも申し訳ないですけど
根拠とかあります?
>>44 参照変数のアドレスは参照元のアドレスだから大丈夫でしょ。
つーかなんだその怪しげなコードは。
>>44 printf("%p %p", test, &rTest);
同じ値が出ればおkって事で。
あの偉大なヒトラー総統も一兵士だったときには見張りをなさっていたのでしょうか?
正しく入力すればこれもOK? int main () { int* p = new int(); int address; std::cout << "p = " << int(p) << std::endl << "p2 = "; std::cin >> address; delete reinterpret_cast<int*>(address); }
>>44 環境によってはポインタから参照になったときに情報が欠落する可能性もあるんじゃないかなぁ。
54 :
859 :04/10/25 21:11:29
>>44 多くの処理系でこのプログラムは実行できるのは事実
だけど、インスタンスへのリファレンスの先が
なくなってしまうのだから、限りなくおすすめできない。
もし Test がメンバ変数を持っていて new Test で割当て
られた領域が delete されたあと、再利用されたとしたら
その後の rTest 経由のこの領域に対するアクセスは期待
しない動作を生むことになる。
メンバー変数さえなければ下みたいなプログラムも
可能な処理系が多いんだけど、限りなく裏技だなぁ。
struct Test { void M() { cout << 1; } };
int main() { ((Test*)0)->M(); }
>>55 そう、それを言わんがために、最後の例を書いた。
>>56 それはにゅうをつかうなということではないか
>>44 は全く問題ないでしょ。
要はリファレンスのアドレスとは何か? という事になる。
参照先オブジェクトのアドレスでしかありえない。
他に何のアドレスがあるというの?
59 :
デフォルトの名無しさん :04/10/25 23:42:56
friendクラスと被friendクラスの関係を、UMLで表現する場合ってどうすればいいでしょうか? あと、あるクラスのメンバとして、TemplateHoge<int> m_hogelist;というメンバが定義されていた場合、 これをUMLで表現するにはどうすればいいでしょうか? できれば、AAで表現していただけるとありがたいです。 もし、無理だったら、エクセルでつくっていただいて、アプロダにアップしてくれるだけでいいです。
>>58 const参照の場合複製される可能性があるっけ?
>>60 ないでしょう。もしあったとしたらconst参照は(特に関数呼び出しにおいて)
その意義の大半を失いませんか?
>>59 > あと、あるクラスのメンバとして、TemplateHoge<int> m_hogelist;というメンバが定義されていた場合、
bind
あるいはクラステンプレートとは別に TemplateHoge<int> という「クラス」を用意してしまう。
63 :
デフォルトの名無しさん :04/10/26 00:08:08
>>60 そんな仕様だったらコピー禁止オブジェクトへのリファレンスが作れなくなる
ただの依存にしといて friendとか注釈つけとけ
67 :
マイク ◆yrBrqfF1Ew :04/10/26 17:50:41
>環境によってはポインタから参照になったときに情報が欠落する可能性もあるんじゃないかなぁ。 ポインタからリファレンスになって欠落する情報ってなんだ? 聞いたことねえな
68 :
デフォルトの名無しさん :04/10/26 20:03:13
int a = 99; int c( a ); が VC7.1 でコンパイル通るんですが、このような コンストラクタ的な初期化は C++ の規格で許されてるんですか?
70 :
デフォルトの名無しさん :04/10/26 20:45:00
普段どーやってコピーコンストラクタ書いてるんだろう…
72 :
マイク ◆yrBrqfF1Ew :04/10/26 21:07:04
>>68 NULLを逆参照してリファレンスにしてよかったか?
int &ref_to_null(*reinterpret_cast<int*>(NULL));
>>72 NULL に対して * 演算子を適用した時点で、すでに未定義。鼻から悪魔が
出てくるとか、いきなり PC が暴走しても文句言えない。
あそう。
>>67 たとえばポインタの指している先のブロックサイズとか。
一般的な実装ではメモリブロックの前に埋め込んでおくとか別の場所に隠しておくが、
ポインタ自体が保持してはいけないという規則は無い。
仮にそういう実装があれば参照になったときに欠落する可能性はある。
76 :
デフォルトの名無しさん :04/10/26 21:53:52
C++で∫_1^10 (cos x - 0.87) * cos x dxの数値解を求めたいのですが、 どうやってコーディングすればよいか解かりません。 どなたか教えていただけませんか?
>>76 単純に不定積分してから
その数式で計算すればいいのでは?
79 :
デフォルトの名無しさん :04/10/26 22:00:03
∫て言いたかっただけだろ (プ
>>76 台形公式とかシンプソンの公式とかで
x の範囲を分割して計算するとか、
そういうの期待しているの?
(HSP のスレで 78 の回答がダメそうに言われたんだけど)
>>76 おとなしく Mathematica か Maple でも買っとけ。
>>76 #include <stdio.h>
#include <math.h>
double func(double x) {
return (cos(x) - 0.87) * cos(x);
}
double integrate(double x1, double x2, int n) {
int i;
double sum;
double x;
double h;
h = (x2 - x1) / n;
x = x1;
for(sum = 0, i = 0; i < n; i += 2) {
sum += func(x) + 4 * func(x + h) + func(x + 2 * h);
x += 2 * h;
}
return sum * h / 3.0;
}
int main() {
printf("%lf\n", integrate(1.0, 10.0, 100));
}
>>75 いや、そんな実装はありえないだろ。
大体ブロックサイズってなんなんだよ。
new したものだけがポインタじゃないんだから
ブロックサイズなど保持する意味はない。
85 :
デフォルトの名無しさん :04/10/26 23:26:35
2chの弱点発見!!! 2chでは、UMLがかけない! ひろゆきさん、UML描画機能つきのギコナビつくって・・・おねがい。
>>85 TeXの書式を認識してくれたら結構便利だよね
User Mode Linux
FILE *FP = fopen( "Hoge.txt", "wt"); char S[ 256]; sprintf( S, "TEST MESSAGE"), // ;じゃない fputs( S, fp), // ;じゃない fputs( "\n", fp); fclose( FP); これってコンパイラ通っちゃうんですけど、C++はいいんでしたっけ?
はい
そういえば昔学校で習ったきり、unionって使ったこと無いんだけど 皆々様はどう?
>>90 使用例:組込みの入出力周り, インタプリタ, etc..
>>91 縁がない分野ばかりだ、ちゃんと使い道あるのねん
サンクス
>>88 んなもん、Cでも問題なく通るぞ。
#コメント(//)以外は。
>>88 入門書を一から読み直せ
(C++って言ってるけど内容は100%Cのような…ヌルポ)
∧_∧ \\
( ・∀・) | | /〃_/_〃
と ) | | .∧ / / / / /
Y /ノ 人 ./ / / ノ
/ ) < >__∧∩
_/し'_//. V`Д´)/ ←
>>94 | / /
| 100t 彡
96 :
デフォルトの名無しさん :04/10/28 06:32:56
いきなりですみませんが質問させて下さい。 コンパイラの最適化は考慮に入れないとして、 int func(int i); class X { int mfunc(int); } void main(){ X x; int (*pfunc)(int) = func; int a = func(1); // 行a int b = pfunc(2); // 行b int c = x.mfunc(3); // 行c } の場合行aとbの実行速度に違いはないと思ってますがcはa,bと 比べて呼び出しにコストがかかるんでしたっけ? それともコストがかかるのは仮想関数呼び出しの時でしたっけ? 参考文献等ありましたら教えていただけないでしょうか。 ただし素人はひっこんでろ。
>ただし素人はひっこんでろ。 この一行がネタ回答を欲しがってるようにしか見えない
自分で最適化無しでコンパイルしてベンチとればすぐ分かるような。
>>98 いや、結果が知りたいんじゃなくって
どうしてそうなるのかがしりたいんだよ。
まずaとbに違いが無いわけねーだろカス素人が
aとbは機械語レベルでは一緒 仮想関数はVTBLを介するからcより遅い cがどうなるかはワカンネ
機械語が分かるならthiscallでぐぐれば分かる
103 :
デフォルトの名無しさん :04/10/28 07:16:49
オブジェクトの参照(const Object &) に NULL を入れたら暴走しますた。 仕様ですか?
ポインタと違って参照にNULLは入れられません。
ありがとうございまつ。理解しますた。
catch( const std::exception& e ) みたいに、 catch に const 入れるのって冗長ですか? 文字列リテラル投げるときは必要なんでしょうけど…
どうせコピーされた物が渡されるので付けても付けなくても一緒
cは最適化の前提が無いならthisポインタ積む分遅いだろ。
>>107 そりゃそうですけど…
やっぱり冗長ですかねぇ
>>108 96じゃない素人ですけど
mfunc(X*,int)
という形になってpush,popする分遅いということですか?
そもそも const は冗長な場合の方が多い。 冗長だから付けないっていう理由はおかしい。
>>110 積むといってもレジスタかも知れんが、そういうこと。
>>107 ,109
参照で受けてるから、コピーされないよ。
const 付けるかどうかの判断は、
その後 e の内容を改変するようなオペレーションが
あるかどうかを、コンパイル時に見つける必要があるか
どうかによって決める。
参照で無くてもつけたほうが良い。 パラメータを変更するような関数は設計的によろしくないから
>>115 コピーしたオブジェクトへの参照を受け取るんだと思うんだが…
>>117 struct A {
A() { std::cout << "A::A()" << std::endl; }
A(const A&) { std::cout << "A::A(const A&)" << std::endl; }
A& operator=(const A&) { std::cout << "A::operator=(const A&)" << std::endl; }
};
try
{
try
{
throw A();
}
catch(const A& a)
{
std::cout << "catch 1" << std::endl;
throw;
}
}
catch(const A& a)
{
std::cout << "catch 2" << std::endl;
}
VC6だとコピーが一切起きないんだけど
15.1 -5- "If the use of the temporary object can be eliminated without changing the meaning of the program except for the execution of constructors and destructors associated with the use of the temporary object, then the exception in the handler can be initialized directly with the argument of the throw expression."
いい加減VC6見たいなまだC++の仕様が固まってない頃ので検証すんの辞めろよ。
>>120 g++ でもコピー起きないよ。
structE {
~E() { cout << "~E()" << endl; }
E() { cout << "E()" << endl; }
E( E const& ) { cout << "E( E const& p )" << endl; }
};
int
main() {
try { throw E(); } catch ( E& e ) {}
}
>>116 それは思い込みだな
例外時のトレース情報をとりたいと思ったらどうする?
インスタンスを直接throwすると、コピーが起きないのだろうか…。 適当な場所で A a; と作ってから、throw a; とすると、VC6でもVC7.1でもコピーコンストラクタが走った。 ちなみに、bcc32では、直接でも一旦作ってからでも、コピーコンストラクタが走った。
執拗にVC6に拘る厨房 ・アンチマイクロソフト厨 ・VisualStudioを買えない貧乏人 ・新しいPCすら買えない乞食 ・古いアプリケーションの機能追加にC++の厳密な使用を持ち込む阿呆 ・.NETを一切認めない狂信的Win32信者
More Effective C++ 項目13: 参照で例外を捕まえる を参照のこと
VC6どうのこうのは他所でやってくれ
typenameって直後に書いてあるものが型名であることを表すと思ってたんだけど、 gcc version 3.3.1 (cygming special)で以下ようにするとエラーになります。 $ cat test.cpp && g++ test.cpp #include<iostream> #include<string> using namespace std; template< typename Foo > void func( typename Foo val ) { typename Foo res; res = val + val; cout<< res<< endl; } int main(void) { func<int>(774); func<string>( string( "String" ) ); return 0; } test.cpp:4: error: syntax error before `)' token test.cpp: In function `void func(...)': test.cpp:5: error: syntax error before `;' token test.cpp: In function `void func(...) [with Foo = int]': test.cpp:10: instantiated from here test.cpp:6: error: `val' undeclared (first use this function) test.cpp:6: error: (Each undeclared identifier is reported only once for each function it appears in.) test.cpp:6: error: `res' undeclared (first use this function) test.cpp: In function `int main()': test.cpp:11: warning: cannot pass objects of non-POD type `struct std::string' through `...'; call will abort at runtime
>>128 -template< typename Foo > void func( typename Foo val ) {
- typename Foo res;
+template< typename Foo > void func( Foo val ) {
+ Foo res;
>129 dクス。コンパイルとおりました。typenameがtemplate<>の中にしか書けないのは C++の規格?それともgccの制限?
typenameはそれが型名だと確定できないとき以外はつけてはいけない
>131 あー、なるほど。その説明でスッキリしました。 ありがd。 // intやdoubleとかにもtypename付けられるようになってると // 文法の対象性が良くなる気がする。
>>132 たぶん誤解してる
typenameは以下のように使う
Fooの前のtypenameを外してコンパイルした結果と比較してみて
環境によってはtypenameはいらないようだけどg++(3系)だと必要
#include<iostream>
#include<string>
using namespace std;
template< typename Foo > void func( Foo val ) {
typename Foo::value_type res;
res = val.size () + val.size ();
cout<< res<< endl;
}
int main(void) {
func<string>( string( "String" ) );
return 0;
}
templateの引数にtypenameとclassの両方、 なんの違いも無く使えるのって、なんのため? 意思の表示?歴史的経緯?
えーと、typenameを使う主な場所は ・template< >の中 ・ template<typename Foo>の有効範囲内で Foo::value_type のような型を使うとき の2つで、 ・型であることが明確なものにtypenameつけたらダメ という理解で良いかな?
>>135 ・template<typename Foo>の有効範囲内で、
std::vector<Foo>::iteratorのような型を使うとき
もだな。念のため。
138 :
デフォルトの名無しさん :04/10/29 20:00:42
>>134 歴史的経緯じゃないかと思っている
禿の予知能力がもう少し強ければ
初めから typename だっただろうさ
vectorやlist等を基本クラスで宣言したものに 派生クラスのオブジェクトを格納して 派生クラスでオーバーライドした関数呼び出すことってできないですか?
>>139 奇妙なテンプレートとかなんとか言うやつでやるかな、たぶん。
>>139 つまり、クラスに新たなメソッドが追加されたように振る舞わせるっていうこと?
様々な派生クラスのオブジェクトを格納して一括して処理できないかな と思ったんですけど 派生クラスで格納するから、派生クラスのコンストラクタは呼び出されるんですけど 関数はオーバーライドしても基本クラスのものが呼び出されるんです
>>142 えーと、コンテナは基底クラスのポインタを格納していて、
んで、オーバーライドした関数を呼び出してるのに、基底クラスのものが実行される、
ってこと?
そのメンバ関数をvirtual指定してる? とりあえず簡略化したソースでも見せて。
class A{ public: int x,y; A() {};~A() {}; void Move() { x+=1; y+=1;}; }; class B:public A{ public: B() { x=0; y=0;} ~B(){}; virtual void Move() { x+=2; y+=2; } }; int main() { vector<A> vec; vec.push_back(B()); vec[0].Move(); cout << vec[0].x << vec[0].y; return 0; } //結果11 簡略化というか別のソースなんですけど、こんな感じです あと初心者スレ別にあったんですね。スマソ
>>145 とりあえずこんな感じ
deleteはちゃんとしてね
class A{
public:
int x,y;
A() {}; virtual ~A() {};
virtual void Move() { x+=1; y+=1;};
};
class B:public A{
public:
B() { x=0; y=0;} ~B(){};
virtual void Move() { x+=2; y+=2; }
};
int main()
{
vector<A *> vec;
vec.push_back(new B());
vec[0]->Move();
cout << vec[0]->x << vec[0]->y;
return 0;
} //結果11
>>145 出来ました ありがとうございます
ポインタを格納すればよかったんだ
>>145 派生クラスの方にvirtual付けてどうする。
仮想関数について勉強しなおすと吉。
>>150 別に普通だと思うけどなにがマズイと思うの?
本当に一般的では無いと思ってるなら TemplateMethodパターンでくぐって納得した後にデザパタの勉強しなさい。
なんなんだろ、この"見て損した"感は…
Template Method ってデザパタなんか微塵も知らなくても知ってて当たり前だと思うのだが
そもそもデザインパターンは知ってて当たり前のものやよく使われてるものをカタログ化したものだからな。
>>154 はデザパタをまったく理解してないに100香田
>>158 萎えそう思ったのか192文字以内で答えよ
160 :
デフォルトの名無しさん :04/10/30 21:59:06
文字列の終端も数に入れてね
では終端のナル文字を含めて1024文字以内のC文字列で説明せよ
163 :
デフォルトの名無しさん :04/10/30 23:47:13
ロケールは?
C++なら終端なんか含むなよ。
説明をstd::stringに格納せよ。字数制限:メモリを使い果たすまで
>>151 いや、使い方はそうなんだが、ソース見て違和感しか思えなくて…
なんかあまりマネしたくない手法と言うか…「へー」としか感想無くて…
一般的かどうか聞いてみた。(気にするだけ無駄だったかのかな?)
他のレスもサンクス。
>>165 4GB 超のメモリを積んでるマシンでも size_t が 32bit だったりして
困るわけだが。
ちょっと見てみたが、何の変哲もないただのオーバーライドじゃん。 どんな解説書にも一回は載ってるような。 TemplateMethodでもないし。
TemplateMethodだから
TemplateMethodですから!!残念!! GoF26パターン斬るぃ〜!
( ´д)ヒソ(´д`)ヒソ(д` ) GoF本は23パターンしかないぞ
>>150 ac_BaseStrがclassBaseとclassExtの両方に書いてある事だけは唯一気になる。
174 :
デフォルトの名無しさん :04/10/31 07:54:08
これのプログラムに問題はありますか? #include <iostream> struct base { template<class T>bool _(T) { return false; } }; struct derived: base { bool _(char c) { return true; } bool _(int i) { return true; } }; int main() { derived d; std::cout << std::boolalpha; std::cout << d._(1.0f)<< std::endl; std::cout << d._('a') << std::endl; std::cout << d._(1) << std::endl; return 0; }
>174 派生クラスで、同じ関数名でシグニチャが違う関数を宣言すると 基底クラスの関数は隠される。 derivedに using _;とでも書いておけ。 あとアンダースコアから始まる識別子を使うな。
C++ で 入力した文字を逆転表示して表示させるにはどうしればいいのでしょうか・・・? 例 こんにちは はちにんこ と言った具合です。
回答もらってるのにマルチとは言い度胸だな
C++Builderのスレがありません。・゚・(ノд`)・゚・。
wstring を出力させたくて std::locale::global( std::locale( "japanese" ) ); std::wstring s; std::getline( std::wcin, s ); std::copy( s.begin(), s.end(), std::ostream_iterator<wchar_t>( std::wcin ) ); としたのですが、copy のところで error C2440: '型キャスト' : 'std::wostream' から 'std::ostream_iterator<wchar_t>' に変換できません。 となってしまいます。 std::wcout << s とするしかないでしょうか?
- std::copy( s.begin(), s.end(), std::ostream_iterator<wchar_t>( std::wcin ) ); + std::copy( s.begin(), s.end(), std::ostream_iterator<wchar_t>( std::wcout ) );
std::ostream_iteratorの二番目のテンプレート引数をwchar_tにすればコンパイルは通るよ
>>181 マルチは帰れ
っていうかそれは宿題スレで私が答えた奴の再質問か?
標準入出力とロケールって関係あるの?
うん。
フォーマット付き出入力
boostいれてみたんですが
Let's boost(
ttp://www.kmonos.net/alang/boost/ )
のサンプルintrusive_ptr以下のサンプルがうまくいきません
intrusive_ptr
c:\〜\intrusive_ptr.cpp(23) : error C2065: 'CountableObject' : 定義されていない識別子です。
c:\〜\intrusive_ptr.cpp(23) : error C2065: 'ptr' : 定義されていない識別子です。
c:\〜\intrusive_ptr.cpp(24) : error C2448: '<Unknown>' : 関数の定義が間違っています。
c:\〜\intrusive_ptr.cpp(29) : error C2448: '<Unknown>' : 関数の定義が間違っています。
lexical_cast
c:\〜\lexical_cast.cpp(12) : error C2062: 型 'int' は不要です。
c:\〜\lexical_cast.cpp(13) : error C2275: 'string' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
c:\program files\microsoft visual studio\vc98\include\xstring(612) : 'string' の宣言を確認してください。
cl.exe の実行エラー
というようになってしまいます。
c:\lib\boostの下にc++boost.gif等が来るようにして
インクルードファイルにc:\lib\boostを追加したんですが
std::multimapで重複するキーをinsertした時についてなんですが 例えば std::multimap<int, int> m; m.insert(std::pair<int, int>(1, 1)); m.insert(std::pair<int, int>(1, 3)); m.insert(std::pair<int, int>(1, 2)); m.insert(std::pair<int, int>(1, 4)); とし、イテレータで最初からアクセスした場合 キーが重複した部分がどういう順番で出てくるか とかそういうのは決まっているんでしょうか?
>>193 intrusive_ptrはそのコードが間違ってる。
lexical_castはコンパイラが間違ってる。
fstreamで読み書きするとfopenで読み書きするよりだいぶ遅くなるのですが、 どうやったら解決しますか?
>>198 しゃーない。fstreamは継承しまくりの怪物だし、CのFILE構造体のような
機械語に近いライブラリには速度でどうやってもかなわんよ。
マシンを新しくするか、FILEを使い続けるかどちらかだな。
>>200 長いのでちょっと難しいですが、
基本的には
fp = fopen(path , "rb")
↓
ifstream ifs(path, ios::in | ios::binary);
fread(&data, sizeof(Data), 1, fp);
↓
ifs.read((char*)&data, sizeof(Data));
fgets
↓
getline
と置き換えただけです。
速度の方ですがifstreamの方が4〜5割遅くなってしまっています。 readとfgetsはたくさんあってループもしています。 具体的には約10万程度のクラスインスタンスのシリアライズとデシリアライズを行っています。 それと、読込中に正しく読めてるか確認するための\0もあり、 fgetc ifs.get で確認しています。
>>204 最適化の影響の意味がよく分かりません。
最適化はon(-O2)にしています。
全部同じ値のテストデータとかでは無く 実運用データでテストしていてその後実際に読んだデータを元に処理を行っているので、 実際に読み込まないとかの最適化がかかることは無いと思います。
やっぱり
>>199 って事なんでしょうかね…
それにしても実際のIOにかかる時間の方が
iostreamの複雑さなんかよりずっとオーダーが大きそうなのに5割も違うのはなあ…
208 :
デフォルトの名無しさん :04/11/02 08:41:29
現在実行しているディレクトリのパスを取得する方法を教えてください。 OSはLinuxです。
>>208 ここって環境依存ありだっけ?
そうでないなら以後気をつけるようにってことで、getcwd()。
>>208 環境依存なしならboost/filesystem
すみません、神様教えてください。 下のソース、Mac の OSX 10.3.5 上で実行すると ::pthread_join で止まってしまいます。 CallProc の中身を while ( true ) ::pthread_testcancel(); のようにすると、ちゃんと join できるのですが・・ 他の環境では動くのでしょうか? #include<pthread.h> #include<sys/socket.h> #include<iostream> using namespace std; static void* CallProc( void* p ) { int wSS = ::socket( AF_INET, SOCK_STREAM, 0 ); ::listen( wSS, SOMAXCONN ); ::accept( wSS, NULL, NULL ); return 0; } int main() { pthread_t m; ::pthread_create( &m, NULL, CallProc, 0 ); ::sleep( 1 ); ::pthread_cancel( m ); void* v; cout << "Calling join." << endl; ::pthread_join( m, &v ); cout << "Joined." << endl; }
FILE*との同期を取るためのコストがでかくて性能が出ないって話がどこかにあった。 同期を行わないパラメタをifstreamに渡せばよかったはずだけど、覚えてない。
>>212 std::ios::sync_with_stdio()だろ。それにfalseを与えてパフォーマンスの
変化があるかどうか調べてみ。
C++ ではポインタに代入するとき NULL と 0 のどちらを使った方がいいのでしょうか?
漏れの手元の本には プラットフォームに応じてNULLの定義方法が異なっていたことにより プログラムが暴走する危険があった、と書かれてる 例えば #define NULL ((char *)0) #define NULL ((void *)0) など。で、これを代入するとエラーがでる可能性がある C *cp = NULL; //エラー? ちなみにC++では数値の0は任意の型のポインタ値に変換できることが保証されている よって、0が一般的に使われている けど、現在のC++の標準には(void *)0のような定義は許可されていないので その標準にのっとった環境であればNULLを使用しても問題ない ただ、やっぱり今のC++プログラマはNULLではなく、0を利用するのが一般的、らしい 自分の言葉じゃなくてスマソ 今漏れも勉強中なんだわ
>>216 昔の話だから忘れて良い。
ANSI C++ の規格では NULL は「整数型で値は 0 と等しい」(回りくどい言い方に
なってるのは int, long, ... どれになるかは処理系に任してるから) と定義されてる。
C* cp = NULL;
これが通らないコンパイラは、現実にはそろそろゴミ箱行き。
NULLより0の方がタイプ数が少なくてグッド
C++よりRubyの方がタイプ数が少なくてグッド
>>217 > 回りくどい言い方になってるのは int, long, ... どれになるかは処理系に任してるから
君はぬるぽを知っているのか?
Cのぬるぽをわかっているか?
C++における、Cの負の遺産の一覧、みたいなのありますか?
223 :
デフォルトの名無しさん :04/11/03 18:21:22
>>222 ISO/IEC 14882 の Annex C から以後は読んだか?
英語が辛ければ JIS に日本語版もあるぞ
226 :
デフォルトの名無しさん :04/11/03 18:34:56
>>225 まあ投資額は目的・目標で決めることだからな
なくていいんならそれまでだ
int hoge = 0; int* hoge = 0x0; じゃだめですか?
229 :
デフォルトの名無しさん :04/11/03 20:45:47
じゅうぶんです
はんぶんです
ていうかコンパイルが通らない。
234 :
おながいしまつ :04/11/04 00:46:52
342 :VC++ですが・・・ :04/11/04 00:32:25 ID:hMyxAB0U
-----------------------------------------
pDocTemplate = new CMultiDocTemplate(
IDR_TEST11TYPE,
RUNTIME_CLASS(CTest1103Doc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CTest1103View));
AddDocTemplate(pDocTemplate);
-----------------------------------------
↓↓↓
RUNTIME_CLASS(); ←この呪文は、ひとことで言うと何ですか?
C言語の初心者ですいません。
javaは一生懸命勉強したのですが、
VC++の呪文に不慣れです。
そこで諸先生がたに伺いました。難しければ結構です。。。
346 :cen ◆Pm9xOTJuM. :04/11/04 00:34:06 ID:???
>>342 ここを。
プログラム
http://pc5.2ch.net/tech/ ↑↑↑
というわけで御座います。
基本的な呪文を10個くらい意味と一緒に覚えておきたいと思います。
C++の新バージョンって、いつごろ出るの?
シラネ
239 :
デフォルトの名無しさん :04/11/04 01:25:39
すいません。質問なんですが、 C言語には無くてC++にだけは存在する プリプロセッサへの命令(ディレクティブ)って何かありますか? CとC++ってこの部分は同じでしたよね?
プリプロセッサディレクティブなんて激しく環境依存じゃねぇの?
ソースって一つのクラスごとに一つ作るのがいいんですか?
>>242 一般的には。
ただ、数行〜十数行程度の小さいクラスがぽこぽこ出来るときはある程度まとめる。
質問者より回答者の方がレベルが低いスレはここでつか?
全部ひとつのヘッダに書くべき
248 :
デフォルトの名無しさん :04/11/04 01:53:08
>>242 間違っても一つのクラスでファイルを分けたりするなよ。
ソースを追いにくくなるから。
定義と宣言は一カ所でしろ。
Javaから入った漏れには当たり前のことなんだが、
世の中には訳分からん無駄な作業をする奴もいるな。
>定義と宣言は一カ所でしろ。 この行を読んだ瞬間ネタだと分かった
>>248 > 定義と宣言は一カ所でしろ。
ハァ? 実装を修正するたびにインクルードされてるファイルも毎回コンパイルするんかい。
メール欄みただけで釣りだと分かった
ネタかよw
>>250 遅すぎ。読む前に感覚的に見てJavaという4字があった瞬間にネタだと分かれよ。
256 :
デフォルトの名無しさん :04/11/04 01:58:20
大したことない設計しかしていない初心者は、1ソ−スに複数記述してもいいでしょう。 でも複数人でプロジェクト組むなら、1ソース1クラスが良いでしょう。 お遊びじゃないんだから。
257 :
デフォルトの名無しさん :04/11/04 02:01:26
>>242 間違っても一つのクラスで一つのファイルなんて制限するなよ。
ソースを追いにくくなるから。
同じクラスでもグループごとに別ファイルにしたり、ユーザーが読むべき部分と読むべきでない部分は別ファイルにしろ。
C#から入った漏れには当たり前のことなんだが、
世の中には訳分からん無駄な作業をする奴もいるな。
>>242 間違っても一つのクラスで一つのファイルなんて制限するなよ。
ソースを追いにくくなるから。
一つのプログラムは全部一つのファイルにまとめて書け。
ハンドアセンブルから入った漏れには当たり前のことなんだが、
世の中には訳分からん無駄な作業をする奴もいるな。
もうネタはいいよ。本当に知りたい人が読んだら勘違いするだろ。
マジかよ
じゃぁまとめよう 一つのプログラムは全部一つのファイルに… ゲフンゲフン
1クラス1ファイルとかってファンクタの類でも貫いてたらある意味尊敬するな。
>>263 もちろんインナークラスも別ファイルに分けて #include します。
>>242 >ソースって一つのクラスごとに一つ作るのがいいんですか?
Cの頃はstaticやexternでシコシコ書くしかなくて
ファイルの分割が即スコープの分割を意味してたから
C++になっていまだにそういう迷信を信じている人も多い
1ファイル1クラスにしたらどのクラスを探すのが楽やん
俺も興味あるんだけど、結局どっちがいいんだ…「適度に」って言う曖昧なのが一番なのか。 今のところ建設的っぽい意見 ・一般的には1クラス1ソースだが、小さいクラスが多いときはある程度まとめる ・再利用しにくいから1クラス1ソース ・実装を修正するたびにインクルードされてるファイルを毎回コンパイルしないために1クラス1ソース ・1クラス1ソースは、ファイルの分割が即スコープの分割を意味していたCの頃の迷信
>>268 というか、関連が比較的強いクラスはまとめる。
長くなるようなら分割する。
コンパイルの際のファイル依存は極力減らす(PImplイディオムまではいかなくても)
でいいんじゃないの
>>269 うーん、サンクス。となると例えば手元にある「コンポジットのクラスが
まとめられてる長いソース」は分割対象かなぁ。
実用で言ったら依存関係だけ考慮すれば良さそうだけど、
そうもいかないだろうしねぇ。
271 :
デフォルトの名無しさん :04/11/04 22:42:05
原則論的な話をするとキリがないけど、モノを作り上げる効率性 を考えたら、1ソース1クラスで作ると決めたほうが、はるかに 効率が良い場合がほとんどですね。プロジェクトの分担がし易い し、誰かが改良をしている時に、ほかの人が手を入れられない、 ということがなくなるし。 そもそも、ソース長すぎて分割しなくてはならない、 ってのは、ソフト業界で生きていくレベルにないね。。。 設計がなってないにもホドがある、ゾ・・・
272 :
デフォルトの名無しさん :04/11/05 00:01:39
記念マキコ
とあるクラスのメンバ関数の振る舞いについて質問です int &Hoge(){ int mage = 0; return mage; } とするとやはり危険なんですよね? これを解決するために 1.mage を static int にする 2.メンバ変数として int mage を作っておく Hoge を呼び出す側に変数を用意しておいて Hoge に参照渡しするのが無難だと思いますが 上記の1,2の方法が問題ないのであれば、どちらがいいのでしょうか?
コピーコンストラクタがあれば問題なし
>>275 コピーコンストラクタをどのように用いればよいのでしょうか?
>>276 揮発性という観点で1,2を挙げたのですが
その違いというのも教えていただけないでしょうか
int Hoge() { ... }
>>277 #include <iostream>
using namespace std;
class foo {
int mage;
public:
foo() : mage(0) {}
int& Hoge() {return ++mage;}
};
class bar {
public:
int& Hoge() {
static int mage = 0;
return ++mage;
}
};
int main () {
foo f[2];
bar b[2];
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
cout << f[i].Hoge() << ' ';
cout << endl;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
cout << b[i].Hoge() << ' ';
cout << endl;
return 0;
}
>Cスレの方でも書き込んだのですが、一応こっちも あるクラスにbuf[4][128]という配列があり、これを単なる外部関数 で使いたいのですが、このアドレスをメンバ関数で取得するには どう書けばよいのでしょうか?とりあえずこうしてみたのですが 駄 目でした。 class A { buf[4][128]; char** getBuf(void) { return (char**)buf; }; } int main(void) { char **ptr; ptr = classA->getBuf(); ptr[3][100]=100;//ここでハングアップ }
>>280 とりあえずコンパイルできる形にしてから載せろよ…
これでどうでしょう? class AAA { private: char buf[4][128]; public: char** getBuf(void) { return (char**)buf; }; }; int main(void) { AAA aaa; char **ptr; ptr = aaa.getBuf(); ptr[3][100]=100;//ここでハングアップ }
メモリレイアウトを考えろ [0,0]...[0,127][1,0]...[1,127][2,0]...[2,127][3,0]...[3,127] #include <iostream> class A { public: char buf[4][128]; char* getBuf(void){return (char*)buf;}; void print(){std::cout << (buf[3][100] & 0xff) << std::endl;} } classA; int main() { char *ptr; ptr = classA.getBuf(); *(ptr + 3 * 128 + 100) = 100; // ここでハングアップ classA.print(); } }
あ、ごめん、最後の}が余計
返答有難うございます。 *(ptr + 3 * 128 + 100) = 100; // ここでハングアップ これはこの形でないと駄目ということでしょうか?ptr[][]の 形でアクセスする方法はないのでしょうか?
>>285 char* ptr; を char (*ptr)[128];に替えればいいだろ。
あ、なるほど!ポインタ変数を変えるのですね。関数の戻り値を 変えることばかり考えて、そっちは気づきませんでした。 これで解決できそうです。ちょっとやってみます。
>>287 関数の戻り値も変えられるけど?
286とまったく同じ構文で。
>>280 > Cスレの方でも書き込んだのですが
いやそれマルチだから
お前ら親切ですね
マルチすみません。 >関数の戻り値も変えられるけど? はい、それを最初に試して、こんな感じにしてみたんですが コンパイルエラーになります。 char(*)[128] getBuf(void){ return (char*)buf; }; (char(*)[128]) getBuf(void){ return (char*)buf; }; どういう風に書けばよいのでしょうか?
>>290 char (*getBuf(void))[128];
あるいは
typedef char (*BUF)[128];
BUF getBuf(void);
char (&getBuf(void))[4][128]{ return buf;} のほうが良いとおもゆ
>>291 >>292 試してみました。上手くいきました。
これで完全に解決しました。マルチに最後にまで付き合って
もらってすみません。勉強になりました。
class A { protected: void a() {} }; class B : public A { public: void b(A& a) { a.a(); } }; というコードが vc7.1 で error C2248: 'A::a' : protected メンバ (クラス 'A' で宣言されている)にアクセスできません。 というエラーになるのですが、これは c++ 標準の仕様なのでしょうか?
yes
>>294 this->a()しか呼び出せないよ。
基本的な事で素朴な質問なんですが、 test.h で、 struct test { int a; int b; }; class test2 { int c; int d; SetC(int i); SetD(int i); GetC(void); GetD(void); }; という宣言がなされていて、 test.cpp で、 #include "test.h" int main(void) { int sum; struct test t; t.a = 0; t.b = 0; sum = t.a + t.b; printf("%d\n", sum) return 0; } というような(あまり意味のない)コードを作ったとします。 これをコンパイルした時、test.hのclass test2の方の 内部実装が未定義のSetC,SetD,GetC,GetDやclass test2 自体はどうなっちゃうのでしょうか?test.cの方でclass test2 を使ってなければコンパイルエラーにはならないですが、 実際に出来上がった実行形式ではclass test2の部分の定義 はコンパイラが削除してしまうのでしょうか?
>>298 そもそも無いのだから削除する必要も無いのでは?
>>296 class B : public A {
public: void b(B& b) { b.a(); }
};
これなら呼び出せるんだよ〜ん。
protectedメンバはthisを含め自分自身と同じ型のポインタ/参照ならアクセス可能。
プログラミング言語C++第三版P108の上から二行目の 「しかし、正の整数を表現するためのビット数を一つ増やしたいために int の代わりに unsigned を使うのは、ほぼ確実によくない」 のところが良く分かりません…これってどういうことなのでしょうか…?
「C/C++で unsigned (int以上)を使うのは、ほぼ確実によくない」 に読み替えてかまわないと思うよ。
でも理由が自分には良く理解出来ないので気持ち悪いです。 「値を正に保つために unsigned を宣言しても、暗黙の型変換 ルールがあるので、目的を達成出来ない」 ってあるけどこれ読んでも、値は正に保たれてるから別にいいのでは? と思ってしまうのですが…
>>303 前半は、たかが1ビット稼ぐために、unsignedを導入することによって発生する多大なデメリットは割に合わない。
後半は、文脈が分からんので知らん。
305 :
デフォルトの名無しさん :04/11/06 07:53:03
>>301 そんなん用途によるがな。
いろんな型の欠点ばっかり言い出したら
それこそ使てええのん残らんで。
ただsignedとunsignedの不注意な混用は
ハメられて痛い目見るケースがよくあるから
くれぐれも気をつける癖をつけれちゅうんなら
俺もそう思う。
でかいクラス(Form等)を1つのクラスで 複数のソースファイルに分割するというのは一般的に良く行われる事なのですか? form.hでFormクラスを宣言して、 formcontrols.cppとformevents.cppとforminit.cppで定義を行うというような事です。
307 :
デフォルトの名無しさん :04/11/06 08:05:12
>>306 一般的、とあるんでイヤだと答えるが・・・
そのケースの事情を見ずに言ってることなんで
声のトーンはごく控えめにしとく
ヘッダとソースとインラインに分けてるのはときどき見かけるなあ
それから「でかい」って何を基準に言ってるのかな?
数千行程度なら全然「でかい」うちに入らんぞ
たとえ数百行程度でも「でかい」と感じることもあるが
わかるか? ライン数やバイト数じゃねえってことだ
308 :
デフォルトの名無しさん :04/11/06 08:21:05
普通1メソッド1ファイル
1プログラム1ソースという結論が他の全てを論破したはずだが?
おぞましい結論だな
・1つのプロシージャの行数、 ・ローカル変数のスコープ範囲、 ・命名規則の一貫性の程度 で体感的なファイルの大きさは変わるな。
312 :
デフォルトの名無しさん :04/11/06 09:17:05
下記のようにコーディングして、テキストファイルを読み込むと、 当然読み込んだデータの末端に余計な改行が入るのですけど、 不要な改行を付加することなく、スマートに テキストファイルを読み込む方法はないでしょうか? Open TextFilePath For Input As #1 Do Until EOF(1) Line Input #1, Temp ReadData = ReadData & Temp & Chr(13) & Chr(10) Loop Close #1 Text1.Text = ReadData
スレ違いだボケ
316 :
デフォルトの名無しさん :04/11/06 11:23:46
--a.cc-- extern void func1(void); int main(){ ... func1(); } --b.cc-- extern func2(void); void func1(void){ ... func2(); } --c.cc-- void func2(void){ ... } という3つのファイルがあって,g++ a.ccをするとundefined reference to func2() がでるのですが,何がいけないのでしょうか?
ゼルダ
319 :
デフォルトの名無しさん :04/11/06 11:29:56
>>317 なるほど,了解しました.ありがとうございました.
リンクする前にとめればいいんですね.
320 :
デフォルトの名無しさん :04/11/07 15:21:49
C++は「なんだって出来る」言語だけれど、 何を作るかによって設計を変えないとやっていけない。 クラス設計が関わるレベルであれば、オブジェクト 指向で設計しないと使えないヤツになってします。 アドレス渡しなんてやっていたら・・・オソロシイィィ でも組み込み機器の設計や、リアルタイム制御の世界 だったら、まだまだポインタは必要だけどね。 トンカチで釘打つ時にトンカチに釘接着してから 木に打ち込もうとしたら、技術のレベルが知れるわね。
そこでRubyですよ
ところでこのRubyのひとって複数いるの?
漏れも思った 一人であちこち巡回してるのかと思うと、 相当なアンチRubyなんだろうなって思う 明らかにRubyに対し悪いイメージしか残してないからなw
そこでRubyですよ
計算機言語には得手不得手があるからなぁ。 なんでもかんでもC++ってわけにもイカンのはたしかだ。 それでもパフォーマンスとOO設計の両方を兼ね備えたのなんざ C++とEiffelくらいしか無いからね。
そこでRubyですよ
Rubyで物理計算やらせると終わらないので却下です
このスレは監視されているっ……
オレオレ、俺だよ、ばあちゃん
>>325 C++はともかく
- OCaml
- Objective C
- Delphi
を出さずにEiffelを出すのは何で?
Eiffelはパフォーマンスが要求される所で実績あったりするの?
>>331 別に深い意味はないよ、自分で選んだ結果として書いてるだけ。
あげてもらった言語に対しては
ObjectiveC:嫌いではない、Next使ってた頃はすごく重宝した
Delph:環境がWindowsしかない、すごく良くできているのにもったいない
OCaml:ごめんなさい、評価もしたことないのです
なんだよね、Eiffel入れたのは自分が使ったことがあって速度の問題もそれほどでなかったからなんだよ
でも大意としての機械言語には向き不向きがあるって事は了解してくれているんだよね?
補足: ClosとかCommonLispが自分は好きだけどチームからは不評なんです。
334 :
デフォルトの名無しさん :04/11/07 17:06:06
>>332 レスどうも
いろんな言語の経験がお有りなんですね
Eiffel使いなんて珍しいなと思って聞いてみました
向き不向きの話は同意です
最近R(S言語)の関数をC++に移植してるんですが
S言語はお気楽すぎて作業が大変です
337 :
デフォルトの名無しさん :04/11/07 17:13:40
338 :
デフォルトの名無しさん :04/11/07 18:00:12
>>337 現につっこめてねえヒヨッ子がはったりかましてんじゃねえw
Eiffelは、関数の部分型関係が引数に対してcovariantなのが分かりづらい。
340 :
デフォルトの名無しさん :04/11/07 18:27:20
>>339 そんだけ混乱してりゃ解りづらいのは道理だなw
341 :
デフォルトの名無しさん :04/11/07 18:29:47
342 :
デフォルトの名無しさん :04/11/07 18:32:26
343 :
デフォルトの名無しさん :04/11/07 19:35:54
コンストラクタの書き方で悩んでいます。 派生クラスのコンストラクタで受け取った引数を少し加工してから、 基底クラスのコンストラクタに渡してやりたいのですが、 記述方法がわかりません。書く方法あったら教えていただけないでしょうか。
344 :
デフォルトの名無しさん :04/11/07 19:39:36
struct d : b { d(int a) : b(a + 1) { } };
Objective C は Objective-C と書いてくれ
ということは Objective-C = Objetive となるの?
>>347 operator-はオーバーロードされてません!残念!
'c' - 'C' == ' ' だと思うがどうよ
350 :
デフォルトの名無しさん :04/11/08 23:33:30
質問です。 データ読み込み関連のクラスでデータを拾ってきて使おうとすると クラスが層みたいになってるので、どうしても hoge->getHoge()->getHogeHoge(hoge->getHogeNo())->getHogege()->getString(hoge->getHogeHogeNo()).c_str() とか長くなってしまいます。 こういうときはどう組んだらよいのでしょうか?
get関数の中でget関数を呼べば?
352 :
デフォルトの名無しさん :04/11/09 00:10:19
typedef double (*FUNCTION)(double, double ); は何を意味しているんですか? 初心者です。よろしくお願いします。
二つのdouble型を引数に持ち、戻り値もdoubke型の関数ポインタを型定義している。
typedef double (*FUNCTION)(double, double)[20]; は何を意味しているんですか?
syntax error です。
コンストラクタの呼び出しについてなんですが、皆さんは T t(tt); // 髭推奨 T t = tt; // 禿推奨 のどちらがいいと思いますか?
配列のポインタを返す関数をtypedefするのはどうするの?
わざわざtypedefする意味あんの?
>>357 コンストラクタをexplicit宣言しておくと微妙に差が出るな。
int main()とvoid main()は何がどう違うんですか?
>>361 バッチファイルなどのスクリプトから子プロセスとして呼び出した時、戻り値を使えるかどうかの違い。
Windowsのシステム環境変数 「errorlevel」とか、Unixのシェル変数 「$?」で戻り値を取得可能。
バッチの例:
hoge.exe
echo %errorlevel%
>>362 説明不充分。voidだと使えないのではない。不定値になるのだ。
CUIのプログラムの場合はプログラムの始めと終りが大事なんだけど GUIの場合ほとんどウインドウ開いて閉じるだけの意味しかない。 Windowsしか知らないでCUIプログラム作ってると意味わかんないだろう。
>>363 お前はとりあえず、日本語の勉強しろ。
例としてあげるならば、「使えない奴だな。」は、奴が使用不能であることを指すのではない。
使っても物の役に立たないという意味だ。使う自由はあくまでユーザにある。
お前が日頃から言われていることだからすぐに理解できるだろう。な?
句読点の使い方をもっと勉強しましょう。
まぁ363は揚げ足取りに見えるな 文頭が「補足で〜」とかなら頭良い人に見えるのに
>>358 typedef int (*(*FUNCTION)())[];
揚げ足の取り合いは醜いポ(´・ω・)y--oO○ エトー・・・
371 :
デフォルトの名無しさん :04/11/09 22:10:23
クラスで使用する定数をVC++6.0で定義しようとしたら static const int HOGE=0; ができないらしいので、enumで代用しました。 文字列定数を使う場合はどうやればいいでしょうか VC++6.0を窓から投げ捨てる以外の方法を教えてください
古いC++コンパイラは糞ばっかだからなぁ。 買い換えましょう。
>>371-372 そのクラス宣言内での初期化ができるのはISOでも整数型だけと決まっている。
というわけで普通の静的メンバと同じようにしろ。
//ヘッダ
class Foo
{
static const char * const HOGE;
};
//cppファイル(1ファイルでだけ)
const char * const Foo::HOGE = "Hoge";
374 :
デフォルトの名無しさん :04/11/09 22:21:57
class foo { public: static const int hoge; }; const foo::hoge = 0;
377 :
デフォルトの名無しさん :04/11/09 22:25:44
>>371 VC6はARM仕様、ISO/IEC14882と違うつーて騒ぐ池沼は適正なし
378 :
デフォルトの名無しさん :04/11/09 22:28:32
>>377 GCCこそが標準でありISOは糞である!
そこんとこ間違えないように!
変数のスコープや使われ方が分かりやすくなるように いきなりブロックを書いて無理矢理スコープを制限したり してるんですが、なんだか美しくない気がします。 こういうことは普通にやるものなのでしょうか? ↓こんな感じです { int a1, a2 if (a1 < a2) return -1; if (a1 > a2) return +1; } { int b1, b2; if (b1 < b2) return -1; if (b1 > b2) return +1; }
swich - case の中でローカル変数使いたいときはよくやる switch(式){ case 1: { int a = 1; printf("%d\n", a); } default: { int a = 2; printf("%d\n", a); } }
default: の前に break; 忘れてる
>>381 たまにやる。
古いCではローカル変数をブロック途中で新しく定義するために使う。
C++ではデストラクタのタイミングを調整するために使ったりする。
関数に分けてすっきりした名前が付くなら、分けたほうがいい。
>>382 自分もそれはやるんですが、やっぱ
>>381 はさすがに
冗長?というか余計なお世話なのかなあ、と。
自分的にはブロックで囲むと
{ // hoge する
/* ... */
}
みたいな感じでコメントも分かりやすくなるのでは?
と思ってたりするのですが、これがほとんどなされない
ような書き方ならば逆に読みにくくなるかもしれないので
やめた方がいいのかと。
>>381 普通にやる。むしろ推奨。
最終的にリファクタリングで関数に切り出せることを暗示している。
>>385 確かに古い書き方の人は殆どやらないようだが、スコープがはっきりするので私もお奨め。
例えばこういうケースはfunc()を他人が作る場合にしばしばおきるので。
void myFunc()
{
int x, y;
...;
x = ...;
...;
y = ...;
int rtn;
{
struct ForFunc tmp = {x, y};
rtn = func(tmp);
}
switch (rtn) {
case FuncRtnOk:
...;
break;
case FuncRtnError:
default:
...;
}
}
まぁ、C++ならブロック化しなくてもすむんだけどね。
無名名前空間内の関数って名前空間内で定義しないとダメなんですか?
map をキーではなく値でソートさせるようには出来ないのでしょうか?
>>390 最新版のboostには複数要素を基準にソートできるコンテナが入る。
int* p_ = 0; void reg(int* p) { p_ = p; } void foo() { ++(*p_); } int i = 0; reg(&i); std::cout << i << std::endl; foo(); std::cout << i << std::endl; とした場合、iが最適化でfoo()前後で同じ値が使われるということはあるのでしょうか?
ないんじゃね?もし何か具体的にコンパイラの挙動を疑っているの ならばそのコンパイラを晒した方がレスが早そうだが。
>>396 エイリアスを使わないと仮定するとか
そういうようなコンパイルオプション使うとそうなります。
>>394 標準関数でない関数呼び出しの前後で、完全ローカル(*)でない変数が同じであることは期待しないで最適化するはず。
つまり、きちんと違う値が出力されるはず。
#完全ローカルと書いたが、要はアドレス参照されてないローカル変数。
class Hige{ }; class Hoge:public Hige{ }; class Mage:public Hoge{ private: std::vector<Hige> hige; public: Mage(){ hige.push_back( /* ここにHogeが持つclass Higeを入れたい */ ); } }; このようなことが実現可能でしたら、その方法をご教授ください。 よろしくお願いします。
自分の基底クラスへのポインタがほしいと言うことか?
>>400 vectorの中身がポインタではないのでコピーになっちゃいますよ?
たぶんそのことだと思います^^; Mageに継承したHogeの、さらに継承元のHigeを higeに格納したいのですが…
やっぱポインタじゃないと直接アクセスは無理ですか…^^; つまり std::vector<Hige*> hige; にしておき、基底クラスへのポインタを hige に格納というわけですよね? 基底クラスとやらを勉強してきます 即レスありがとうございました
>>404 勉強するのはそっちじゃないと思う・・・。
およ…
って、「基底クラスのポインタの返し方」ですよね?^^;
thisでいいやん。
409 :
デフォルトの名無しさん :04/11/11 23:37:35
クラスAとクラスBがあって、 クラスAがクラスBのポインタを保持 クラスBがクラスAのポインタを保持 っていうのは可能でしょうか? 相互にクラスポインタを保持すると何故かコンパイルエラーが出るのですが…
>>409 ポインタならできるはず・・・
ただ先行宣言が必要だけど
class B;
class A {
B* b_;
};
class B {
A* a_;
};
411 :
デフォルトの名無しさん :04/11/11 23:53:41
先行宣言というより friend class っぽい悪寒
>>400 hige.push_back(*static_cast< Hige * >(this));
>>409 class B;
class A {
private:
B *b;
};
class B {
private:
A *a;
};
ちゅーか
>>409 は
Cの自作関数の作り方から勉強し直しの予感
414 :
409 :04/11/12 00:43:16
>>410-412 先行宣言じゃなく相互にヘッダをincludeしてたんですがエラーの原因は別でした。
試行錯誤の結果無事できました。レスありがとうございました。
>>413 ちゅーかc++の勉強不足でした…orz
>>414 > 相互にヘッダをincludeしてたんですが
詳しく
416 :
デフォルトの名無しさん :04/11/12 02:03:36
>>415 あ、すみません。よく見たらちゃんと先行宣言もしてありました。
---a.h---
#include"b.h"
class a{
public:
a(b* bb){pb = bb;}
b* pb;
};
---b.h---
#include"a.h"
class a;
class b{
public:
b(a* aa){pa = aa;}
a *pa;
};
簡略化するとこんな感じのソースでした。では。
もういっぺん基礎からやり直せ
int b(); int a() { b(); } int b() { a(); }
ゴメソ勢いでintっちまった
420 :
デフォルトの名無しさん :04/11/12 15:14:51
code_a.cc code_b.c というC++とCの二つのcodeがあります。 code_aで使っている関数のうちb1()はcode_b.cで定義されていて、 code_bで使っている関数のうちa1()はcode_a.ccで定義されています。 Makefileの中に code_a: code_a.o code_b.o code_a.o: code_a.cc code_b.o: code_b.c という依存関係が書かれており、 make code_a をすると g++ -c -o code_a.o code_a.cc gcc -c -o code_b.o code_b.c gcc code_a.o code_b.o -o code_a code_a.o: In function `main': code_a.o(.text+0xa1a): undefined reference to `b1()' code_b.o(.text+0x907): undefined reference to `a1()' collect2: ld returned 1 exit status make: *** [code_a] Error 1 というlink errorが出ます。 code_a.ccをの中身を書き換えて(constを#defineにしたり)、 code_a.cに変えてしまえば問題なくmakeが通ります。 code_aをC++のままでmakeしたいのですが、 何が問題なんでしょうか。
>>420 /* code_a.cc */
extern "C" int b1(); // b1がCリンケージの関数であることを示す宣言
extern "C" int a1(){/* ... */} // a1をCリンケージの関数として定義
これでうまくいかないかな。
どうもありがとうございました。 上手くいきました。 これって基本事項かな? 普段、Cのcodeと混在させるってしないもので。
C++ FAQくらいよんどこうな
425 :
デフォルトの名無しさん :04/11/12 20:36:45
C++ を使って数値計算 (おもに行列計算) をやりたいのですが、 フリーで質のよいライブラリってあるでしょうか? よろしくお願いします。
>>426 ごめんなさい。すでに出ていたのですね。
ご丁寧にありがとうございます。
本スレがあるのかと考えてしまった 「本店」とかと同じ使い方か
>>528 その場合の「本店」自体、イントネーションで二通りの解釈があるな。
いわゆる「当店」って意味ですか。
本官を侮辱すると(ry
javaのdeprecated宣言の様にコンパイル時に該当クラスやメソッドの利用を推奨しない事を警告するような方法はありますでしょうか? 環境に依存しないのが良いのですが特定のコンパイラにはあると言う情報でもかまいません。
>>433 クラス単位なら、当該ヘッダに #warn 書いておくとか。
>>434 ヘッダ内に移行すべきクラス書きたい時とかどうしようか悩んでしまってるんです。
やはり事由を記述して新しいヘッダ読めって書くべきなんでしょうかねぇ。
むぅ。
みなさんありがとう、 gccっていろいろ拡張されているんですねぇ。 とりあえず現行のソースは@deprecatedを使ってdoxygenで作ったマニュアルを見てくださいと#warnに書いておく事にします。
コンストラクタのメンバ初期化部って表現力低すぎだよね
440 :
デフォルトの名無しさん :04/11/14 18:57:58
構造体も・・・
構造体も必要ならコンストラクタ書いちゃうから気にしないなぁ。
Win32APIだと構造体だらけで HOGE hoge = { sizeof(HOGE) }; なんて初期化する場面がしょっちゅうあるからな。
444 :
デフォルトの名無しさん :04/11/14 19:25:23
>>443 動作上よく出てくるのはいいが
記述上おなじことを何度も書いてる香具師は低脳
>>444 それコンストラクタのメンバ初期化と何か関係ある話か
446 :
デフォルトの名無しさん :04/11/14 19:39:08
>>445 442までは関係あったが、443から関係なくなった
448 :
デフォルトの名無しさん :04/11/14 19:45:35
>>447 いーや、関係ない
442で終わった話を無理やり続けているだけ
あげてる奴はなんでそんなに仕切りたがってるんだ。
450 :
デフォルトの名無しさん :04/11/14 20:08:28
>>449 別に続けるなとは言ってない
この点でもまたお前は流れが読めてない
>>450 屁理屈はいいから。
つか
>>444 はコンストラクタの話とは関係なかったんだな。
どうりで意味不明だと思った。
const参照の代入をコンストラクタ内で行えたら便利よくないか? よくないか。
454 :
デフォルトの名無しさん :04/11/14 21:02:05
int main() { unsigned short int a,b,c;// 2 byte a=40000; b=30000; c = (a+b) >> 1; cout << "a: " << a << endl; cout << "b: " << b << endl; cout << "c: " << c << endl; } こいつの出力がちゃんと a: 40000 b: 30000 c: 35000 // ここがオーバーフローして計算されると予想した になるのはコンパイラが賢いからでしょうか?文法的に正しいのでしょうか? それともわたしが勘違いしてるのでしょうか?(環境はVC7.1です) 教えてください。
希望通りにしたいなら (unsigned short)(a+b)
>>454 "integer promotion" または 「整数の格上げ」 とか、そういうの。
>>453 const参照→const Hoge&なメンバ変数がコンストラクタ内なら代入できる。みたいな
>>457 初期化で十分だな。そんなの全然便利よくない。
459 :
デフォルトの名無しさん :04/11/14 21:27:42
>屁理屈はいいから。 プ
>>458 const変数の初期化をコンストラクタ内でしたいと思うことはかなりある。
参照はなにかとややこしいので出来なくていいと思うが。
JavaもC#も出来るし、次はC++もできるようにして欲しいな。
VBのソースをC++に変換するにはどうしたらいいの?
いったん.NETにコンバートしてコンパイル。 実行ファイルを逆アセンブルしてC++.NETのソースに戻す。 dotnet2win32を使って普通のコードに直す。 ただし、完全にうまく行くとは限らない。 はい、次の方どうぞ。
>>461 初期化したいなら初期化すればいいだろ。
代入できるようにする必要は無い。
>>463 即レスありがとう。
私が使用してるのはMicrosoft Visual C++ 6.0なんですが
コンバートできますか?
>>464 >>457 は「代入」と書いてるが、書いてる内容はJavaなんかの初期化のことだ。
ある計算結果をconstメンバにしたいときとか。
>>455-456 ありがとうございます。
キーワードをもとに調べてようやくわかりました。
1. 型は常に、必要であれば、精度を失わないように、サイズの大きな型にプロモートされる
2. int型よりもより小さな整数型が含まれた算術式では、評価の前にint型にプロモートされる
(C++ Primerより)
ということはint型より大きな数値で試せばオーバーフローするのかな?と思って試すと無事(?)フローしました。
int main()
{
unsigned short int a,b,c;// 2 byte
a=40000;
b=30000;
c = (a+b) / 2;
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
unsigned long d,e,f,g; // 4 byte
d = 4000000000;
e = 3000000000;
f = (d+e) / 2;
g = (d & e) + ((d ^ e) >> 1);
cout << "d: " << d << endl;
cout << "e: " << e << endl;
cout << "f: " << f << endl;
cout << "g: " << g << endl;
}
ありがとうございました。
--- 467の結果 --- a: 40000 b: 30000 c: 35000 d: 4000000000 e: 3000000000 f: 1352516352 g: 3500000000 --- _(._.)_
Foo::Foo(int x) : constmember_(x ? Foo::bar() : Foo::Baz()) {} 何も困らんが、釣り?釣られた?
>>466 C++で代入と初期化の区別を曖昧にするな。
計算結果をconstメンバにしたけりゃ勝手にしろよ。
>>469 誰も困ってるなんて話はしてないわけだが。
そうやってメンバ初期化部分がごちゃごちゃするから
コンストラクタ内で書けるといいねってだけの話だ。
そうですよね Foo::Foo(int x) : constmember_(x ? (x!=1 ? (x!=2 ? ( x!=3 ? (....) : Foo::bar3() ) : Foo::bar2() ) :Foo::bar1()):Foo::bar()) : Foo::Baz()) {}
>>470 区別を曖昧にしてるのは俺じゃねーよ。457だ。
>>471 469のどこがごちゃごちゃ?
コンストラクタ内で書けるとどうなるの?
私はどうしたらいいんでしょう^^:
>>474 いちいち例を書かんとダメなのか・・・
メンバが複数あったりコメント書きたかったり、適当に想像しろ。
煽らなくても^^:
480 :
デフォルトの名無しさん :04/11/14 22:26:32
笑とけ笑とけ。
>>475 自力でゴリゴリするも良し。1から作り直すのもまた宜し。
>>475 VBの一関数を書き直すだけとかなら機械的にできなくもないが、
フォームデザインも含めてとなると結局は作り直しになる。
>>483 回答ありがとうございます
>VBの一関数を書き直すだけとかなら機械的にできなくもないが、
そういうソフトとかあるんでしょうか?
フォームやデザインは書き直さなくてもいいので良ければ教えてもらえると
幸いです。
bmpファイルのビット数を変換するためのサンプルプログラムなどを置いているサイトなどありませんか?
>>486 ありますが、純C++の話題じゃないので書けません。
Rubyなら簡単だよ!!!!!!!!!!!!!!!!!!!!1
>>486-
>>489 スマソ、向こうで聞いてみます。
仮想継承やってて sizeof したらサイズがでかいんです g++ だと普通なのに…
>>491 ??わからん??
gcc以外のコンパイラではサイズがでかくなるという意味?
っていうか、クラスを使う限り、sizeofを使うケースってある? もちろん、Cの関数を呼び出すケースは別にして。 コンテナとアルゴリズムを適切に使っていれば、 使うケースは無いような気がするけど、どーよ?
496 :
デフォルトの名無しさん :04/11/17 20:36:19
template<typename T> とかの T の種類によって処理を変えたりとかできませんかね switch (T) { case int: みたいな
モダーン嫁
if (typeid(T) == typid(int) { // int の時の処理 } else if (typeid(T) == typid(double) { // double の時の処理 } 以下続く ただし全然オススメ出来ない 特殊化すればいいわけだし
ありがとうございます。特殊化というのを調べてみます
RTTI牛刀
正直、RTTIつかわなきゃならない程追い込まれた事がない
Extension Object, Role Object パターンとかで使ったりもするけど
RTTIって言うとdynamic_castも含まれちゃうけど、 typeidに限って言えば俺もほとんど使ったこと無いな。
dynamic_castも極力使わない
dynamic_castは使ったら負けだと思う 根性無いからしょっちゅう負けてるけど
506 :
デフォルトの名無しさん :04/11/18 02:45:02
---- struct A { template< typename T > A(); }; struct B : A { B() : A<int>() {} }; ---- ↑をコンパイルすると、Bのコンストラクタ内の初期化リストで文法エラーになってしまいます。 テンプレート引数がコンストラクタの引数から推測できないコンストラクタテンプレートは どうやってテンプレートインスタンスを選択するんでしょうか?
>>506 よくわからんが、こんな感じではだめなん?
template <typename T>
struct Type2Type {
typedef T OriginalType;
};
struct A {
template <typename T> A(Type2Type<T>) {}
};
struct B : A {
B() : A(Type2Type<int>()) {}
};
>>507 それは
「テンプレート引数がコンストラクタの引数から推測できるコンストラクタテンプレート」
になってるだろ。
template <class T> class C { template <class U> friend class C<U>; }; が VC7.1 でコンパイルしたところ error C3857: 'C<T1>': 複数テンプレート パラメータ一覧は使用できません。 ってなるんですが、friend には出来ないってことなんですか? More Effective C++ の auto_ptr に同じコードがあるんですが…
new関数をコンストラクタを呼び出さずに呼び出す方法ないですかね? 配列テンプレートを作るときに格納するクラスで定義された メモリ確保方法を使用したいのですか…
あ。ごめん。逆か。 でもやりたいことをするためには、普通 placement new だと思うんだけど……。
>>506 >テンプレート引数がコンストラクタの引数から推測できないコンストラクタテンプレート
って初めて見たんですがありなんでしょうか? >> All
14.5.2 - Member templates [temp.mem] -2- より引用。 Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. 「明示的なテンプレート引数を与えることはできない」ということで、 つまり、暗黙の呼び出しのための手がかりが無い以上、 呼び出す方法が無いってことになるのかな。
コンパイラから見たらデフォルトコンストラクタが複数あるように見えるだろうし、 どちらにせよそういう使い方はよろしくないな、使用されないダミーのパラメータを持たせるのが良いかと。
>>511-514 うーん。でもこの方法だと、new/deleteが宣言されてない型とか
プリミティブ型のnew/deleteを呼び出したときデフォルトの
new/deleteが呼び出せずコンパイラエラーになってしまいますね(VC.NET2003)
ATLのCArrayとかSTLのvectorでもmallocの類つかってるみたいだし
やっぱ無理なのか…
関数への引数として参照を用いた場合 何byteのデータとして渡されてるんでしょうか? というより「渡される」という解釈ではないのかな? あと、構造体を作るときのアライメント(4byte刻みとかのやつ)は 関数に渡すときの引数群にも当てはまるのでしょうか? 例: void Func( char c1, int i, char c2 ); void Func( int i, char c1, char c2 ); 微妙な話題ですみません 関数を作るときとか、どういった順序がいいのかよく迷うので 指標になるようなものはないかなぁと思いまして
>>522 > 何byteのデータとして渡されてるんでしょうか?
一般的な実装では、ポインタと同じ。
> 関数に渡すときの引数群にも当てはまるのでしょうか?
一般的な実装では、当てはまらない。
順番は呼び出し側コードの読みやすさ、書きやすさで決めれ。
>>522 構造体でも4バイトアライメントとは限らない。環境(コンパイラオプションを含む)で変わってしまう。
また、関数の引き数は構造体とは違うので(以下>523
525 :
デフォルトの名無しさん :04/11/19 10:10:38
>>522 構造体への参照なら一般的な実装ではポインタ渡しになっており
このときの「隠しポインタ」はポインタとしての境界要求を持っていて
メモリ空間が 32bits の処理系では 4bytes 境界が多い
引数の順序に関しては俺はこうしてる
主要なものほど左、ただし同じ系列の関数と統一性を持たせること
デフォルト引数の仕様に不便を感じることがある
void Func(int hour = 0, int min = 0); //という関数に対して
Func(0); //暗黙の min = 0 はできるが
Func(, 0); //暗黙の hour = 0 ができない
こんなときは素直にオーバーロードするがいまいち釈然としないものが残る
void Func(int hour, int min);
inline void Func(int min) { Func(0, min); }
>>525 名前付きパラメータですね.もしかしたら次のBoostに入るかも.
Func(0); // min = 0, hour = 0
Func(hour = 1); // min = 0, hour = 1
>>525 最初の段、ダウト。境界とメモリ空間には強い関連はない。
メンバの型と並びによって、複雑なふるまいをすることが少なくない。
528 :
デフォルトの名無しさん :04/11/19 11:42:13
>>527 ああ、空間が 32bits だから境界があるわけじゃないな
これは失礼した、言い直す
境界は空間ではなくバス幅から出てくること
バス幅が1番地あたりのビット数の2倍なら 2bytes 境界、
4倍なら 4bytes 境界の制限が生じる
とは言うものの
バス幅 64bits なのに非特権状態では奇数番地でいいのがあったり
バス幅 8bits なのに 2bytes 境界のがあったりと
憶えたての人を混乱させるシステムが跋扈しているんで
簡潔な説明がしづらい (言い訳くさくてアレだが・・・
>>528 素直に、環境依存だから当てにするなって言えばいいじゃん。
実際、sparc compilerなんかだとメンバに一つでもdoubleが入ると8バイト境界になるけど
charしかなければ1バイト境界だし。
530 :
デフォルトの名無しさん :04/11/19 13:09:01
>>529 いや判断材料は持ってないとSF的な妄想で書くわけにもいくまい
522 が訊きたかったのはそのあたりじゃないか
当てにするなというよりマニュアルとアセンブラで確認しろってとこだが
仮にそう言ったとして今現在の 522 にとってどうなのかな
531 :
デフォルトの名無しさん :04/11/19 13:40:15
532 :
デフォルトの名無しさん :04/11/19 13:43:54
int hour; int min; void Func(...); とかじゃねえだろなw
T* p = new T; T* p = new T(); の両方見るんですが、差異はあるのでしょうか…?
>>533 T が POD の場合、前者は中身が初期化されない。
後者はあたかも = {0} したかのように初期化される。
>>534 ありがとうございます
POD っていうのは
ユーザー定義コンストラクタ、デストラクタ、コピー演算子がない
かつ private, protected に非staticデータメンバがなく、
基底クラスも仮想関数も持たないクラスという理解でいいでしょうか…?
536 :
デフォルトの名無しさん :04/11/19 14:26:43
p->int::~int();
template <class To, class From> inline To implicit_cast(From from) { return from; } と static_cast はどのように使い分けたらいいのでしょうか? あと implicit_cast の引数は const From& from で渡した方が 効率がいいように思うのですが、これでは何か問題があるのでしょうか?
>私としては、C++ の委員会が reintepret_cast と static_cast とを相互排他的な >動作セットに分類してくれていたらと思います。これら 2 つの演算子の動作が >重複しなければ、プログラマもそれぞれの演算子を使うべき場面を判断しやすかった >でしょう。 ハゲドウだな。
俺は別に迷ったこと無いけどな・・・。
>しかし、たとえ必要のない場合でも、このようにすべての型変換を >明示的な形にすることにはメリットがあります。 全ての暗黙の型変換を implicit_cast でやるのはマンドクサイ気がするんだが、 これ読む限りやったほうがいいのかな?
implicitっていう名前がこれまた最悪だ
>>541 コンパイラの警告をつぶすためには有効じゃないかな。
情報喪失の警告は重要な情報だが常に出るのはうざいので、
implicit_cast でマーキングした上でコンパイラさんには黙ってもらう。
grep すれば後から見つけ出せる。
間違ってもコンパイラオプションで黙らせるようなことはしちゃいけない。
>>543 long lg = 0;
short st = 0;
st = implicit_cast<short>(lg);
VC7.1 では
warning C4244: 'return' : 'long' から 'short' に変換しました。データが失われているかもしれません
ってなるんだけどどういうこと??
implicit_castの中で出てるんでしょ? そこだけ警告切りなよ。そのために関数にしてるんだから。
暗黙の型変換を全てimplicit_castで書いてる香具師なんているのかね
>>544 BOOLからboolの変換でうるさいから、
BOOL foo = TRUE;
bool bar = !!foo;
してますがなにか。
bool bar = foo ? true : false;でいいんじゃないか。
bool bar = ( foo != 0 ); 俺はこれ。
!Ruby
551 :
デフォルトの名無しさん :04/11/19 20:55:01
スコープ解決演算子でエラーが起こる(VC7.1,GCC3.4.3)のですが、 どうすべきなのでしょうか? error C2510: 'type' : スコープ解決演算子 '::' の左側の識別子名は、クラス、構造体、共用体のいずれでもありません。 namespace Name { struct a { typedef int type; static const int data; }; } //const int ::Name::a::data = 100; //OK //const ::Name::a::type Name::a::data = 100; //OK //const Name::a::type ::Name::a::data = 100; //NG //const ::Name::a::type ::Name::a::data = 100;//NG
552 :
デフォルトの名無しさん :04/11/19 20:59:12
新しい演算子を定義できないから嫌い。
553 :
デフォルトの名無しさん :04/11/19 21:18:12
それが関数でありクラスであり・・・ 無数の空間を与えられながらそれを否定して ある特定の文字列に固執する者は遠目に何に見えると思うかね
>>552 どーも
type ::var を type var に変形したら通りました
template <typename T> struct identity
{
typedef T type;
};
const Name::a::type identity<::Name::a>::type::data = 100; //OK
const ::Name::a::type identity<::Name::a>::type::data = 100; //OK
555 :
デフォルトの名無しさん :04/11/19 22:43:08
551にレスしたわけじゃないよ
>>550 //const Name::a::type ::Name::a::data = 100;
これは
const Name::a::type::Name::a::data = 100;
ということなので、NGで当たり前。
const Name::a::type (::Name::a::data) = 100;
とすればいい。
557 :
デフォルトの名無しさん :04/11/20 09:05:34
おはようございます。 ファイル入出力やディレクトリ操作から始まって ソケットプログラミングまで扱うような、 C++の用例の載っているおすすめの参考書がありましたら教えて頂けませんか? 趣味でプログラムの勉強をしてまして、 UNIXの基本コマンドを練習用に自分で書いてみたいんです。
558 :
デフォルトの名無しさん :04/11/20 10:07:40
allocaを使いたいのですが、いろいろ調べてみるとallocaは、 プラットフォーム依存になってしまうなど、あまり使うのを推奨されていないようで、 allocaの代わりになるようなものは、ないでしょうか? 以下のコードのように、呼び出し先で明示的に確保されたメモリを 解放しなくても良い方法を知りたいのです。宜しくお願いいたします。 char* ReturnChar(void) { char* pRet = new char[5]; strcpy(pRet, "test"); return pRet; } int main(void) { char* pTest = ReturnChar(); // ここで、delete[] pTest; をしなくても解放されるようにしたい return 0; }
>>558 boost::shared_array
>>558 オマエの例では、allocaはもともと使用できないぞ。
あの例だと、これが最適じゃないか? void GetChar(std::string &ret){ ret="test"; } main(){ std::string test; Char(ret); }
sharted_arrayかstringで受け渡ししる const std::string GetChar() { reutrn "test"; } int main(void) { std::string str = GetChar(); return 0; }
>>557 です。スレ違いですよね。別のスレで改めて質問しようと思います。
>>564 あるよ。
UNIXネットワークプログラミング入門
>>561 new[]で確保したものにauto_ptrはよろしくないかと。
申し訳ない
どっちかっつーと対応するのはscoped_arrayだと思うが。 allocaの代わりって事は他とshareしないんだろ?
boost1.32.0キタ━━━━(゚∀゚)━━━━!!
Name::a::type const ::Name::a::data = 100;
>>572 typedef char* type;
ポインタだと違う型になってしまう悪寒。
御解答ありがとうございます。
>>559 、
>>562 、
>>563 、
>>568 で検討して見ます。
できれば、allocaの代わりになるものでANSI準拠のものが良かったのですけど。
ちなみに、boostってライセンスってどうなんですか?
改変、商用OKであれば、嬉しいです。
>>574 OKだったはず。バイナリ配布なら特に明記もいらないんじゃなかったっけか
579 :
デフォルトの名無しさん :04/11/21 10:05:27
#define UNICODE #define _UNICODE #include <iostream> int main() { std::wcout.imbue(std::locale("japanese")); std::wcout << L'A' << std::endl; return 0; } 実行結果: 65 Aって表示して欲しいのに数字で表示されちゃいます。 vc7.1 STLport-4.6.1です。
"A"
std::wcout.put(L'A') << std::endl;
std::wcout.put(L゚∀゚) << std::endl;
>>582 さんの様に入力するとコンパイルエラーがでます。
そりゃそうだ
なんで殆どの方はVC7.1にもstlport適用するかな(プンプン
漏れ適用してないよ。
coutだとcout<<'A'<<endlでちゃんと表示されるのに...。 仕様ですか? ほかの人のソースを見るとlocale::global(locale("japanese"))で、できてるのですが stlportだとstd::wcout.imbue(std::locale("japanese"));ってしなきゃならないのらしいのですが これはstlportが単独でわるいのですか?585さんが言うようにvc7.1とあわさると悪くなるのですか
589 :
デフォルトの名無しさん :04/11/21 14:41:07
x=new double*[X]; for (int i=0;i<X;i++) { x[i] = new double[Y]; } で2次元配列を確保しているのですが、これをメモリ上で連続した領域に確保するにはどうしたらよいでしょうか?
x=new double*[X]; x[0] = new double[X*Y]; for (int i=1; i<X; i++) x[i] = x[0]+i*X; とか
>>588 VC++ではデフォルトでwchar_tはshortのtypedefだから
君が文字を突っ込んだつもりでも、向こうは数字が来たと思ってる。
さらにSTLPortはこのデフォルトの設定を使ってコンパイルしてるから
単にVC++の設定を変えるだけだとリンクエラー出る。
STLPortのmakeファイルをいじって再コンパイルが必要。
STLPort使えねー
VC7.1でSTLPort使うメリットあるのかね?
かなり初歩的な質問だと思うのですが,C で普通に行える void *a = 1; a += 5; のような事を C++ 内で行うと gcc に 「error: `void *' 型のポインタが計算で使われました」 と怒られてしまいます.これを回避するにはどうすれば良いのでしょうか. ポインタだけでも教えて頂けると助かります. ; 現状は char* にキャストして回避してます...
>>かなり初歩的な質問だと思うのですが,C で普通に行える 嘘をつくな
void* には減算、加算はなくて ==, != しか無い。 どんなクソプログラム書いてるのか知らんが一から考え直せ。
>> 594 C のコードではエラー出てなかったんで,てっきり使えると思ってました. >> 596 mmap したものに memcpy でデータを順次書き込んでいくコードなんですが, 書き込み位置をずらすために, void *p = mmap(...); mempcy(p, hoge, size); p += size; // ← ここ のような事がしたいんですが,普通はどうやるんでしょうか?
char*でええやん
いや BYTE* を使うべきだろ。
600 :
デフォルトの名無しさん :04/11/21 20:43:07
>>597 >C のコードではエラー出てなかったんで,てっきり使えると思ってました.
gcc には非標準拡張がてんこ盛り入ってる
他がそんなに綺麗なわけでもないが・・・
あんまり1つの処理系での「常識」を信じすぎるな、という教訓を得たならめでたいことだ
おめでとう
みなさん,ありがとうございます.勉強になりました.
じつにめでたいな
めでたいっつーか、おめでたいな。
今日は赤飯だ
10歳違いの妹が初整理をつい最近迎えました
おめでとう
VC7.1でSTLportを使うと、必ずマルチスレッドのモジュールをリンクしないと
エラーが出るので(STLportはスレッドセーフレベル2)、気をつけなければいけ
ないとすればその点かな。
速度的には・・・・どうなんでしょう?アルゴリズムは結構速いという定評ですが。
http://www.nantekotta.com/stl.html ↑これはVC6.0付属のDinkumwareとの比較なのであまり参考にならないが。
スレッドセーフレベルって何?
ぐぐってみたけどrubyの方言か?
C++よりRubyの方が先進的。 禿も最近はRubyがお気に入りだってさ。
STLPortはrubyで出来ていたのか(w
C++には将来がない。 Rubyには未来がある。
セーフ・レベルがあるのかどうかは知らんが、STLportは例外セーフおよび スレッドセーフである事は確か。オプションでコントロールできるが。 _REENTRANTマクロだっけ。
_MTマクロだろ
class Vector { // 基底クラス(ベ−スクラスとも言う) int x,y ; // 座標値のみをもっているクラス public: Vector( int a,int b ) { x = a ; y = b ; } int get_x() { return x ; } } ; class Point: public Vector { // 派生クラス(導出クラスとも言う) int color ; public: // デフォルトの色は9 Point( int a,int b,int cc=9 ):Vector( a,b ) { color = cc ; } int get_color() { return color ; } } ; Pointコンストラクタの後ろについている「:」がよくわかりません。 PointクラスがVectorクラスを継承しているのは分かるのですが・・・・・・
よく本嫁
>>619 初期化リスト。格好としては基底クラスのコンストラクタを呼び出している
ような感じになっている。
低レベルな質問にも親切に答えて下さってありがとうございます。
STLPortはロケール関係でメモリリークが検出されるのが気に入らない。
なら使わなきゃイイじゃん
使ってないけど、直してくれれば使いたい。
自分で直せば?
直してまで使いたいとは思わない。
文句を言うだけでお客様然とする奴等はRubyを使う資格無し。
629 :
デフォルトの名無しさん :04/11/22 02:21:36
ostream で、80行とかで改行してくれるような物を作ろうとしています。とこ ろが、ostream を派生させたクラスを作ってput,writeをオーバーライドして、 書き込み文字数をカウントして、改行を付加しながら出力すれば簡単に出来る かなと思いきや、 putもwriteもvirtualじゃないので、 ostream::operator<< で入力した物は派生クラスのput,writeを呼んでくれなくあえなく断念。かと 言って、他のPODに対してのoperator<<を軒並オーバーライドするのも馬鹿っ ぽいし、何か良い知恵があったら教えて頂けませんでしょうか。 書式制御なので、出来ればstreambufをいじるんじゃない方向がいいんですよね。 イメージとしては、 custom_stream stream(5) stream << "test" << 200 << 0.05 << "test"; で、 test2 000.0 5test のようになるようなストリームクラスを作りたいのです。
stringstreamに一度出力して整形しながらもう一度 出力しなおすのが楽なんじゃないか?
>>623 #ifdef _DEBUG
#define _STLP_DEBUG 1
#define _STLP_USE_NEWALLOC 1
#else
#undef _STLP_DEBUG
#endif
こんな事をしとけばいい
632 :
デフォルトの名無しさん :04/11/22 09:06:54
age荒らし厨ウゼー
634 :
C++ 初心者 :04/11/22 20:12:49
こんなことがしたいんですけど、 コンパイル エラーが出るんです。 どういう風に修正したらいいでしょうか? class Record { ... }; typedef Record* RecordPtr; typedef const Record* ConstRecordPtr; class Hoge { private: vector<RecordPtr> _records; public: const vector<ConstRecordPtr>& GetRecords(void) const { return _records; } };
use "template"
って違うな。何がやりたいのかと、エラー個所かけ
>>634 vector<ConstRecordPtr> GetRecords(void) const
{
vector<ConstRecordPtr> result;
result.reserve (_records.size ());
copy (_records.begin (), _records.end (), back_insert_iterator <vector<ConstRecordPtr> > (result));
return result;
}
return _records でエラーです。 E:\Project\Test67\Main.cpp(18) : error C2440: 'return' : 'const class std::vector<class Record *,class std::allocator<class Record *> >' から 'const class std::vector<class Record const *,class std::allocator<class Record const *> > &' に変換することはできません。(新しい動作 ; ヘルプを参照) 理由: 'const class std::vector<class Record *,class std::allocator<class Record *> >' から 'const class std::vector<class Record const *,class std::allocator<class Record const *> >' へは変換できません。 コンストラクタはソース型を持てません、またはコンストラクタのオーバーロード レゾリューションがあいまいです。
>>637 あのー、戻り値は & なので、ローカルの result を返したらあかんでしょう。。。
あ、戻り値の & をとったわけか。 いや、そんな重いことはしたくないですぅ。。。
何がやりたいのか、といいますと、 RecordPtr のベクタを、ConstRecordPtr のベクタとして返したいわけです。 もちろん、コピーなどの操作は一切行わずに、単純な型変換だけ行ってです。
>>640 じゃresultに相当するのをmemberにもって慎重に操作したら?
だいたいその手の最適化は最後にプロファイルしてからだ
>>640 vector<ConstRecordPtr> GetRecords(void) const
{
return vector<ConstRecordPtr> (_records.begin (), _records.end ());
}
こっちがいいかも
>>642 > だいたいその手の最適化は最後にプロファイルしてからだ
いえ、レコードが大量にあることがあらかじめ分かっているので、
コーディング時にその最適化は終わらしておきたいんです。
>>643 やっぱりコピーしなあかんですか。。。
C++ ってこういうものなんでしょうか。。。
やっぱり奥の手を使うしかないのかなぁ。。。 こんなんで。 vector<ConstRecordPtr>& GetRecords(void) const { return * (vector<ConstRecordPtr> *) (void *) (& _records); }
うっさいなぁ。これでいけ。 const vector<ConstRecordPtr> &GetRecords() const{ return (const vector<ConstRecordPtr> &)_records; }
>>634 こういうキャストで済む問題じゃないよな。
return *reinterpret_cast<vector<ConstRecordPtr>*>(&_records);
ていうか、ただvectorの内容を参照したいだけなら const_iteratorを返せばいいんじゃないの?
>>646 あ!そんなんでいけるんですね。
ありがとう!感謝感謝
>>648 イテレータ返すのって、作法としていいのかな。
vector<..>::const_iterator GetRecordsBegin()
vector<..>::const_iterator GetRecordsEnd()
みたいに2つも用意しないといけないでしょう。
>>650 std::pair<std::vector<hoge>::const_iterator, std::vector<hoge>::const_iterator>を返せば良い。
うわー、それを呼び出すときって、大変じゃない? pair 変数と const_iterator 2 つを用意して、 pair 変数で受け取って、second と first をとって別の変数に代入して。。。 Python のタプルのようなものがあれば楽だけど。
653 :
デフォルトの名無しさん :04/11/22 21:07:11
>>650 おいおい <algorithm> の関数の大半を否定するかよ・・・
少なくとも記法という観点からは否定したいねぇ。 map とか pair を多用するけど、便利なことは便利だが。
655 :
デフォルトの名無しさん :04/11/22 21:09:07
続きを検索なんてどうやっとん
イテレータによるコンテナの抽象化って、 正直いってあまり使わないんだよねー。 設計の段階でどのコンテナを使うべきかだいたい決まってしまうし。
658 :
デフォルトの名無しさん :04/11/22 21:15:22
>>657 例えばパーサ作ってるときの区切り文字とか
それはお前がalgorithmを使いこなしてないだけ
それはイテレータみたいの使うねぇ。
661 :
デフォルトの名無しさん :04/11/22 21:25:41
650: イテレータ返すのって、作法としていいのかな。 653: おいおい、<algorithm> の関数の大半を否定するかよ・・・ 654: 少なくとも記法という観点からは否定したいねぇ。 655: 続きを検索なんてどうやっとん 657: どういうこと? 658: 例えばパーサ作ってるときの区切り文字とか 659: ??? ←ここだけ流れが読めない 660: それはイテレータみたいの使うねえ。 「みたいの」って似て非なるものってこと?
662 :
デフォルトの名無しさん :04/11/22 21:27:36
C++厨って馬鹿ばっかり。
やっぱりRuby最高!
いや、抽象的な意味でのイテレータなら使う。 それが必ずしも STL の設計を踏襲したものにするとは限らないということ。 ポインタも抽象的な意味でのイテレータだし、 FILE* を fseek() するのも FILE* をイテレータとみなしているということだよね。
>>664 もしかしてenumeratorと間違ってない?
いや、FILE*はオブジェクト指向だろ。
for(int i = 0; i < N; i++){ ; } これも、「イテレータみたいなもの」と言えるかしら
Ruby!
671 :
デフォルトの名無しさん :04/11/22 21:39:58
>>664 そう、抽象的な意味でのイテレータだよな。
650の主張によれば始点と終点を別個に返す必要が出るらしいが、
仮に添え字で返したにしてもそれは同じことで、
本質的にシーケンス上の位置を示すものを返すことを
作法という観点からどのように否定するのか疑問に思ったわけさ。
仮に可読性と言うなら確かに STL の設計とは思想を異にする主張だな。
ある意味、template 引数が自動的な typedef になってくれることを使うか捨てるかで。
ところで、FILE* はファイル上の位置を示してないだろ。
これ、どうする?
FILE *fp1, *fp2;
fp1 = fopen("hoge", "r");
fp2 = fopen("hoge", "r");
fseek(fp2, 1, SEEK_CUR);
俺的には fseek の第2引数がイテレータで、第3引数が第2引数の型って気がするが・・・
>>667 p[i]などとして使っていれば、「イテレータみたいなもの」と言えなくもない。
イテレータは「繰り返すもの、反復するもの」だから 本義的にはポインタはイテレータではない。 だがC++のイテレータはポインタを含むように設計された (つまり繰り返し処理のために++演算子を使うことにした) からポインタはSTL内に限ってイテレータの一種になったに過ぎない。
674 :
デフォルトの名無しさん :04/11/22 21:44:47
>>671 イテレータ自体が始点と終点を知っていれば何の問題も無いのでは?
JavaやC#ではわざわざendを返したりしない。
677 :
デフォルトの名無しさん :04/11/22 21:57:42
>>675 終端標識を使ったから頭だけで済んだってのはナシだろ、
それだったらイテレータだって同じことじゃん。
FILE * はオブジェクト シークポインタがイテレータ
>>675 Javaのイテレータは不自然だから嫌い
681 :
デフォルトの名無しさん :04/11/23 06:10:24
for (int i (0); i < 10; ++ i) // <- (A) for (int i (0); i < 10; ++ i) // <- (B) cout << i << endl; // <- (C) これってg++ではコンパイル出来るんですけどいいんでしたっけ? (B)の行で(A)のiとコンフリクトするとかエラーが出るのが 本来の仕様だったりしないか不安なのですが
あとこっちも for (int i (0); i < 10; ++ i) // <- (A) { int i (0); // <- (B) cout << i << endl; // <- (C) }
683 :
デフォルトの名無しさん :04/11/23 06:26:22
クラス全体で使うコンスタントをクラス内で定義するにはどうしたらよいのでしょうか? class A{ const int x=10;//<-できない }; A::A() { const int x=10;//<-ここでしか有効でない }
>>683 class A{
static const int x=10;
};
か
class A{
const int x;
};
A::A(): x (10)
{
}
>>683 初期化リストを使うとか。A::A() : x(10) { ... };
686 :
デフォルトの名無しさん :04/11/23 06:40:55
>>684 staticをつければいいんですか。ありがとうございました。
687 :
デフォルトの名無しさん :04/11/23 10:59:15
質問お願いするっす、以下のこれは保証されているんでしょうか std::map<int, int> map_weight; map_weight[ 777 ] += 100; //いきなり printf( "val = %d\n", map_weight[ 777 ] ); //val = 100 intの初期化は、いわゆる組込型のint()に必ずなっているんでしょうか
688 :
687 :04/11/23 11:00:25
自己解決しました。もういいよ
>>688 は騙りです
単発質問にトリップがいるのか
690 :
トリップ ◆hEpdoZ.tHU :04/11/23 11:28:28
691 :
687 :04/11/23 11:50:23
>>689 どういう意味でしょうか?
自己解決したので質問に答えなくてもいい、
というのは必要はないってことですか?
692 :
デフォルトの名無しさん :04/11/23 11:56:28
>>691 俺は 689 ではないが・・・
別に放置でも構わなかったが
自己解決したことを律儀に連絡してくれたところまでは礼儀正しい印象だよ
最後の「もういいよ」が投げやりな印象を与えていて
キレやすい人に引火しかねないのが玉に瑕
>>687 ISO/IEC 14882-1998
23.3.1.2 map element access
T& operator[](const key_type& x);
Returns: (*((insert(make_pair(x, T()))).first)).second
~~~~
保証されている
>>693 ありがとうございましす。助かりました。
というかそうか…出来る人はISO C++ 規格できっちり調べるのか。
回答内容以上に頭が下がる思いです。今後の指針にします。
と失礼しました s/ましす/ます
クラスの静的メンバに構造体がある場合、うまく初期化できなくって困っているのですが・・・ たとえばヘッダに class a { static D3DXVECTOR3 m_vPosi; static int PosiX; { と定義していた場合、cppファイルの先頭の辺りで D3DXVECTOR3 a::m_vPosi.x = 5.0f; などとするとコンパイルエラーとなるのです。 int a::m_iPosiX = 5; などは通るのですが・・・・。まとめて D3DXVECTOR3 a::m_vPosi = {5.0f,5.0f,5.0f}; などとするしかないのでしょうか?
.x だけ初期化したいんなら、 D3DXVECTOR3 a::m_vPosi = { 5.0f }; でいけるはず。
>>694 当たり前だ。無駄な議論を避けるためにドラフトを読むのは常識。
そうでないとまた知ったか厨が余計な口出しをし出してスレが荒れるからな。
>>698 ググって探せばないこともないけど、
正式に読もうとすると有料っていうのはちょっとね…
>>697 ありがとうございます。
では、yだけ初期化したいときは?
すみません 681と682は他の環境ではエラーでないでしょうか?
>>702 内側の i が外側の i を隠蔽するだけで、文法的には何ら間違いはない。
ちなみにVC7.1では681も682もノーエラーで、内側の i の値が表示される。
あんまり難しく考えるな。頭禿げるぞ。
>>705 禿じゃないとC++の設計はできないらしいよ
よくわかったな。もうハゲてます。
>>705 最近ちょっと上達の兆しがあります
家系的に私はBjarneを超えるはずです
みなさんどうもありがとう
>>708 > 家系的に私はBjarneを超えるはずです
ここに激しく同情しますな
#おれもな〜
確かにobsoleteなC++だとfor文で定義した変数はfor文を終了しても
生き続けるから
>>681 は問題があるかもしれないが、VC6が今手元に
ないので実験できない。
gccなら古いC++にするオプションがあったかもしれないが覚えてない。
>>711 dクス。-fno-for-scopeと-ffor-scopeの両方でgcc3.4.2('MinGW)で試してみたが
出力結果には差がありませんでした。
但しforループを完全に抜けた後で
std::cout << i << std::endl;
の一行を付け加えると、-fno-for-scopeは古いC++の動作通り 10 が出力され
ました。-ffor-scopeでは当然ですがコンパイルエラーになりました。
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
VC++7.1付属のSTLってスレッドセーフですか? スレッドセーフじゃないならSTLPortに置き換えちゃおうと思うんですが。
VC++7.1持ってんならヘルプにもろ「Thread Safety in the Standard C++ Library」って項目あるだろうが。
>>698 最近の cppll は悪い例だったな。
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
できれば、夜の7時までにお願いします。その後遊びに行きたいので。
大変だ、後一時間半しかないぞ!
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
夜の7時までにお願いします。今コンパ中なんで、帰ったらできてるようにな。
722 :
デフォルトの名無しさん :04/11/23 18:56:06
>>721 激しくむかつく奴だな
赤っ恥かいたうえ絶対に単位もらえっこないネタ用意しといてやろうか
無視したんじゃなくて、解答してもらえたことすら理解できてないんだろう
727 :
デフォルトの名無しさん :04/11/23 20:29:31
C++Primerのサンプルコードにこういう行がありました。 typedef vector<string, allocator> textwords; 以下のようにしないとエラーになるんですが、 コンパイラとGCCのSTLのどっちが正しいのでしょうか? typedef vector<string, allocator<string> > textwords;
>>727 何ページの何行よ?俺も試してみるから。
>>728 ページ数はちょっと分りませんが、chap12のprg12_2.Cです。
gcc−3.4.3で
$g++ prog12_2.C
としただけなので何かオプションが必要なの、かもしれません。
いや、それ以前にallocatorのデフォルトテンプレート・パラメータ値は 存在しないので、前者は明らかな間違い。誤植か、作者のミスだろう。
>>728 日本語版C++Primer第3版なら、P607にあるぞ。
typedef vector<string> textwords;
に直されてる。英語版の原著の間違いだろ。
732 :
デフォルトの名無しさん :04/11/23 20:43:52
>>727 typedef vector<string, allocator> textwords;
を受理するためには
template <class STR, template <class X> class ALC>
class vector
{
ALC<STR> for_exsample;
};
のように定義されている必要があるな。
>>730-731 どもです。
私の持ってる英語版のはP583にサンプルコードと同じように載っていました。
またGCCのSTL、bits/stl_vector.hでは
template<typename _Tp, typename _Alloc = allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
のようになっていました。
bits/allocator.hは見てみましたが
>>730 さんの言うとおりデフォルト
テンプレートパラメータはないようでした。
>>732 template <class STR, template <class X> class ALC = allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
こういうテンプレートの定義はありなんですかね。
735 :
デフォルトの名無しさん :04/11/23 21:01:51
>>734 > template <class STR, template <class X> class ALC = allocator<_Tp> >
template <class STR, template <class X> class ALC = allocator >
ありなら、こうじゃないか
template <class STR, template <class X> class ALC = allocator<STR> > class vector : protected _Vector_base<STR, ALC> あ、こうだった。ちょっと調べてきます。
>736 だ〜が〜ら〜,それ通らねえべって.allocator<STR>は型でねーが. デンプレートデンプレートパラメーダに代入できるわけないべさ.
>>737 template <class STR, template <class> class ALC = allocator>
class vector : protected _Vector_base<STR, ALC<STR> >
あ、こうかな!w
>>493 コンストラクタとデストラクタから仮想関数を呼べないなんて知らなかったよ。。。
明日会社行ったらソースを見直してみます。
厳密に言うと、呼ばれないのはオーバロードされた派生クラスの 仮想関数ってことかな? 派生クラスのコンストラクタ、デストラクタで呼ばれるのは基底クラスの 仮想関数ってことなんだよね? ほんまかいな。
741 :
デフォルトの名無しさん :04/11/24 00:30:08
>>740 >厳密に言うと、呼ばれないのはオーバロードされた派生クラスの
>仮想関数ってことかな?
違う、ctor/dtorを実行中は *this へのメッセージについて virtual の効力がない
まだコンストラクタが呼ばれてない派生先のメンバが呼ばれたらおかしくなるわな。
745 :
デフォルトの名無しさん :04/11/24 00:50:28
746 :
デフォルトの名無しさん :04/11/24 00:52:17
>>742 なるほど、たしかにそうだね。
ではJavaでは派生クラスのメンバ関数が呼ばれるのはどういうこと
なんだろうか。
あぁあああああああああ・・・・orz
死ねよ
>>740 何ナチュラルに間違えてんだ。
>>746 Javaは猿でも出来るのが建前だから、
まったく同じはずのコードが場所によって違う振る舞いをするのは好ましくないから
そういう特別扱いはしないことにした、そうだ。
なんかJavaって仕様策定してるやつらも猿なんだなぁ。
かえって厄介な問題を内包させただけじゃん。
コンストラクタでは仮想関数によるテンプレートパターンが使えないんだよねー
コンストラクタとデストラクタを通常の関数と同じように考えてはいかんということでしょ
質問です。 ワケあって、int,float,double,boolなど、型の異なる要素の入り混じった リスト(配列でもいいです)を実現したいのですが(・∀・)イイ!!方法はないでしょうか。 初めポリモフィズムを試したのですが、自分がやりたい事と微妙に違っていましたし、 力技でこの構造を実現しようとすると、どんどん構造やUIがブサイクになっていってしまいますた。
boost::any
どちらにせよ取り出すときに型情報の指定が必要になる罠
>>755 C++を使う以上、どうしようもないよね。
( ´,_ゝ`)プッ 曖昧さがもたらす混乱と決別する気はないのかよ、お前ら。
要素数と順番が固定なら、boost::tupleも使えるかもね。
Ruby最強と言うことでファイナルアンサー?
760 :
デフォルトの名無しさん :04/11/24 09:31:50
類の要員函數を静的にせずに呼び返し函數の引数として 与えるにはどうしたらいいの?
->より-+>の方がかっこよくね?
->より-|>の方がかっこよくね?
->より→の方がかっこよくね?
-> より ☞ の方がかっこよくね?
APL っぽくなってまいりました。
なぜそれでUIがブサイクになるのか教えてくれ。
768 :
デフォルトの名無しさん :04/11/24 17:03:34
C++の規格書の新しい奴は丁寧なつくりのPDFになっているでしょうか? 目次やリンクが張られたものになっているのでしょうか? 14882(1998)みたいに雑なつくりなら買いたくないので。
771 :
デフォルトの名無しさん :04/11/24 18:57:55
int a = 0; int a(0); どうちがうんですか?
違わない。
>>771 もう一つこういう書き方もOKらしい。
int a = int(0);
std::random_shuffleを要素が二つのものに対して行うと必ず入れ替わるのですが、 入れ替わることもあれば入れ替わらないこともあって欲しい場合にはどうすればいいのですか?
random_shuffleをrand()回繰り返す
>>776 いや〜ん。素晴らしい!
my_random_shuffle書いてたけどそれにします
>>774 初めて知った。
全然ランダムになっとらんやん。
その代わりランバダになってるよ。
じゃあ俺ガンダムになる。
>>774 rand()の戻り値の最下位ビット判定でswap()するかどうか決めるんじゃ駄目なのか?
>>781 rand()が最下位ビットが0と1交互に出てくる乱数の場合もあるだろ…
VC++のヘルプ曰く、 「範囲 [1, last - first) 内の各 N に対して swap(*(first + N), *(first + M)) を 1 回評価します。M は、範囲 [0, N) 全体に対する一様乱分布の値とします。つまり、関数はシーケンス内の要素の順序をランダムにシャッフルします。」 なんで、要素数2なら確実に毎回交換されるだろうな。
相談なんですが 別アプリのソフトのコンボボックスのメッセージを フックしてメモ帳に書き込むことは可能ですか? 良ければサンプルソースなどお願いします。
785 :
デフォルトの名無しさん :04/11/24 21:40:18
>random_shuffle ごくふつーにライブラリのバグじゃん やること決まってるし・・・
>>782 初めて聞いた。
早速ですが具体例を挙げてください。
OS名・コンパイラ名・srand()の乱数種の数値を添えてください。
できればコンパイルオプションも添えてもらいたいです。
みんな興味を持ってると思うので後学のために是非書いてください。
お願いしますよ
>>782 さん、期待してますんで。
昔のrand()で32bit(31bit?)ぐらいの精度の時の乱数は0と1が交互にでてきったとか・・・聞いたことがある 漏れの記憶でのお話です
私は782じゃありません
それってrand()の下位ビットの周期が短いって話と混同してないか?
>>789 処理系によってはマジでそういうのがあるのよ。
そこでムェルセンヌツィスタァですよ
手軽な乱数ルーチンって何があるの?
>>795 rand()が最下位ビットが0と1交互に出てくる乱数の場合もあるだろ…
>>796 それってrand()の下位ビットの周期が短いって話と混同してないか?
ユニコードでの文字処理に関してなのですが、 VC6で_MBCSを削除し_UNICODEとUNICODEを追加してユニコード対応にしました。 LPTSTR a; _tcscpy(a, _T("ハロー")); このコードがビルドは通るのですが、実行するとエラーになるのです。エラー個所は_tcscpyが展開された wchar_t * __cdecl wcscpy(wchar_t * dst, const wchar_t * src) { wchar_t * cp = dst; while( *cp++ = *src++ ) ; /* Copy src over dst */ return( dst ); } のwhile文で起こっています。どこが間違っているのか教えていただけるでしょうか。
LPTSTRは実質wchar_t*なわけだが。で、ポインタaはどこを指してるんだ?
>>799 初めて聞いた。
早速ですが具体例を挙げてください。
OS名・コンパイラ名・srand()の乱数種の数値を添えてください。
できればコンパイルオプションも添えてもらいたいです。
みんな興味を持ってると思うので後学のために是非書いてください。
お願いしますよ
>>799 さん、期待してますんで。
copipe uzai
思うんだが、
>>786 って、なんというか、小学生がよく言う、
「何年何月何日何分何秒に!?」ってやつと同じ匂いがするよな。
803 :
デフォルトの名無しさん :04/11/24 23:15:57
>>801 そーゆー方面の文句ある奴は煽ってねえで削除板池
礼儀を諭しているつもりか知らんが自分が反則してることに気付よ早く
気付よ
ハァ????
806 :
デフォルトの名無しさん :04/11/24 23:19:23
ああ機能の人格障害君か ・・・放置
807 :
デフォルトの名無しさん :04/11/24 23:19:23
メモリを初期化する関数でmemsetってありますよね。 現場のコーディングルールで、構造体を使う時は、必ずmemsetで初期化しなさいと言われたので、 「なんで?」って聞いたら、「常識だろ?」って怒られちった・・・。 常識のない私に理由を教えてくれる人がいるとすごくうれしいです。
808 :
デフォルトの名無しさん :04/11/24 23:20:44
>>807 非常識はコーディングルールにゴネたこと
809 :
デフォルトの名無しさん :04/11/24 23:21:55
C++ならコンストラクタで初期化すりゃいいのに。
811 :
デフォルトの名無しさん :04/11/24 23:24:31
構造体の初期化なら={0};じゃないのか。
813 :
デフォルトの名無しさん :04/11/24 23:32:05
>>807 理由はこうだ。
int *a = new int
*a = 123;
delete a;
int *b = new int
cout << *b << endl;
ってやると、bが123として表示される。
つまり、単にゴミデータが残るのならまぁ許すとして、前にnewしたときに
設定したデータが、後でゴミとして残ってしまう。
このようなリスペクトなバグは排除したほうがよい。
ちなみに、問題なのはヒープ領域であって、スタック領域だと、自動的に初期化してくれるので問題なし!
new String と new String() の意味は同じであるが、 クラスではなく int などのスカラー型の場合、標準の5.3.4節では 前者の形式では割り当てられたオブジェクトの値は不定になり、 後者の形式ではメモリは0で初期化されるということを明記している C++プログラミングの処方箋より抜粋 つまり int *b = new int(); とすればmemsetなどは必要なし?
815 :
デフォルトの名無しさん :04/11/24 23:43:06
>>802 小学生呼ばわりでも全然構わない。
お前が実例・具体例を挙げれば全て解決する。
処理系がある、だけではわからん。
rand()で奇数と偶数が交互に返される実装があるんだろ?
ライブラリの名前だけでも書けよ、礼儀として。
>>802 小学生呼ばわりでも全然構わない。
お前が実例・具体例を挙げれば全て解決する。
処理系がある、だけではわからん。
rand()で奇数と偶数が交互に返される実装があるんだろ?
ライブラリの名前だけでも書けよ、礼儀として。
>>802 小学生呼ばわりでも全然構わない。
お前が実例・具体例を挙げれば全て解決する。
処理系がある、だけではわからん。
rand()で奇数と偶数が交互に返される実装があるんだろ?
ライブラリの名前だけでも書けよ、礼儀として。
>>802 小学生呼ばわりでも全然構わない。
お前が実例・具体例を挙げれば全て解決する。
処理系がある、だけではわからん。
rand()で奇数と偶数が交互に返される実装があるんだろ?
ライブラリの名前だけでも書けよ、礼儀として。
池沼
820 :
デフォルトの名無しさん :04/11/24 23:53:43
また出たよ母親に問題あるやつ
>>815 お前も人に聞く前に少しくらいググれよ、礼儀として。
あ、そーなのー・・・ぐらいで軽く流せないのかね 会社で相当いじめられてるのは同情するけどさ
Ruby最強!
824 :
デフォルトの名無しさん :04/11/24 23:55:49
よっぽど悔しかったんだね
>>816-818 コピペは止めてもらえないだろうか。こちらは真面目に質問している。
具体例を挙げるべき人が荒らしているのかもしれないが、
そんな暇があったら名前を挙げてくれればよいのに。実に簡単なことだろ?
恥ずかしい香具師とはいっしょにいたくないよね。 仲間と思われたくないし。
>>797 俺だったら、これが真実だとしても全然問題ないと思うんだが
検索すらろくに出来ないような低脳じゃ同僚に冷たくあしらわれても仕方ないわな しかしその憂さ晴らしをここでするのは勘弁してもらいたいな
829 :
デフォルトの名無しさん :04/11/25 00:07:18
同僚がでてきたぞw
>>825 本当に真面目に訊いてんだったらちょっとでいいからググってみれ。
それで本当に見つけれないんだったらお前、プログラマとしてちょっとヤバイぞ。
ここは質問するためのスレじゃないの? 検索しろで済ますのならスレ自体いらんでしょ。
デフォルトコンストラクタって0で初期化してくれなかったっけ?
MacOS X & ProjectBuilder & SDLでLifeゲームを作ってたんだけどどうもおかしい。 Win2000 & BCC32の時にうまく動いてたコードをそのままコンパイルしたんだけど縞々模様が出たまま動かない。 初期化するときに(rand() % 2)を使ってるんだけど良く見てみるとrand()が奇数と偶数を交互に返してる(ぉぃぉぃ。 srand()以外になんか準備がいるんすかぁ?
UNIX の /usr/ucb/cc、gcc、g++を解析した結果、 rand( ) は以下の動作をすることがわかった。 static long x=1; void srand(unsigned s) { x=s; } long rand() { x=x*1103515245+12345; return x&2147483647; } これは、非常にシンプルな線形合同法である。この乱数の最下位ビットは0と1の繰り返しになる。 すなわち、偶数と奇数が交互に生成される。このことから、この乱数で下位ビットを乱数として使うのは危険であることがわかる。 また、ある乱数が得られたら、次に現れる乱数が1種類しかないという欠点も持つ。
835 :
デフォルトの名無しさん :04/11/25 00:22:07
>>831 まったくだ
何かディープに勘違いしてる「回答者」には困ったものだな
あーあツマンネ
837 :
デフォルトの名無しさん :04/11/25 00:23:15
おこんばんは、お願いいたします。 ステップ実行時、「ほにゃららDllが見つかりません」と言われます。 とあるexeから、自分の作っているdllを呼ぶ処理です。 プロジェクトの「設定」で、とあるexeを指定して、 そのexeでファイル選択をすると、 自分のdllのソースのブレークポイントで止まってくれる予定なのですが。。。 プロジェクトの「設定」のどこかに、 関連するdllを列挙する必要って、ありましたっけ? 何が設定不足なのでしょうか? よろしくお願いいたします。
そうだ、このスレはそもそも必要なかったのだ。 我々はぁぁ! この(類の)スレのぉぉ! 永久停止を要求するぅぅ!
Rubyで全部解決すると言っておろうが!
>>837 スレ違い。自分が使用している開発環境の専用スレに逝け。
>>831 ,
>>835 検索しても簡単にわからんことなら仕方がないが、
検索すればすぐに分かるようなことを検索するように勧めても
尚、検索しようともしない馬鹿の言い訳にはならない。
まさか本当に検索できなかったわけじゃないよな?
水に落ちた犬は(ry かよ。お前らも容赦ないなwwwwwwwwwwwww
福祉施設職員を少しは見習ってもらいたいものだ。
846 :
デフォルトの名無しさん :04/11/25 00:44:02
>>842 キーワードでも示してやったら? 「回答者」さん
"rand 偶数 奇数 交互"
まさかキーワードが思い浮かばなかったわけじゃないよな?
849 :
デフォルトの名無しさん :04/11/25 00:46:35
すんません。三行三列と三行二列の行列の積を求める書き方教えてください。 めんどくさかったら軽いヒントでもいいんで ちなみに初期数値は与えられてます。forを使うみたいですがいまいち・・・
まさか検索エンジンが思い浮かばなかったわけじゃないよな?
テンプレにgoogleのURLが必要なのだろうかw
854 :
デフォルトの名無しさん :04/11/25 00:49:52
>>848 まさか答えがわからなかったわけじゃないよな? 「回答者」さん
|abc||pq| |def||rs|=ap+br+ct+dp+...+fs+iu |ghi||tu|
>>844 水に落ちた犬は・・・の続きは何?
「水に落ちた犬を打つ」があるけど、それとは違うっぽいのでググッたほうがいいのかな。
857 :
デフォルトの名無しさん :04/11/25 00:53:43
Linux&g++でシステムコールを使う時について質問します。 gccで.h等をインクルード無しで使えていたread(,,)等のシステムコールがImplisitエラーを出します。 g++になってシステムコールの使用法に変化があるのでしょうか?
このスレはC++相談室なわけだが・・・
Implisitってなんですか
861 :
デフォルトの名無しさん :04/11/25 00:55:55
C++の仕様が原因かどうかを論じるならスレタイ合致だな
>>857 man readして必要なヘッダをインクルードしろ。C++では宣言無しでは関数は使えない。
863 :
デフォルトの名無しさん :04/11/25 01:00:53
>>862 だったらコンパイルエラーのはずだ
857 を読む限り実行時の障害のように聞こえる
おいおいおいおいいおいおいおいおい
865 :
デフォルトの名無しさん :04/11/25 01:05:32
>>864 コンパイルエラーのメッセージテキストには implicit なる語は出てこないだろ
867 :
デフォルトの名無しさん :04/11/25 01:14:04
implicit declaration of function です。
コンパイルエラーです。
文字と
>>862 さんから推察するとgccでは暗黙の宣言として使っていたのが
g++では使えなくなったということですね。
方法を探してみます。ありがとう御座いました。
868 :
デフォルトの名無しさん :04/11/25 01:14:38
$ g++ test01.cpp test01.cpp: In function `int main()': test01.cpp:3: error: `read' undeclared (first use this function) test01.cpp:3: error: (Each undeclared identifier is reported only once for each function it appears in.)
>>869 これはすいませんでした。仕様を間違えてはいけませんね。
#include <unistd.h> が必要でした。
皆さんありがとう御座いました。
std::string が空文字列で初期化されることって保証されてるんですか?
std::listってクイックソート出来ないんですか? std::sortは使えないし
>>872 std::list::sort()ってメンバ関数はマージソート(安定ソート)だがなかなか速い。
O記法によるオーダもO(NlogN)でクイック・ソートと同じだし。但し平均的な
コンピュータのアーキテクチャではクイック・ソートの1/2程度の速度になる。
uwaaaaヽ(`Д´)ノaaaan
875 :
デフォルトの名無しさん :04/11/25 10:27:04
こういうのって、foo が先に初期化されるのか、 Base が先に初期化されるのか、どちらでしょうか? class Hoge : Base { Foo foo; public: Hoge(void) : foo(100), Base(&foo) {} };
>>875 FooとBaseのコンストラクタにプローブ入れて試せば?
>>875 コンストラクタ
ベース→メンバ(宣言した順)→自身
デストラクタ
自身→メンバ(宣言と逆順)→基底
じゃぁ、Base で Foo の関数を呼び出すことはできないのですね。 それは不便ですねぇ。。。
Baseの初期化にFooが必要なら、BaseにFooを持たせてしまえば?
いえ、Foo は FooBase を継承するクラスで、 Base のコンストラクタは FooBase* なら何でもとるのです。 Base のコンストラクタで FooBase の関数を呼び出したいのです。
>>881 ありがとう。見直してみます。
だけど、C++ ってここらへんがぎこちないですね。
初期化リストの記述順に初期化してくれればいいのに。。。
君の頭の方がぎこちないです。
C++のぎこちなさが嫌だったらさっさと他の言語に乗り換えて下さいです。。
ひろゆきキター
??
888 :
デフォルトの名無しさん :04/11/25 14:23:54
キャッシュを行うクラスを作ろうと思います。 // int から int への関数のキャッシュを行うクラス。 class Cache { public: typedef int (*Func)(int n); private: map<int,int> _map; Func _func; public: Cache(Func func) : _func(func) {} int Get(int n) { int result; map<int,int>::const_iterator it = _map.find(n); if (it == _map.end()) { result = _func(n); _map.insert(map<int,int>::value_type(n, result)); } else { result = (*it).second; } return result; } };
889 :
デフォルトの名無しさん :04/11/25 14:24:45
class SomeFunc { private: Cache _cache; static int Plus1(int n) { return n + 1; } public: SomeFunc(void) : _cache(Plus1) {} int Get(int n) { return _cache.Get(n); } };
890 :
デフォルトの名無しさん :04/11/25 14:26:07
この Func を C 関数や静的関数ではなく、 メンバ関数とするにはどうしたらよいでしょうか? よろしくお願いします。
boostのfunction&bindかな
>>890 template <typename T>
class Cache {
public:
typedef int (T::*Func)(int);
private:
map<int,int> _map;
T *obj_;
Func _func;
public:
Cache(T *obj, Func func) : obj_ (obj), _func(func) {}
int Get(int n) {
int result;
map<int,int>::const_iterator it = _map.find(n);
if (it == _map.end()) {
result = (obj_->*_func)(n);
_map.insert(map<int,int>::value_type(n, result));
} else {
result = (*it).second;
}
return result;
}
};
class SomeFunc {
private:
Cache <SomeFunc> _cache;
int Plus1(int n) { return n + 1; }
public:
SomeFunc(void) : _cache(this, &SomeFunc::Plus1) {}
int Get(int n) {return _cache.Get(n);}
};
>>890 Cacheをテンプレートクラスにすれば
ご回答ありがとございます。m(__)m
>>891 ごめんなさい、boost はできるだけ使いたくないんです。。。
同じようなことを手動でやれればいいのですが。
>>892 >>893 やっぱりテンプレート使わないといかんですか。うーん。
1クラス1キャッシュでいいなら 継承使ってできそうな気がしなくもない
それは、SomeFunc を Cache から派生させるということですよね。 SomeFunc はすでに別のクラスから派生しているんです (多重継承はあまりしたくない)。 それに Cache という機能単位を継承で使うのはよい設計ではないように 思いますが、いかがでしょうか。
>>896 >それに Cache という機能単位を継承で使うのはよい設計ではないように
>思いますが、いかがでしょうか。
まそうだろうね
boostとかテンプレートとか躊躇してるのは何で?
> boostとかテンプレートとか躊躇してるのは何で? テンプレートにいい思い出がないのが一番の理由です。 今 VC6 を使っているんですけど、 テンプレートの一部の機能が使えなかったり、 複雑になるとバグが発生したりして、 使いすぎると生産性が確実に低下するように思います。 あと、できるだけ外部のライブラリに依存したくないという意味で boost は使いたくないわけです。
VC6はご愁傷様です >できるだけ外部のライブラリに依存したくない この方針があなたの決断によるものなら考え直した方がいいと思いますよ これじゃライブラリの立つ瀬が無いですからね
アンチパターンに当てはまりまくりだな
貧乏人がWindowsのプログラム書くなよ
なんかlinuxerは貧乏人みたいにとれるな
関数内のstatic変数は、最初にその関数が呼ばれたときに初期化されるそうですが 例えば class Hoge {...]; void foo() { static Hoge hage; } というのがあって、複数のスレッドがfooを同時に呼び出した場合 hageの初期化は同期されるのでしょうか?
金を使わない奴は金がないやつ同様貧乏人。
>>903 C++の規格ではマルチスレッドのことは考えてないので、環境によります。
同期が保証されないから、 MeyersのSingletonはマルチスレッドでは使えない
金を使えば技術を得られるわけでもない
金を使わないヘタレに存在意義なし
>>910 感心した
とでも言ってもらいたいのか?
借金まみれの俺は金持ち
913 :
デフォルトの名無しさん :04/11/25 18:51:56
vector<int> の中に整数が重複して入っていて、 その中の最頻値を取り出したいとします。 このような処理を STL を使って完結に表現することはできるでしょうか?
はい。
どのようにすればできるか教えていただけるでしょうか。
917 :
デフォルトの名無しさん :04/11/25 20:09:59
クォータニオンまで扱える算術ライブラリってDirectX以外でありますか?
漫然と
>>8 を眺めてみたのですが、いまいち見つかりませんで
DirectXの物は中々使い心地が良いのですが、DirectXが使えない環境になりそうで困っています
boost::quaternion
クォータニオンなんて自作したって 1、2時間でできるんでは?
>>918 BLAS…というかnumericの所しか見てなかったですよ
boost凄いなぁ…ありがとうございました、勇んでいじってみます
>>919 まぁ、実際そうで、私も自前(と言ってもほぼとあるオープンソースのパクリ)のはあるのですが
自前だとまずい部分が色々とあったりで…boost情報助かりました
>>915 あいよっ
template <typename T, template <typename> class Container> inline
pair <T, size_t> mode_count (const Container <T> &p) {
typedef std::map <T, size_t> Counter_Register;
Counter_Register counter_register;
for (typename Container <T>::const_iterator itr (p.begin ()), last (p.end ());
itr != last; ++ itr) ++ counter_register [*itr];
struct Local {
typedef typename Counter_Register::value_type Value_Type;
static bool less_by_second (const Value_Type &lhs, const Value_Type &rhs) {return lhs.second < rhs.second;}
};
return *max_element (counter_register.begin (), counter_register.end (), &Local::less_by_second);
}
template <typename T, template <typename> class Container> inline
T mode (const Container <T> &p) {
return mode_count (p).first;
}
もっとエレガントなのは誰か教えてくれるでしょう。
>>922 すいません。ありがとうございます。
自分でも作ってみたのですが、あまりきれいになりませんでした。
よく読んでみます。とりいそぎ、お礼まで。
>>922 >template <typename T, template <typename> class Container> inline
template templateパラメータはテンプレートパラメータの数がデフォルトも全部展開した
数に一致して無いといけないので,STLのシーケンスを取るならパラメータ2つ要りますよ.
あとTはContainer::value_typeで取れるから結局コンテナの型をパラメータにするのが
妥当だと思うんですけどね.
template<typename Container>
細かいツッコミ失礼.ちなみに自分ならiteratorを引数にしたいかも.
>>922 Local::less_by_secondはローカルだけどテンプレート引数に出来るの?
>>924 やっぱ修正するのはオイラかい?
template <typename Iterator> inline
pair <typename Iterator::value_type, size_t> mode_count (Iterator first, Iterator last) {
typedef typename Iterator::value_type Value_Type;
typedef std::map <Value_Type, size_t> Counter_Register;
Counter_Register counter_register;
for (; first != last; ++ first) ++ counter_register [*first];
struct Local {
typedef typename Counter_Register::value_type Value_Type;
static bool less_by_second (const Value_Type &lhs, const Value_Type &rhs) {return lhs.second < rhs.second;}
};
return *max_element (counter_register.begin (), counter_register.end (), &Local::less_by_second);
}
template <typename Iterator> inline
typename Iterator::value_type mode (Iterator first, Iterator last) {
return mode_count (first, last).first;
}
template <typename Container> inline
pair <typename Container::value_type, size_t> mode_count (const Container &p) {
return mode_count (p.begin (), p.end ());
}
template <typename Container> inline
typename Container::value_type mode (const Container &p) {
return mode (p.begin (), p.end ());
}
もっといいアルゴリズムはないの?
>>925 g++(3.3.4)だと通るんだけどまづいっけ?
>>924 それと言い忘れたありがとう
925も
>>925 ローカルクラスがテンプレート引数に出来ない問題との違いは,
型が外部リンケージを持っているかどうか.
Local::less_by_secondの型はbool (*)(Value_Type const &, Vlue_Type const &)で,
これは外部リンケージを持った型なのでテンプレート引数に出来るはず.
929 :
デフォルトの名無しさん :04/11/25 22:48:40
std::stringの変数にabcが入っていたとします。 で、この変数にabc又はABCが入っていることをエレガントに確認するにはどうしたらよいでしょうか? (つまり、小文字、大文字意識せずに、findしたいってことです)
>>929 私はいつも stricmp(str.c_str(), "abc") しているけど、C++ 的にはどうやるんかな。
933 :
デフォルトの名無しさん :04/11/25 23:31:20
STL の string って貧弱だよな。 もっとメンバ関数充実させてほしい。
そこでRubyですよ
935 :
デフォルトの名無しさん :04/11/25 23:35:05
>>933 うん、激しく同意。
俺が思うに、これは何かの陰謀が働いていると思う。
そこでRubyですよ
そこでboost string algorithm
>>929 一応こんなんでできるけど。
struct CharEqualIC {
inline bool operator() (char c1, char c2)
{
return (toupper(c1) == toupper(c2));
}
};
int main(void)
{
string str1 = "xxxx Abc xxxx";
string str2 = "abc";
string::iterator it = search(str1.begin(), str1.end(), str2.begin(), str2.end(), CharEqualIC());
cout << (it - str1.begin());
return 0;
}
>>929 std::string str = "fgafjkAbCasln;tj";
std::cout << boost::algorithm::ifind_first(str, "abc").begin() - str.begin() << std::endl;
// 6が出力される。
std::string str = "fgafjkasln;tj";
std::cout << boost::algorithm::ifind_first(str, "abc").begin() - str.begin() << std::endl;
// 13が出力される。すなわちboost::algorithm::ifind_first(str, "abc").begin()==str.end()
>929 std::mismatch 使って頑張れ Effective STL の35項も参考になる。
>>922 ,926
Iterator::value_type ではポインタを渡したときにエラーになる
※入力シーケンスは空でないという事前条件が必要
template<typename Iterator>
std::pair<typename std::iterator_traits<Iterator>::value_type, std::size_t> mode_count(Iterator first, Iterator last)
{
typedef typename std::iterator_traits<Iterator>::value_type value_type;
typedef std::pair<value_type, std::size_t> result_type;
std::map<value_type, std::size_t> counts;
result_type const* max = 0;
for(; first != last; ++first)
{
result_type& counted = counts[*first];
++counted.second;
if(!max || counted.second > max->second)
max = &counted;
}
return *max;
}
値を返す関数の戻り値をconst参照で受け取ったらまずいですか? extern XXX get_value(); const XXX& xxx = get_value(); テンポラリへの参照になってしまうんでしょうか? 最適化をするとおかしくなってしまうようなんです
>>943 クラスのインスタンスのデータメンバや静的データメンバ、
関数の静的変数、大域変数、静的変数を返したいときは、
const参照を返してもだいじょうぶ。
const参照を返したら駄目なのは関数内のローカル変数。
>>943 あー、その場合の寿命ってどうなるんだろうな。
規格書読まなきゃわかんないな。
でもこのケースだったら無難に
const XXX xxx = get_value();
でいいんじゃないの。
バカばっかり テンポラリに決まってんだろ 禿本くらい読め
template <class Container, class T> inline Container makeContainer(const T& t) { return Container(boost::begin(t), boost::end(t)); } typedef std::vector<char> CharVec; const char* p = "Hello, world"; CharVec c(makeContainer<CharVec>(p)); これがコンパイル通らないんですが仕様でしょうか…? makeContainer(T& t) にすると大丈夫なんですが…
boost知らんけど、ポインタなんだか参照なんだかしっちゃかめっちゃかだな。
>948 boost::begin/endがchar const * constに対応してないのが原因. というか,そういうことがしたいなら以下で良いのでは? CharVec c(boost::begin(p), boost::end(p));
>948 追記.char (const) * constはRangeのモデルにならないです. 動かせないポインタ渡されて'\0'探せって言われても困るでしょ. もし,その枠組みでやるなら以下か CharVec c(makeContainer<CharVec>(boost::make_iterator_range(p))); もしくはmakeContainerをchar (const) *について特殊化するか,かな.
-もしくはmakeContainerをchar (const) *について特殊化するか,かな. +もしくはmakeContainerをchar const *についてオーバーロードするか,かな.
> 追記.char (const) * constはRangeのモデルにならないです. > 動かせないポインタ渡されて'\0'探せって言われても困るでしょ. ポインタをコピーすれば困らないよ。 range側の特殊化が抜けてるだけじゃないの?
954 :
デフォルトの名無しさん :04/11/26 11:29:43
#include <vector> struct ClassV{ int val; std::vector<int> vecInt; }; int main(int argc, char* argv[]){ std::vector<ClassV> vecClassV; vecClassV.reserve( 5 ); //resizeならBもerrorにならない for( int i=0; i < 5; ++i ){ vecClassV[i].val = 4649; //errorが出ない …A } for( int c=0; c < 5; ++c ){ vecClassV[c].vecInt.reserve(10); //error …B } return 0; } お願いします、上記のコードなのですが、 恐ろしいことに今までreserveを使いAみたいな事をしていました。 しかしBのようにコンテナを使わない限り、今までの所、特に困ったこともありませんでした。 全て書き直す前にお尋ねしたいのですが、Aが上手くいっていたのは偶然なのでしょうか?
reserveってのはresize時の効率を上げるためにあらかじめ領域を予約するものであって、実際にresizeするまではその領域を使っては*いけない*。 領域自体は確保済みなので一般保護例外などはでないだろうが、vector内部の管理情報は壊れていても不思議ではない。
>>955 ありがとうございます。コンテナ以外もたまたま動いていただけなんですね。
全力で全痴漢してきます。
メンバのoperator==はメンバ関数ポインタに入れられないのですか?
↑ std::vector<boost::shared_ptr<Foo> >::iterator i = std::find_if( hoge.begin(), hoge.end(),boost::bind( &Foo::operator==, _1, foo ) ); としたいのです
std::equal_to
960 :
デフォルトの名無しさん :04/11/26 20:18:59
>>958 問題なさそうに見えるが、Foo か operator== のどちらかがテンプレート引数を必要としたりオーバーロードで曖昧になってたりしないか?
>953 やっぱりそうなんですかねぇ. >958 それだとshared_ptr<Foo>のoperator==を呼ぼうとしますよ. indirect_iterator使って vector<shared_ptr<Foo> >::iterator i = find_if(make_indirect_iterator(hoge.begin()), make_indirect_iterator(hoge.end()), bind(&foo::operator==, _1, foo3) ).base(); とか,lambda使って vector<shared_ptr<foo> >::iterator i = find_if(hoge.begin(), hoge.end(), bind(&foo::operator==, *_1, foo3)); とか(このbindはlambdaのbind).というか普通にfindで良いんじゃ・・・.
>>959 それだとshared_ptrの==が使われてしまい意図したものではありません。
>>960 おっしゃるとおりでコンパイラは”関数の引数があいまいなためテンプレート引数を減少できません。”といっていました。
Fooのoperator==をFooだけでなくstd::stringでも比較できるようにしていました。
オーバーロードしないようにすればコンパイルできましたが、引数からoperator==を選択してくれないのでしょうか?
bind<・・・>に型を指定してやれば解決するかと思いましたが私にはむりでした。
今はとりあえずforループを回しております。
>>961 ええと、しょうしょう混乱しておりますが。
>それだとshared_ptr<Foo>のoperator==を呼ぼうとしますよ.
というのは
>>959 さん宛てですかね?
ちがったりして。
ndirect_iteratorは知りませんでした。調べてみます。
>962 オーバーロードされた関数へのポインタを取る場合, ポインタを取った瞬間にどのオーバーロードへのポインタなのかを 指定してやる必要があります.そのまま汎用関数の引数にすることは出来ません. 典型的にはキャストを使うか static_cast<bool (Foo::*)(Foo const &) const>(&Foo::operator==) 一旦メンバポインタ変数に代入してから使います. bool (Foo::*pmf)(Foo const &) const = &Foo::operator== 上のシグネチャはただの例なので実際のoperator==のシグネチャに読み替えて下さい. ・・・っていうか,lambdaが一番楽だと思いますよ. vector<shared_ptr<foo> >::iterator i = find_if(hoge.begin(), hoge.end(), *_1 == foo);
>963 おっと,ごめんなさい.961はboost::lambda::bindの話です.忘れてください. #shared_ptrに対する挙動がboost::bindとboost::lambda::bindで違う・・・.
C++関連のスレが乱立して
閑散としているスレが増えて来ましたので
再編を提案します
http://pc5.2ch.net/test/read.cgi/tech/1101384692/ 現状でC++関連は
【C++】template 統合スレ
【C++】STL(Standard Template Library)相談室
BOOSTを語れゴラァ
C++相談室 part37
とありますがこれらは
標準C++相談室【STL含む】
C++テンプレート相談室【Boost/Loki】
の2本に統合でいいように思います
どうでしょうか? 異論がなければ
ここの次スレの名前は標準C++相談室【STL含む】
でいきましょう
>>966 STLとかBoostとか関係なく、
ベストな方法を知りたい、みたいな質問をしたい時はどこ?
>>964 ありごとうございます。
boost以前の問題でしたね。もっと勉強します。
lambdaはうちのコンパイラが使うな(えない)というもので。。。
>>967 そういのはここ(と後継のスレ)でいいのではないでしょうか?
話長くなりそうだったら専門スレに誘導してそこで続けていただくといいと思います
>>966 名前は短い方がいい
余計なものくっつけるな
>>967 ここで聞くと解決するまえにスレ終りそうだから、
新スレ立ててそこで質問しちくり。
エキスパートが回答してくれれば どこに質問したっていいって気分。
>968 >lambdaはうちのコンパイラが使うな(えない)というもので。。。 相手の環境を考慮してなかったです.本当に申し訳ない.
975 :
デフォルトの名無しさん :04/11/26 21:47:17
>>966 ISO/IEC14882で定義される範囲は「C++」でしかねえよな
STLだのtemplateだのと断片だけのスレは重複もいいとこ
つーと、残れるのはboostくらいか
977 :
デフォルトの名無しさん :04/11/26 21:57:51
あ"ー
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
>>978 #include "stdafx.h"
みたいにプリコンパイル済みヘッダーをインクルードするか、
ファイルの設定でプリコンパイル済みヘッダーを使わないように設定する。
こっちにテンプレ貼ってどうする
ここは人工無能のいるスレでつか?
983 :
デフォルトの名無しさん :04/11/26 22:46:12
人工無能ってなに?
984 :
デフォルトの名無しさん :04/11/26 22:46:27
スレってなに?
985 :
デフォルトの名無しさん :04/11/26 22:46:42
でつかってなに?
ここってなに?
Ruby!!!!!!!!!!!!!!!!!!!!!!
988 :
デフォルトの名無しさん :04/11/26 22:57:38
Rubyつかうと一気に○○○が10倍に?! ↑○○○を埋めて。
リスク
さて、お取り込み中の所大変申し訳ありませんが、カウントダウンの時間です。
9
992 :
デフォルトの名無しさん :04/11/26 23:00:35
除夜の鐘みたいだ。
993 :
デフォルトの名無しさん :04/11/26 23:00:45
996 :
デフォルトの名無しさん :04/11/26 23:04:23
997 :
デフォルトの名無しさん :04/11/26 23:05:20
10000000!!!!!!!!!!
1000(σ´Д`)σゲッツ!!
一億
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。