[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/29 13:41 / Filesize : 252 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.47【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 15:14:51 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.46【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1198755167/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

445 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:39:02 ]
場合によっては取得できるんだが・・・
そういう事はむやみに教えると悪い影響与えそうで困る。

446 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:40:03 ]
std::vectorってなんですか?習ってないです。

447 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:40:19 ]
増やした分を保持しておけばよいが、vectorは勝手に保持するからプログラムが簡単になる

448 名前:439 mailto:sage [2008/01/24(木) 23:40:37 ]
みんなThx!ふと気になってレス見ないで書いちゃった、スマソ。。

449 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:42:03 ]
#include <vector>
using namespace std;

main(){
vector < int > a(100);
a[0]=1; a[1]=2;
}

450 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:43:36 ]
main.cpp:4: error: ISO C++ forbids declaration of ‘main’ with no type
main.cpp:4: error: ISO C++ forbids declaration of ‘main’ with no type
lipo: can't figure out the architecture type of: /var/tmp//ccLa7Foj.out
make: *** [debug/main.o] Error 1

451 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:48:58 ]
今年のカレンダー表示ってどうやるんですか?

452 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:52:00 ]
作って表示すれば?

453 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:58:43 ]
エンディアンの勉強をしてまして、色々ググってみると、例えばリトルエンディアンの場合、
0x1234abcd の値をメモリーに格納する際、下位アドレスから順に、cd ab 34 12 と入りますが、
ここで疑問なのが、1バイトの中身のビット列はどのように扱われているのか?という点です。
1バイト8bit分のデータは、エンディアンにかかわらず常に、例えば 0x12 は、00010010 のビット列
が保たれているのでしょうか?




454 名前:405 [2008/01/25(金) 00:03:17 ]
405ですが
筆算の問題、
>>421 
みたいに全部かけた後にまとめて足すってできるんですか?

それとも2桁ずつ掛け算して足してかないとむり?
例えば123*123だったら
123*3=369
123*2=246
  →369+2460=2829
123*1=123
    →2829+12300=15129

455 名前:デフォルトの名無しさん [2008/01/25(金) 00:07:35 ]
>>454
421のやりかたでできるだろ
下のだとめんどくさくないか?

よくわからんのだが

456 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:21:15 ]
>>453
エンディアンは多バイトデータの配置の種類
1バイトは関係ない(同じ内容になる)

457 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:29:57 ]
>>453
1バイトがどのように格納されていようが、
どうせ1バイト単位でしかメモリアクセスできないのだから、
違いは観測できないだろ。

458 名前:457 mailto:sage [2008/01/25(金) 00:34:10 ]
そういえば、ビットアクセス命令のあるCPUもあるか・・・

459 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:40:27 ]
1byteが12bitの環境もあるわけで

460 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:41:05 ]
環境がBCCDeveloperというものです。
hoge.txtという名前のテキストファイルを作るプログラムで
同じフォルダの中にすでにhoge.txtという名前のテキストファイルがあったら
もともとあったテキストファイルの名前をhoge1.txtとして変えて新しく作るテキストファイルを
hoge.txtとすることはできるでしょうか。
できる場合はどうしたらいいでしょうか。

461 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:45:23 ]
>>460
hoge.txtがあるかどうかを調べる
あったらファイル名を変更する
hoge.txtを作る

System("if exist ren hoge.txt hoge1.txt");っていけるのかな?

462 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:51:48 ]
>>461
すばやい回答ありがとうございました。
早速とりかかってみたいと思います。

