トップページ⇒tech
1001コメント289KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/03/29(水) 11:59:26
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.25【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1140963340/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん2006/03/29(水) 12:54:28
新スレおめでとうございます
0003デフォルトの名無しさん2006/03/29(水) 13:36:07
>1
おつ
0004デフォルトの名無しさん2006/03/29(水) 16:13:06
ポインコが4ゲツ
0005デフォルトの名無しさん2006/03/29(水) 18:53:53
>1
乙
>前1000
GJ
0006デフォルトの名無しさん2006/03/29(水) 20:42:48
otu
0007デフォルトの名無しさん2006/03/30(木) 22:02:04
VisualC++6.0でGUI作るのって…めんどくさすぎない?
当方VC6.0しか環境が無く。どうにか、これでRAD的に簡単にGUI組んでいく方法ない?
0008デフォルトの名無しさん2006/03/30(木) 22:09:05
VC++Expressを入れてみるとか
0009デフォルトの名無しさん2006/03/30(木) 22:16:55
IEコンポーネントはっつけてGUIデザインはHTMLで。
0010デフォルトの名無しさん2006/03/30(木) 22:50:35
>>8
ごめん。せっかくだけどSP2入れれないから、俺無理だった。。。

>>9
そんなことが出来るのか。

思ったんだけど、EcllipseにGUIエディタ入れて、C++のも入れて編集したりとかできないかな
つか、VCでのGUIの組み方を親切丁寧に教えてくれてるサイトって無いものか
0011デフォルトの名無しさん2006/03/30(木) 23:51:49
>>7
ツールバーとかつけるだけでも大変だけど、
それを簡単に作れるようにマイルーチンを鍛えていくのが楽しい。
0012デフォルトの名無しさん2006/03/30(木) 23:59:12
>>7
ダイアログエディタはそんなに使いづらかった?
0013デフォルトの名無しさん2006/03/31(金) 00:50:35
WideStudioってどうだっけ?
0014デフォルトの名無しさん2006/03/31(金) 11:04:04
>>12
メニュー付きで編集できるなら良かったのだけど(ダイアログ
画像(BMP〜PSDくらいまで)を単純にファイル選択ウィンドウから開いて
加工して、プレビューで見せて任意形式で保存するようなアプリにしたいのだけど
0015デフォルトの名無しさん2006/03/31(金) 13:37:34
>>14
つ[ImageMagick]
0016デフォルトの名無しさん2006/03/31(金) 21:46:15
14だけど、結局窓を開かないで
初めからダイアログボックスにメニューをつけて画像開くようにしようとおもう
ところでピクチャボックスにファイル開いて画像の表示って出来るかな

>>14
やりたいことがあるから既存のソフトウェアは。。。
0017デフォルトの名無しさん2006/03/32(土) 01:56:01
基本クラスオブジェクトへのポインタを通じて派生クラスへアクセスする事があるから、
デストラクタはvirtual宣言しておくべきだと言えるのですか?
0018デフォルトの名無しさん2006/03/32(土) 02:09:28
日本語でおk
0019162006/03/32(土) 02:20:53
ブロークン日本語ですかね?
0020172006/03/32(土) 02:21:42
16じゃなかた。(*´J`)
0021デフォルトの名無しさん2006/03/32(土) 02:33:51
class A{
void make_obj_b;
};

void A::make_obj_b;(){
obj_b B;
]

class B{
}

void

int main (){
obj_a A;
obj_a::make_obj_b;
// <-ココ
return;
}

とした場合、コメントの場所でobj_bは破棄されてしまいます。
obj_aが生きている間はobj_bを保持する方法などはありますか?

0022デフォルトの名無しさん2006/03/32(土) 02:37:25
>>21
集約の関係にする。
お前はOOPのなんたるかを勉強し直せ
0023デフォルトの名無しさん2006/03/32(土) 02:43:17
>>22
thx.
0024172006/03/32(土) 03:51:45
何故デストラクタを出来る限りvirtualにした方が良いかというと、
それは、基本クラスオブジェクトへのポインタを通じて派生クラスオブジェクトへアクセスする事例を考慮しての事ですか?
0025デフォルトの名無しさん2006/03/32(土) 03:53:35
日本語でおk
0026デフォルトの名無しさん2006/03/32(土) 03:54:18
意味がよくわからんが、アップキャストされてるポインタをdeleteしたときに
サブクラスのデストラクタを呼ぶため
0027172006/03/32(土) 04:17:28
日本語に自信が無くなりました。。。
0028172006/03/32(土) 04:19:40
基本クラスオブジェクトへのポインタを通じて派生クラスオブジェクトへアクセスする事を
アップキャストと言うのですね。
勉強になりました^^
0029172006/03/32(土) 04:20:52
基本クラスオブジェクトへのポインタを通じて派生クラスオブジェクトへアクセスする事を
アップキャストと言うのですね。
勉強になりました^^
独習C++では教えてくれませんでした><
0030デフォルトの名無しさん2006/03/32(土) 04:27:07
>>29
アップキャストは「アクセスすること」じゃなくて、
アクセスするためにポインタや参照を変換することを言う。
0031デフォルトの名無しさん2006/03/32(土) 05:54:40
なんで派生クラスのポインタを基本クラスのポインタにキャストしたのに、
そこから仮想関数呼んだらまだ派生クラスの関数の方を呼ぶんですか?
0032デフォルトの名無しさん2006/03/32(土) 05:57:23
そういうことをするために仮想関数が存在する
この動作が気に食わないならvirtualせずにオーバーライドしとけ
0033デフォルトの名無しさん2006/03/32(土) 06:03:27
実行時にどちらを指してるか判断して、それようの方を呼ぶ機構がvirtualによるオーバーライドなのではないのですか?
今は基本クラスのオブジェクトを指してる筈だから、基本クラスのvirtualついた方を呼ぶべきだと思います><
0034デフォルトの名無しさん2006/03/32(土) 06:08:21
>>33
日本語でおk
0035デフォルトの名無しさん2006/03/32(土) 06:12:49
ムキー!#><#
0036デフォルトの名無しさん2006/03/32(土) 06:14:16
ポリモーフィッククラスがマスターできません><
0037デフォルトの名無しさん2006/03/32(土) 06:26:31
>>36
日本語でおk
0038デフォルトの名無しさん2006/03/32(土) 06:29:47
>>37
どうせあんたなんか朝生でも見て暇を持て余してたんでしょ!
で、変なの居るから適当にいじめてやろうって魂胆でしょ!?><
0039デフォルトの名無しさん2006/03/32(土) 06:53:55
あれ?virtualせずにオーバーライド?

もうvirtualの存在意義とか混乱して分からなくなりました><
0040デフォルトの名無しさん2006/03/32(土) 07:19:23
virtualをつけるとアップキャストした場合でも、ダウンキャストした場合でも、継承クラスの方を使うという認識でいいですか?

んで、ダウンキャストしたら基本クラスの方を使いたいなら
virtual無しオーバーライドにすると。
0041デフォルトの名無しさん2006/03/32(土) 07:21:29
>>33
>呼ぶべきだと思います><
派生クラスの関数を呼ぶためにvirtual にしてるんだから何もおかしくないだろ
0042デフォルトの名無しさん2006/03/32(土) 07:26:55
そうか!virtualだからこそ、できるだけ呼び出しはリアルの方にするという事か!
0043デフォルトの名無しさん2006/03/32(土) 07:32:25
ダウンキャストしても継承クラスのデータが残ってるのが気持悪いです。
キャストの仕組みが理解できてないのだと思います。
0044デフォルトの名無しさん2006/03/32(土) 07:47:25
とりあえず、修飾子virtualをつけてない場合のオーバーライドの動作を理解しろ
0045デフォルトの名無しさん2006/03/32(土) 08:05:47
理解しました。
vitualつけてないと、ダイナミックキャストで継承クラスのポインタを得たりしない限り
アップキャストしても基本クラスの関数呼び出しです。
継承クラスのオブジェクトのポインタからダイナミックにダウンキャストした場合でも
基本クラスの関数を呼び出します。

vitualをつけると、キャストがアップダウン関わらずvirtualがついてない方を呼び出すよう努力します。
0046デフォルトの名無しさん2006/03/32(土) 09:16:06
Visual C++ .NET 逆引き大全 500の極意を読んで
C++の学習をしています、クラスライブラリを作って見たいのですが
どういうライブラリを製作していいか思いつきません
皆さんがC++を学んだ当初どのようなライブラリを作られましたか?
題材のヒントをもらえないでしょうか
0047デフォルトの名無しさん2006/03/32(土) 09:37:07
何桁でも計算できるライブラリ
0048デフォルトの名無しさん2006/03/32(土) 12:49:58
内部でint配列使ってどうこうやるってやつ?
0049デフォルトの名無しさん2006/03/32(土) 12:59:10
GNU ncursesで日本語表示をするやり方を教えてください。
環境はcygwinです。
configure --enable-widecの後makeしたncursesを使っています。
コンパイルはgcc test.c -lncurseswです。。
printwもaddwstrも文字化けしてしまいします。
コンソールプログラムのprintf("こんにちは");は正常に表示されています。
0050デフォルトの名無しさん2006/03/32(土) 18:27:51
普通のキャストとstatic_castの違いが分かりません><
0051デフォルトの名無しさん2006/03/32(土) 18:34:26
static_cast=性的なキャスト=(;´Д`)ハァハァ
0052デフォルトの名無しさん2006/03/32(土) 18:34:28
C++で、
A(char *x){.....}
B(){char x[]=(..);....A(x)...}
としたら、'char *' 型は 'char[]' 型に変換できない エラーになりました
どうしたらいいですか
0053デフォルトの名無しさん2006/03/32(土) 18:39:25
せめてC++で書けよ・・何でそんなに頭悪いんだよ・・・・・・
0054初心者2006/03/32(土) 18:41:17
>>52
char x[]
を
char* x[]
にしたら良いんじゃないの?
0055デフォルトの名無しさん2006/03/32(土) 18:49:03
>>50
とりあえずstatic_cast。
それで駄目ならreinterpret_castかconst_cast。
C形式のキャストは出番無し。
0056dynamic_cast2006/03/32(土) 18:53:51
(´・ω・`)ショボーン
0057初心者2006/03/32(土) 19:07:38
違うな
>>52
A(char **x){.................}
だとどうかな?

char x[]=(.........)のxはポインタポインタのレベル?だから
入れる方も**にしてポインタポインタにしないといけないんじゃないかな?
0058502006/03/32(土) 19:08:13
>>55
intをただunsignedにするだけでもわざわざstatic_castするんですか?
0059デフォルトの名無しさん2006/03/32(土) 19:30:55
>>58
するよ。
0060デフォルトの名無しさん2006/03/32(土) 19:47:11
>54,57
帰れ
0061502006/03/32(土) 19:53:22
>>59
あり^^
0062522006/03/32(土) 20:02:44
あの、エイプリルフールでしたっけ?
0063デフォルトの名無しさん2006/03/32(土) 20:24:41
コンテナはコンテナを格納できないのですか?
代わりにコンテナへのポインタを格納するようにするのですか?
0064デフォルトの名無しさん2006/03/32(土) 20:25:34
>>63
vector<vector<int> > vv;
とかそういう事?
0065632006/03/32(土) 20:27:30
はい
0066デフォルトの名無しさん2006/03/32(土) 20:35:47
>>65
で、>>64のような書き方ではコンパイルエラーが出るの?
ポインタを入れたいのはなぜ?
0067デフォルトの名無しさん2006/03/32(土) 20:36:06
>>52
略し過ぎ。
さっぱり分からん。
0068デフォルトの名無しさん2006/03/32(土) 20:36:40
vector<vector<int>> vv; と書いてるに一票。
0069デフォルトの名無しさん2006/03/32(土) 20:45:19
>>60
俺も最初そう思った。しかしコンパイルエラーを晒してくれないので
さっぱり原因がわからん。
0070初心者(今までのは全部間違い、すまそ)2006/03/32(土) 20:46:19
>>52
// test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

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

void name(char* s){
cout << s << "\n";//(s:文字列の先頭を指すポインタ)を入れるとcoutが文字列にして全部表示してくれる
cout << &s << "\n";//(&s:文字列の先頭を指すポインタの中身)
cout << s[14] <<"\n";//(s[14]:15番目のポインタ)をcoutが文字にして表示してれる

}

int _tmain(int argc, _TCHAR* argv[])
{
char s[]= "2chnerehayaku sine";
name(s);
return 0;
}



>>52
ゴメン、今までの全部なしにして
>>52の通りで普通に出来たけど
何か駄目なのか?
0071632006/03/32(土) 20:47:59
>>66
なんだかエラーが出たような気がしないでもないから苦肉策としてです。

僕も自然な表記で済むならそうしたいです。
0072632006/03/32(土) 20:51:18
>>68-69
調べて参ります。
0073デフォルトの名無しさん2006/03/32(土) 20:51:26
そりゃ仕様です。
気になるならvector< vector<int> >とかやればいいんでないの。
これでも気になるなら他の手段使えばいいよ。
0074初心者2006/03/32(土) 21:00:51
すまん、また間違えたよ

cout << &s << "\n";//(&s:文字列の先頭を指すポインタの中身)
↓
cout << *s << "\n";//(*s:文字列の先頭を指すポインタの中身)
に変更

上のはポインター自体のアドレスだがや
0075初心者2006/03/32(土) 21:15:55
cout << s[14] <<"\n";//(s[14]:15番目のポインタ)をcoutが文字にして表示してれる
ていうのも違うな

cout << s[14] <<"\n";//(s[14]:15番目の文字)をcoutが文字にして表示してれる
15番目の文字って意味だな

(ポインタともいえるのかもしれないけど、一応 *s[14] って出来ないから文字だな)
0076初心者2006/03/32(土) 21:22:53
まとめると
cout << s << "\n";//(s:文字列の先頭を指すポインタ)を入れるとcoutが文字列にして全部表示してくれる
cout << s + 14 << "\n";//(s:文字列の先頭を指すポインタ)を入れるとcoutが15番目の文字から文字列にして最後まで表示してくれる
cout << *s << "\n";//(*s:文字列の先頭を指すポインタの中身 )
cout << &s << "\n";//(&s:文字列の先頭を指すポインタのアドレス)
cout << s[14] <<"\n";//(s[14]:15番目の文字)をcoutが文字にして表示してれる

俺、全然駄目だな・・・
0077デフォルトの名無しさん2006/03/32(土) 21:37:31
式中のchar, shortは自動的にintに格上げされますが、
floatは必ずしもdoubleにされるわけじゃないですよね?
K&R1版にはdoubleに格上げされるとあるようですが、
古い仕様ですよね?
0078デフォルトの名無しさん2006/03/32(土) 22:01:54
>>77
その通り
0079772006/03/32(土) 22:07:09
どうもです
0080初心者2006/03/32(土) 22:32:20
すまん、s[14] みたいなのは文字とか文字列の事か
0081デフォルトの名無しさん2006/03/32(土) 22:57:45
配列のことや。
0082初心者2006/03/32(土) 23:12:27
char* s1[3]={"東京","大阪","名古屋"};
としたとき

東京の”京”の字だけ出すにはどう配列を書いたら良いの?
0083初心者2006/03/32(土) 23:25:07
ああ、この場合はs[0]
ポインタの配列か
0084デフォルトの名無しさん2006/03/32(土) 23:40:08
>>82
#include <stdio.h>
#include <wchar.h>

wchar_t const* s1[3] = {L"東京",L"大阪",L"名古屋"};
fputwc(s1[0][1], stdout);
0085デフォルトの名無しさん2006/03/32(土) 23:45:22
"京"の文字だけ出すっていう出すの意味がわからんというか
何をしたいのかわからんが、"京"は2バイト文字なので、
s1[0][2]とs1[0][3]のchar型2つ分の内容で"京"1文字を表す。
0086デフォルトの名無しさん2006/03/32(土) 23:48:03
>>85
いい加減なこと言うなや
0087初心者2006/03/32(土) 23:49:34
>>84
ありがとう
やっぱ
他の関数使わないと無理なのな
0088852006/03/32(土) 23:53:58
>>86
え?どっかいい加減だった?
0089デフォルトの名無しさん2006/03/32(土) 23:55:56
文字コードによって全角文字のバイト数は異なる違う
例えばEUCだと3バイト文字がある
0090デフォルトの名無しさん2006/03/32(土) 23:59:54
そういう文字コードは、wchar_tが2バイトの処理系では
扱えないっちゅうことか?
0091デフォルトの名無しさん2006/04/02(日) 00:04:29
wchar_tってそういう文字コードを突っ込む型じゃないだろ!
0092初心者2006/04/02(日) 00:20:06
char* s1[3]={"tokyo","oosaka","nagoya"};
の時

s1[0]+1
s1[0][1]

は同じ事なのかな?
0093デフォルトの名無しさん2006/04/02(日) 00:41:52
>>92
*(s1[0]+1)
と
s1[0][1]
が同じ。
0094デフォルトの名無しさん2006/04/02(日) 00:48:59
>>92
前者はchar *型、
後者はchar型

s1 : char *[3]型
s1[0] : char *型
s1[[0][0] : char型

こうするとわかりやすい。

std::cout << typeid(s1[0] +1).name() << std::endl ;
std::cout << typeid(s1[0][1]).name() << std::endl ;

0095632006/04/02(日) 00:50:35
調べて参りました。
コンテナはコンテナを格納出来ます。
0096初心者2006/04/02(日) 01:11:41
>>93
>>94
つまり
s1[0][1]って
はchar型なのな

だから
&s1[0][1]ってやると
okyoになるのか
結局、普通の配列なのか
0097デフォルトの名無しさん2006/04/02(日) 01:29:15
>>95
うん、できるってばよ
すぐに>>64で示されとるだろうが

結局なにがわからなくて質問しにきたんだろう・・・
0098デフォルトの名無しさん2006/04/02(日) 01:46:29
>>91
wchar_tのエンコーディングは何も規定されてないよ、規格上は。

Unicodeを使うのが最近では一般的だけど
そうでない実装も普通にある/あった。
0099デフォルトの名無しさん2006/04/02(日) 02:16:51
cout << でコンソールに出力したら超遅くない?
Cでprintfなら一瞬なのに、C++のやり方だと一文字ずつズラーっと並ぶ感じ。
0100デフォルトの名無しさん2006/04/02(日) 02:28:22
>>99
それはそれでカッコいいじゃん
0101デフォルトの名無しさん2006/04/02(日) 02:39:46
ちょっと流れ切るようで申し訳ないのですが
PhotoShopで作成したアルファを適応したPNGファイルが読み込みたいので
ttp://www.topposystem.co.jp/GDIp/GDIp/gdi_flat_api.htm
にあるGDI+FlatsAPIsの関数を使用しファイルの読み込みに
336 GpStatus WINGDIPAPI GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
でGpBitmapを作成し
344 GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap, HBITMAP* hbmReturn, ARGB background); 
でhBitmapに変換しそれをUpdateLayeredWindowで表示させようと思ってるのですが
GpStatus GdipCreateBitmapFromFile("ファイル", GpBitmap **bitmap);の形で書くと
初期化子の数が多いと言われ、上のリストと引数が違い詳細がわからず困っています。
環境はVC++.NET2003で作成しています。

この方法でアルファが抜けた状態でウィンドウを表示する事は可能なのでしょうか?
普通のBitmapやアルファの付きのBMP等の表示は成功しています。
どなたか教えて頂けないでしょうか?よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています