07/10/04 01:12:29
>>103
enable_if 使う初心者w
238:デフォルトの名無しさん
07/10/04 10:11:51
そんなこと言われても、mplなんて使いこなせないんで…
239:デフォルトの名無しさん
07/10/04 10:42:45
stdのcoutやcinはヘッダを見るとextern宣言されてますが、定義はどこで行われているんでしょうか?
240:デフォルトの名無しさん
07/10/04 11:02:01
>>239
標準ライブラリのソース内でしょう。
241:デフォルトの名無しさん
07/10/04 11:11:59
C++はヘッダファイルではなくヘッダをインクルードしますが
ヘッダファイルとヘッダの違いって何ですか?
ヘッダの中でヘッダファイルがインクルードされてる?
242:デフォルトの名無しさん
07/10/04 11:18:39
>>241
ほとんどのコンパイラの実装ではヘッダといえばそれに対応するファイルが
用意されているので、ほとんど同義。ただしコンパイラは <stdio.h> というヘッダを
ファイルとして実装する必要はなく、規定された動作さえすればいい。これは
C でも C++ でも同じ。
で、一般的にヘッダファイルといえばヘッダのように動作するユーザー作成の
ファイルも含む。
243:デフォルトの名無しさん
07/10/04 11:34:30
>>242 ものすげえわかり易くてワロスw
244:デフォルトの名無しさん
07/10/04 12:10:53
<iostream>ってヘッダファイルぢゃないの?
245:デフォルトの名無しさん
07/10/04 12:13:19
>>244
C++ の標準ヘッダではあるけど、ファイルであるかどうかはコンパイラの実装しだい。
246:デフォルトの名無しさん
07/10/04 12:17:38
>>242
なるほど。ということはユーザー定義のヘッダファイルを
#include "hoge.h" とした場合でも、規格上はhoge.hの実装
がファイルでなくてもよいということですか?
247:デフォルトの名無しさん
07/10/04 12:19:34
>>245
例えばファイルではないヘッダを使っているシステムってあるのですか?
LinuxとかWindowsのコンパイラの場合、OSがファイルシステムを持っているから
事実上はファイルとして実装されてるということになるのですかね?
248:デフォルトの名無しさん
07/10/04 12:20:31
>>246
いいんじゃねーの。
実際プリコンパイルドヘッダが用いられるときなんかはhoge.h以外の
とこから情報取ってきてるわけだし
249:デフォルトの名無しさん
07/10/04 12:23:16
privateな仮想関数って意味ありますか?
派生クラスで上書きしても呼び出せないのに。
250:デフォルトの名無しさん
07/10/04 12:25:05
>>248
プリコンパイルドヘッダというのはコンパイル済みヘッダということだと
思うので、バイナリファイルを覗きに行くのですかね?
251:デフォルトの名無しさん
07/10/04 12:25:12
delphiのinterface節/impliments節ってよくできてると思う
252:デフォルトの名無しさん
07/10/04 12:27:47
>>249
Non virtual interface と呼ばれる手法で使われる。
似たような話でデザインパターンの Template method とか。
253:デフォルトの名無しさん
07/10/04 12:32:52
>>250
ただのファイルにするかDBにするかインターネットからとってくるかは、
コンパイラ作成者の自由なんじゃないの?規格も神も制限してないんだから。
そんなの俺に聞いてどう答えて欲しいの?
254:デフォルトの名無しさん
07/10/04 12:39:36
>>249
派生クラスから呼び出せなくても、基本クラスから上書きバージョンを呼び出すことは出来る。
255:デフォルトの名無しさん
07/10/04 15:37:19
>>252
>>254
class B
{
public:
void mf(){ privmf(); }
private:
virtual void privmf();
};
class D : public B
{
private:
void privmf();
}
int main()
{
D objd;
objd.mf();
return 0;
}
このプログラムでobjd.mf() 内で呼び出される関数がB::privmf()ではなく、
D::privmf()になるのですがなぜですか?
ポインタか参照に対して呼び出されたときにポリモルフィズム機構
が働くと思うのですが。
void mf(){ privmf(); }はvoid mf(){ this->privmf(); }と同じことですが、
このthisポインタが指している実際のオブジェクトの型がクラスDの
場合(上のプログラムの場合)はD::privmf()が呼ばれるということで
しょうか?
256:デフォルトの名無しさん
07/10/04 15:59:23
そのとおり
257:デフォルトの名無しさん
07/10/04 16:11:28
>>256
ポインタthisに対する多態性ということですか。
objd.mf() を実質 mf(&objd)と考えて this と &objd
が等しいものを表すため、クラスDの仮想関数
テーブルが参照され、そこに登録されている
D::privmf()が呼ばれるということで納得できました。
258:BOLT
07/10/04 18:19:42
自分、C++の初心者です。以後お世話になると思いますがよろしくお願いします。
URLリンク(ccplus.blog121.fc2.com)ちなみにプログラミング系のブログやってます。
よろしければ見に来てください。
259:デフォルトの名無しさん
07/10/04 18:22:29
クソショボイブログだなw
誰も見ないしとっとと閉鎖しろよ
260:デフォルトの名無しさん
07/10/04 18:42:04
誰も見てくれないからこそ続けるんだ
最低1年くらいは毎週更新できるように努力しる
261:デフォルトの名無しさん
07/10/04 19:31:14
C++が全角なのが気にくわない
262:デフォルトの名無しさん
07/10/04 19:58:05
「全角ってなんですか?」
「"いわゆる全角"のことではないでしょうか」
263:デフォルトの名無しさん
07/10/04 20:40:46
いいえ、焼き肉屋のことです。
264:デフォルトの名無しさん
07/10/04 20:56:58
おまえら向上心のある奴はやさしくしてやれよ
265:デフォルトの名無しさん
07/10/04 21:34:20
どこぞのかわいがりよりはずっとやさしい。
266:デフォルトの名無しさん
07/10/04 22:32:21
可愛がってやらないと強くならないぞ!
267:デフォルトの名無しさん
07/10/04 22:37:51
C++でCSVからデータを読み込もうとしています。
普通は1文字ずつ変数に入れていくと思うのですが、
プログラム側で #define FILENAME "a.txt" と定義しておき、
CSVに記述された FILENAME を "a.txt" として読むことはできるのでしょうか。
よろしければお力添えをお願いいたします。
268:デフォルトの名無しさん
07/10/04 22:45:46
"FILENAME"があったら適当に置換でもしとけばいいじゃん
269:267
07/10/04 23:04:23
返信ありがとうございます。説明が不足していました。
defineが他にも多数あり、今後外部ファイルに定義を移して
defineの名前も変更できるようにするため、いい方法がないかと思っています。
FILENAME 1個だけなら置換で問題ないですね。
270:デフォルトの名無しさん
07/10/04 23:06:54
CreateProcessでWindows Services for UNIXのunzipコマンドを使うのは可能ですか?
271:デフォルトの名無しさん
07/10/04 23:07:08
>>269
よくわからんけど、私的なツールなら cppでプリプロセスすればいいんじゃない?
272:デフォルトの名無しさん
07/10/04 23:19:35
>>270
createprocess 外部コマンド
で検索するぐらいしてから来れば?
273:267
07/10/04 23:28:39
>>271
すみません、cppでプリプロセスの理解ができませんでした。
私的ではなく会社で使います。今日はこれ以上つなげないので調べてからまた来ます。
274:デフォルトの名無しさん
07/10/04 23:29:59
クラスのメンバ変数に参照型を追加した場合の初期化の
方法はこれが正しい書き方でしょうか?
class Hoge{
private:
int &Test;
public:
Hoge(int &T):Test(T){}
~Hoge(){}
}
275:デフォルトの名無しさん
07/10/04 23:32:00
いえす
一番最後にセミコロン無いけど
276:デフォルトの名無しさん
07/10/04 23:35:30
>>267
その程度のこと会社で聞けよ
きみの会社の客はかわいそうだな
277:275
07/10/04 23:38:58
>>275
どうも。
参考書にもググっても全く見つからなかったので不安が解消できました。
278:274
07/10/04 23:39:49
>>277 は名前ミス。失礼。
279:デフォルトの名無しさん
07/10/05 07:21:23
質問です。
pure virtual な関数て、基底クラスで
class ClassA
{
public:
virtual void Test(void) = 0;
};
こんな感じに定義するのは普通なのですが、さっき間違って
class ClassA
{
public:
virtual void Test(void) = 0
{
}
};
と、中身を定義したら、コンパイルが通りました。気になったので、派生させてみて、
派生先の Test 関数で、ClassA::Test を呼んだら、呼べました。
pure virtual な関数は、実体を作れないと思いこんでいたのですが、それは間違いなのでしょうか?
vc++8.0 sp1
xp sp2
280:デフォルトの名無しさん
07/10/05 07:49:32
>>279
それは間違いです。
でもその書き方ってできないんじゃなかったっけ。
class ClassA{
public: virtual void Test(void) = 0;
};
void ClassA::Test(void) { }
って書く必要があったような・・・
記憶違いかね。
281:デフォルトの名無しさん
07/10/05 12:29:52
>>280
VC++はそういう書き方ができるんじゃなかったか。
pure virtualなデストラクタの定義を書くのを楽にするための、MSの配慮というか
お節介だったと思うが。
282:デフォルトの名無しさん
07/10/05 21:29:19
まあ勘違いしやすい所だよな
×pure virtual な関数は、実体を作れない
○pure virtual な関数を持つクラスは、実体を作れない
283:デフォルトの名無しさん
07/10/05 22:32:31
printf 系で "%10s" と指定している箇所が全て 12 に変更されることになって
数値を定数化してフォーマットに埋め込めないものかと思っているんですが、
#define した定数がそのまま表示されたりと期待した動作が得られません。
どなたか知恵を貸して頂けませんか。
(そもそも文字列終端を付けられたらこんな苦労もなかったんですけど・・・)
284:デフォルトの名無しさん
07/10/05 22:35:09
#define FMT "%12s"
printf(FMT,"hogehoge");
じゃダメなの?
285:デフォルトの名無しさん
07/10/05 22:39:10
こんな書き方も出来るかもー!!
printf("%*s", 10, "hogehoge");
printf("%*s", 12, "hogehoge");
286:デフォルトの名無しさん
07/10/05 22:40:16
#define FMT "12"
printf("%" FMT "s", "hogehoge");
とか
287:デフォルトの名無しさん
07/10/05 22:47:38
std::mapでキーワードを予め指定しておいた予約語以外は受け付けないように出来ますか?
"hoge""hage""hoji""haji" // 何らかの方法で指定した予約語
std::map<std::string , std::string> strmap
strmap["hoge"] = "これは成功する";
strmap["miss"] = "これは失敗する";
こんな感じで
288:デフォルトの名無しさん
07/10/05 22:49:15
C++で下みたいな方法ってよろしくないですかね・・・
配列に入れた座標データを,オペレータオーバーライドを使って計算したいんですが
要素毎にコンストラクタ呼び出しは冗長になるので
問題点が判らないので指摘をお願いします
#include <stdio.h>
float data[] = {1., 2., 3., 4., 5., 6.};
class Data
{
public: // use default ctor
float x, y, z;
Data& operator+=(const Data &right)
....省略...
};
int
main()
{
Data *ptr;
ptr = reinterpret_cast<Data*>(data);
printf("%f %f %f\n", ptr[0].x, ptr[0].y, ptr[0].z);
printf("%f %f %f\n", ptr[1].x, ptr[1].y, ptr[1].z);
return 0;
}
289:デフォルトの名無しさん
07/10/05 22:53:53
>>287
勝手に追加されちゃうから無理じゃね?
std::mapを包含したクラス作ってインデクサの中で例外投げるとかしか思いつかない
290:デフォルトの名無しさん
07/10/05 23:00:43
>>289
stringの方をラッピングするのもアリじゃね?
書く量としてはその方が少なくなりそう。
291:デフォルトの名無しさん
07/10/05 23:00:58
>>289
そうですか、残念
ありがとうございました
292:デフォルトの名無しさん
07/10/05 23:15:10
>>288
>コンストラクタ呼び出しは冗長
といってもinlineであれば実質気にするほど変わらない気がする。
Dataがfloatピッタリ3つ分で収まるという保証があるのだろうか?データメンバーが後から追加されたりする可能性は?
virtualな関数をもつとサイズが変わったりする様だし、危険を伴う気がします。
293:デフォルトの名無しさん
07/10/05 23:36:17
assert(sizeof(Data) == sizeof(float[3])); を書いとくとか
294:デフォルトの名無しさん
07/10/05 23:43:21
>>292,293
Thx
対象がRAWなベタデータなので簡素に出来ないかと思ったのですが
素直な書き方をした方がよさげですね
295:デフォルトの名無しさん
07/10/06 03:46:16
>>284-286
フォーマットって普通に文字列なんだな。
>>285の方法は知らなかった。参考にさせて貰います。
色々試してみたけど、やりたいこともこれで出来そう。 ありがとね。
296:デフォルトの名無しさん
07/10/06 03:51:51
>>288
× オーバーライド
○ オーバーロード
297:デフォルトの名無しさん
07/10/06 16:19:13
wcout はバグがありますか?
wcout を使うのは避けてますか?
WindowsXP Home + BCC
298:デフォルトの名無しさん
07/10/06 17:10:25
char *hogehoge(){
return "hogehoge";
}
文字列リテラルの場合、変数と違って関数を抜けても有効なままなんでしょうか?
299:デフォルトの名無しさん
07/10/06 17:11:10
有効なままです
300:デフォルトの名無しさん
07/10/06 17:11:56
リテラル返すならconst char*にした方がいいかも
301:デフォルトの名無しさん
07/10/06 18:41:45
inline const char *&
302:デフォルトの名無しさん
07/10/06 18:45:41
&はイラネーだろ
なんか違うのか?
303:デフォルトの名無しさん
07/10/06 18:47:11
inline const const char *&
304:デフォルトの名無しさん
07/10/06 18:52:50
C++超初心者です。
今まで動いていたのに、今日コンパイルすると、
(1029) invalid format string conversion
と表示されてしまいます。
原因が分からず、どのように変えたらよいのかも分かりません。
ご教授宜しくお願いいたします。
すごく長いプログラムなので、関係してそうなところだけ書き込んでます。
FILE *ottq;
ottq = fopen("ottq.dat", "w");
double chir,l
l=20.05e-3;
chir=0.0e-5;
fprintf(ottq, "l(m)=\t%le\t\n",l);
fprintf(ottq, "chir(%)=\t%le\t\n",chir*100.0); ←1029行目ここです。
fclose(ottq);
305:デフォルトの名無しさん
07/10/06 18:54:02
%→%%
306:デフォルトの名無しさん
07/10/06 18:54:48
>>304
エラーメッセージのまんまだろ。
307:デフォルトの名無しさん
07/10/06 19:02:37
こえぇ
お前みたいなのが扱うもんじゃねぇだろ
308:デフォルトの名無しさん
07/10/06 19:09:25
変数名きめぇwwwww