463 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:54:52 ]
>>454
とりあえず10桁で作ってやったぞ。わからんとこあったら聞いてくれ。
#define N 10
int main( void )
{
int a[ N ] = {0,1,2,3,4,5,6,7,8,9};// 9876543210
int b[ N ] = {0,1,2,3,4,5,6,7,8,9};// 9876543210
int result[ N * 2 ] = { 0 }; // 9876543210*9876543210=97546105778997104100
for ( int i = 0; i < N; i++ ) {
for ( int j = 0; j < N; j++ ) {
result[ i + j ] += ( a[ i ] * b[ j ] );
for ( int k = i + j; k < N * 2 - 1; k++ ) {
if ( result[ k ] < 10 ) break;
result[ k + 1 ] += result[ k ] / 10;
result[ k ] %= 10;

}
}
}
for ( int i = N * 2 - 1; i >= 0; i-- ) {
printf( "%d", result[ i ] );
}
return 0;
}



464 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:30:19 ]
こんなかんじか

#define kosu 4

add(unsigned int *a, unsigned int *b, unsigned int *c){
int ketaagari=0;
for(int n=0; n<kosu; n++){
c[n]=a[n]+b[n]+ketaagari;
ketaagari=a[n]>UINT_MAX-b[n];
}}

seki(unsigned int *a, unsigned int *b, unsigned int *c){

}

465 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:34:37 ]
50桁までカウントさせるのが面倒で積は諦めた

466 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:44:04 ]
500メガ程度の複数のテキスト文書があるとします
これから単語の頻度を求めたいとします どのようにしたらいいでしょうか?
単語は最低4バイトのものを言います
配列でカウントできないし良い方法ありますか

467 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:46:06 ]
3バイトの頻度なら、int

468 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:49:00 ]
>>466
最低4バイトということは200Kバイトの単語がある可能性も考慮しないとだめですか?w

469 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:56:06 ]
>>468
厳密に求めなくて良いです 高頻度の単語が抽出出来ればいいです 1単語しかなければもとめなくていいです

470 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 05:01:15 ]
一回目で24bit列を配列でカウントして、
2回目でたとえば100回以上出現したものの後ろ10バイトずつファイルに切り出して
そのファイルごとにしらべればいいか

471 名前:デフォルトの名無しさん [2008/01/25(金) 07:23:25 ]
>>420
ありがとうございます。なので、
0.55, 1.55, 8.55 =>切り上げなので、上記現象なし
2.55 〜 7.55 =>切り下げなので、上記現象あり
なのですね。

ところで、上記質問をしてから色々調べたのですが、浮動小数点(例えばC言語のdouble)の
仮数部の丸めについて、丁度中間の場合は偶数になるように丸める、というルールが
あるらしいのですが、これは小数点の場合にどういう風に当てはまるのかわかりません。
これって二進数だと全部あてはまってしまうような気が、、、
どうなっているのでせうか


472 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 07:36:58 ]
>なのですね。
いいえ。

473 名前:デフォルトの名無しさん [2008/01/25(金) 11:27:52 ]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fileread(int,char * []);
int main(int argc ,char *argv[])
{ if(argc!=3){printf("次回から引数を入力してください\n");
return 0; }
if(!strcmp(argv[2],"r")){ fileread(argc,argv);
}
return 0;}
void fileread(int argc,char *argv[]){
FILE *fp;
char *buffer,*str,*n,*s;
fpos_t start_fpos;
int filesize,count=0;
fp=fopen(argv[1],"r");
fgetpos(fp,&start_fpos);
fseek(fp,0,SEEK_END);
filesize=ftell(fp);
fsetpos(fp,&start_fpos);
buffer=(char *)malloc(sizeof(char)*filesize);
str=(char *)malloc(sizeof(char)*1000);
printf("検索する文字列を入力してください\n");
scanf("%s",str);
while(s=fgets(buffer,filesize,fp)){
count++;
n=strstr(buffer,str);
if(n){printf("%d行目 %s",count,s) };
}
free(buffer);
fclose(fp);
}



474 名前:473 [2008/01/25(金) 11:30:38 ]
>473
csvファイル検索プログラムを作ったのですが、ファイル名にワイルドカードが使えないので
実用性にかけます。上記のプログラムにワイルドカードの組み込むにはどうすればいいでしょうか?
ただし、ファイル名はmain関数の引数で取得いたします。_findfirst,_findnextを使うところまでは
なんとなく理解しました。

475 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 11:34:25 ]
>>474
環境は?
場合によっては wildargs とか使える場合もある

476 名前:473 [2008/01/25(金) 11:41:30 ]
OSはCENTOS 5です。コンパイラにはgccを使っております。

477 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 11:56:10 ]
ワイルドカードはどんなのを?
そのままだとシェルが勝手に展開しない?

478 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 11:57:55 ]
>>473
またお前か。あちこちおかしなプログラムなのは相変わらずだな。
最低でも、バッファオーバフローの可能性は排除しておけよ。

479 名前:473 [2008/01/25(金) 12:20:12 ]
>>477
*.csvとかですね。
そのままでは無理でした。

>>478
その件については、なんか知らんけどプログラムができあがりました。
あらかじめ指定されている仕様でしか作ったらいけないことになっておりまして、
どのようにすればそのようにできあがるのか悩まされている次第です。
一応さきほどのプログラムは作りましたが、io.hは無いそうで、_findnextも使えないですね。
こういうときそのヘッダファイルをダウンロードしてヘッダファイルがたくさんあるところに放りこめばいけますか

480 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 12:37:23 ]
ヘッダだけ持ってきたって実装したライブラリが無きゃ無理だろ。
通常は、シェルが展開するんだが、、、opendir、readdir使って
正規表現で検索するとかしてみては

481 名前:473 [2008/01/25(金) 12:49:24 ]
>>480
ありがとうございます。
階層を一段間違えておりました。
普通に通りますね。よかった・・・

482 名前:デフォルトの名無しさん [2008/01/25(金) 13:31:29 ]
>>472
int main() {
double d = 3.55; // ここの数字を変更する
int n = d * 100;
cout << n << endl;
return 0;
}
でも上記プログラムでは、浮動小数点の規格上、

d = 0.55, 1.55, 8.55 =>それぞれ0.5500000....1, 1.55000...1, 8.55000...1
とかになるので、100倍しても減ったように見えたりしない。
d = 2.55, 3.55, 4.55, 5.55, 6.55, 7.55 =>それぞれ2.5499999...などとなるので、
100倍すると、(double)254.99999==>(int)254などとなってしまう。

と理解していたのですが、他の方も書いてくれてたように、Visual C++ 2008でやると
d=3.55の時、355と表示されました。(gccは354)





483 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 17:29:42 ]
VC++がx86の80ビット浮動小数点数レジスタを使い回すからかと思ったけど、
一旦64ビットでメモリに書きだすように仕向けてもやっぱり355になるな。



484 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 18:42:42 ]
関数に配列へのポインタへ渡してデータょ書いてもらう場合
std::vector buffer(1024);
hogefunc(&buffer[0]);
とかくのは違法ですか?

485 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 18:47:47 ]
確保したバッファサイズをはみ出さないのなら問題ない

486 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 19:08:51 ]
private:な物の位置調べて無理やり書き込むわけだが。

487 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 19:19:56 ]
そういうことができるように、
vectorは生の配列同様、要素の連続性が保証されている。

488 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 19:41:51 ]
ぬるぽ渡せば書かずに文字数返すくらいしてくれてもいいよな。
これみたいに。
ttp://msdn2.microsoft.com/ja-jp/library/k1f9b8cy(VS.80).aspx

489 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:07:37 ]
>>488
Win32APIスレの誤爆か?

490 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:51:13 ]
inline int nazo(void)
{
 return __LINE__;
}

呼び出すと戻ってくるのはどこのあれですか?

491 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:52:04 ]
そこ

492 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:59:02 ]
たぶん3

493 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:01:39 ]
__LINE__やら__FILE__やら__func__はコンパイル時に埋め込まれる



494 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:02:18 ]
__func__ マクロじゃなくて定数だったはず。

495 名前:デフォルトの名無しさん [2008/01/25(金) 21:09:16 ]
ik88
ectuo\
}{([8
]\@p :
dcdc
dcdcdcfvfv7qa11111111111111111111111111111111
mnbcadcfvghujk,ol9iikurf4ed333333333333333331W2E3TR4G56







496 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:38:01 ]
きーけぼーどのいちばんうきえらをうつと

12w3e4rgt5h6789o0:^\
!"#$G%H&'()~*=~|

とにゅうりょくされます。
こしょうですか?

497 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:41:14 ]
pepper

498 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:55:26 ]
スキンラインの短絡

499 名前:デフォルトの名無しさん [2008/01/26(土) 03:17:03 ]
APIについての質問です。
Visual C++ Express 2008で英単語印刷ソフトを作っているのですが、
ウインドウに、ネットの検索欄のような入力欄を作ることは可能でしょうか?
それを使って単語の検索機能などを追加したいのですが・・・。
もしよろしければ教授ください。

500 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 03:55:07 ]
VCスレかAPIスレ池。

501 名前:デフォルトの名無しさん [2008/01/26(土) 09:28:53 ]
>>482
gccでも、-msse2オプションをつけてコンパイルすると、355を返すバイナリを作れました。
でも、80ビットでも、52ビットでも、切り捨てになるから、どちらでも同じと思うんですが。
なんでだろう。

502 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 11:06:09 ]
>>501
>482のコードだけなら、最適化で定数は事前(≒コンパイル時)計算されるから不思議ではない。

503 名前:デフォルトの名無しさん [2008/01/26(土) 20:29:17 ]
>>502
以下のコードでも、dに3.55を入力すると、表示は354になりますが、
-msse2でコンパイルすると355になりました。

int main(int ac, char **av)
{
double d;
cin >> d;
int n = d * 100;
cout << n << endl;
return 0;
}




504 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:23:27 ]
確認のために聞きたいんです
関数テンプレートについてなんですが。

template<typename T>
void func(){
 hoge = new T();
}
func<HogeClass>();

つう書き方に、何か問題はありますか?
一応BCCでは動いてるようなんですが、
検索しても基本的に引数のために使われていて、
こういう書き方を見つけられなかったので不安なんですが。

505 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:31:16 ]
>>504
全然問題ない。それができないならテンプレートの魅力が半減ですよ。

506 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:48:00 ]
>>505
どうもです。こういう使い方はやっぱり便利なんですね。
でも、混乱もしそう。使いこなせるよう精進します。

507 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:59:43 ]
>>503
手元のgccだとそのコードでも355になるよ。354になるときの値をprintf("%.20g", d * 100)で出してみて。

508 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 03:55:57 ]
C++ で、perl の Data::Dumper みたいなことするのがあれば
教えてください。

509 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:19:52 ]
テキストファイルをchar型に読み込んだ場合って改行があったら\nもちゃんと格納されるの?

510 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:20:23 ]
読み込みかたによる。

511 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:34:30 ]
ありがとう。読み方によるのね
できれば\nが格納される読み方の例教えていただきたい

512 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:35:07 ]
fgets

513 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:38:01 ]
ファイルの開き方も重要じゃないか



514 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:42:08 ]
>>512
ありがとうございます。
fgetsって\nの手前までしか格納されないかと思ってたけど\nもちゃんと入るんですね
とりあえず色々試してみることにします

515 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:44:40 ]
gets以外なら大体¥nもコピーする。fgets、fgetln、テキスト指向ですらないfreadも勿論。というかgetsは絶対使わない方が良い。
C++は…誰かお願い。

516 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 07:26:38 ]
C++でWindowsでのDLL作成に関して質問です。
C++のクラスをエクスポートする場合、純粋仮想クラスを利用するようですが、この際、
多重継承は可能なのでしょうか。具体的には以下のようなことをしたいのです。
class IFoo{
public:
virtual void fooFunc() = 0;
};

class IBar: public IFoo{
public:
virtual void barFunc() = 0;
}

class CFooFunc{
public:
virtual void fooFunc(){ /*...*/ }
};

class CBarFunc{
public:
virtual void barFunc(){ /*...*/ }
};

class CExport: public IBar, CFooFunc, CBarFunc{
};

__declspec(dllexport) IBar* createIBar(){
return new CExport();
}
__declspec(dllexport) IBar* deleteIBar( IBar* p ){
delete p;
}

517 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:21:25 ]
>>511
istream& istream::get(char& c)
istreambuf_iterator
unsetf ios::skipws and istream_iterator

518 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:55:57 ]
>>516
DLL でクラスを公開したいなら COM

519 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 12:57:31 ]
COM なんて使いにくいもんじゃなくて
__declspec(dllexport) と __declspec(dllimport) を使おうぜ。
DLL と EXE で自動的に切り替えるマクロもあったけど忘れた。

520 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 14:30:07 ]
C++の初心者向けサイトを教えてください


521 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 14:33:05 ]
#ifdef PROJECTNAME_EXPORTS
# define DLL_EXPORT __declspec(dllexport)
#else
# define DLL_EXPORT __declspec(dllimport)
#endif

522 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 15:45:56 ]
そういうやつ、自分で作らなくてもあったと思うけど、
自分で作った方が細かい制御ができていいかもしれん。

523 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 17:48:38 ]
dllexportは所詮同じヴァージョンのコンパイラ相手でしか使えないからね。



524 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:11:43 ]
しかし、COM は COM で色々と不便だからなあ・・・。
IA ← A の機能強化版として IB と B を別途作るとして、

 IA
↑ ↑
IB A
↑ ↑
 B

こういう継承したいけど無理っしょ?
仮想継承がないから・・・。

525 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:27:47 ]
ATLみたいに実装をテンプレートに分離すれば解決しない?

526 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:15:08 ]
wchar_t(unsigned char) に入ったUTF16の日本語を
ShiftJISに変換してxharに突っ込む処理を
STLだけで書くにはどう書けばいいですか?

527 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:26:27 ]
std::codecvt使う例が
hw001.gate01.com/eggplant/tcf/cpp/strcnv.hpp
にあるけど、UTF16、ShiftJISと指定した
std::codecvtをどう取得するのかは知らない

528 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:48:39 ]
>>525
テンプレートは解決策の1つだとは思うけど、
ヘッダファイルに実装するのはどうもね・・・。
コードいじったときのコンパイル範囲が広くなると困るし。

529 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:07:40 ]
OSに頼ったほうが安全

530 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:09:31 ]
>>524
そのIAをIUnknown、Aを適当なインタフェースに置き換えれば、そんな例は山ほどある。

Aの実装をソースコードの形で手に入れられるなら、
普通にIBとAを多重継承して、細かいところを整えればいける。

531 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:28:36 ]
>>530
むむっ。詳しくお願いします。

532 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:31:57 ]
>>530
要は、本来Bでオーバーライドする必要のない関数も、B内から手動でAの実装を呼ぶようにすればいい。
インタフェースはメンバ変数ないから、キャスト関係くらいしか仮想継承の有無の違いはないといっても過言ではない。
struct IA : IUnknown {virtual HRESULT STDMETHODCALLTYPE FnA() = 0;};
struct A : IA {
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(IID&, void**) {/*実装*/}
    virtual ULONG STDMETHODCALLTYPE AddRef() {/*実装*/}
    virtual ULONG STDMETHODCALLTYPE Release() {/*実装*/}
    virtual HRESULT STDMETHODCALLTYPE FnA() {/*実装*/}
};
struct IB : IA {virtual HRESULT STDMETHODCALLTYPE FnB() = 0;};
struct B : A, IB {
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(IID&, void**);
    virtual ULONG STDMETHODCALLTYPE AddRef() {return A::AddRef();}
    virtual ULONG STDMETHODCALLTYPE Release() {return A::Release();}
    virtual HRESULT STDMETHODCALLTYPE FnA() {return A::FnA();} //オーバーライドしない気なら
    virtual HRESULT STDMETHODCALLTYPE FnB() {/*実装*/}
};
HRESULT STDMETHODCALLTYPE B::QueryInterface(IID& riid, void** ppv) {
    if (ppv == 0) {
        return E_POINTER;
    } else if (riid == IID_B)     {
        *ppv = static_cast<IB*>(this);
        AddRef(); //直接A::AddRef()でも可
        return S_OK;
    } else {
        return A::QueryInterface(riid, ppv);
    }
}
Javaのインタフェースの仕様だとBでのAddRef以下のようなことを書く必要がなかった気がする、ちょっとうらやましい。


533 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:34:43 ]
委譲するわけですか。
うーん。委譲のコストが少し気になってしまいますね。
そんなもんなんでしょうか。



534 名前:デフォルトの名無しさん [2008/01/28(月) 13:31:23 ]
自分クラスに大小比較の演算子を定義して、<=を使おうと思ったら、
<と==の2つを定義するのではなく、<=を定義しないとだめだったのですが、
そういうものなのですか?


535 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 13:33:46 ]
そういうものです。
そもそも、'<='が「小なりイコール」であると言う意味から再定義するわけですから。

536 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 13:35:16 ]
>>534
つ[boost::operators]

537 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 14:14:23 ]
>>534
以下は違う関数だからねえ
operator<()
operator=()
operator<=()
<=を使うということはoperator<=()をコールするわけで。

538 名前:デフォルトの名無しさん [2008/01/28(月) 16:23:28 ]
>>535-537
ありがとうございます。じゃあ自分クラスについては、なるべく「<=」は使わずに
<と==でなんとかするようにします。
boost::operatorsは、<と==をconst関数で定義して、publicでboost::operatorsを
継承すれば動きました。かなり便利そう。
ありがとうございました。

539 名前:デフォルトの名無しさん [2008/01/28(月) 18:45:01 ]
typedef struct { .... } hoge_struct;

#define TARGET_STRUCT hoge_struct
#define TARGET_STRUCT_STR ????????????

printf("type: %s\n", TARGET_STRUCT_STR );
printf("size: %d\n", sizeof(TARGET_STRUCT) );

表示
type: hoge_struct
size: 40

TARGET_STRUCTにあるhoge_struct部分は、任意の構造体名です。(色々変化します)
TARGET_STRUCT_STRが "hoge_struct" に(文字列)なるようにしたいのですが、
どんなマクロにすればいいのでしょうか?

540 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 18:52:07 ]
言葉足らずでした。
型名であるTARGET_STRUCTを元に、文字列なTARGET_STRUCT_STRを作りたいという意味です。

541 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 18:58:47 ]
# TARGET_STRUCT

542 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:11:51 ]
>>541 ありがとうございました。

543 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:28:58 ]
>>538
なんとかするとかじゃなくて「<」と「==」から「<=」を作ればいいじゃんか。
「<」と「==」が定義されてるならば「<=」は↓のようになる。
return A < B || A == B;
boost::operatorsは内部でそういうことをやってるだけ。




544 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:53:36 ]
 よろしくお願いします。
 項書き換えを行うシステムを作るにあたって、今式の構造を木構造で表すことを考えています。
式は中値記法で書かれているので、基本的には一般的な構文木のように作ろうと思っています。
具体的には、ある内部ノードには演算子を格納し、その左と右の子供に項を格納するような2分木です。
 2項演算を表現するのにはこれで十分なのですが、 (X, Y, Z) のような三つ組みも表現しなければならないのです。
子供を3つ持つような木を作って、三つ組みを表現するときだけ3つ目の子供に項を格納すれば表現は可能になるのですが、
頻繁に三つ組みが現れるわけではないので、余分な子供はあまり持たせたくないと思っています。
 2分木で三つ組みを表現するうまい方法はないでしょうか。


545 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:56:16 ]
演算子 A を考える場合に

   A1
   ∧
   X A2
    ∧
    Y Z

みたいにすればいいんじゃない?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<252KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef