X



【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2016/11/06(日) 22:58:02.60ID:dU5z27As
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/
0900デフォルトの名無しさん
垢版 |
2017/07/11(火) 20:17:20.41ID:gS+YojZ9
ん?まったくよくわからんのだが、だれか解説して

>配列でないオブジェクトも要素数1の配列として考える仕様
↑まずこれがよくわからない
配列じゃないオブジェクトといえば、例えばint i;などは配列としては扱えないよね

で、下二行の意味も分からない
0901デフォルトの名無しさん
垢版 |
2017/07/11(火) 22:08:22.53ID:qjau/h5c
配列かどうかは関係なく、オブジェクトの後ろのアドレスは計算も出来るし比較も出来る
0902デフォルトの名無しさん
垢版 |
2017/07/11(火) 22:10:11.51ID:qjau/h5c
>>894は配列じゃない場合に関しては何も言ってないから間違いではないが
わざわざ配列と書いてるので配列以外は違うと思ったかわからなかったか
だろう
0903デフォルトの名無しさん
垢版 |
2017/07/11(火) 22:14:58.67ID:qjau/h5c
>>897
「つまり」が意味不明
>>894は配列じゃない場合には何も言ってない
「大丈夫でない」は正しい

>>898
配列じゃないから何?

>>899
実際には配列ではない
0904デフォルトの名無しさん
垢版 |
2017/07/11(火) 22:28:18.47ID:gS+YojZ9
いや、それは俺も思ったんだが
ppが配列じゃないのは当たり前なんだが(てかポインタだし)
おそらくはそんなことは問うてないって言いたいんだと思う

つまり、ppが指している先が何であるかが問題であるから
配列か配列じゃないかを問うべきはppではなくppの指している先である「p」であろうと
同じことをもう一度言うけど
pp[1]としたとき問題になるのはppの指してる先がどうなっているかで
今回の場合はそれは「p」であるから
正しくは、「ppの指してる先のpは配列じゃないだろ」って言うべきっていう主張かと
0906デフォルトの名無しさん
垢版 |
2017/07/12(水) 07:01:19.46ID:Mf+sZV2C
pp[1]の時点で動作不定

正しく動かない環境はもしかしたら存在しないかもしれないけど
0907 ◆QZaw55cn4c
垢版 |
2017/07/12(水) 07:26:19.94ID:9q9UgJkW
>>880
ん、最初にもどってメッセージを書くとすれば、こうなるかな

>ポインタそのものにオブジェクトってできるんでしょうか?
私が意味を取り違えているかもしれないが、「できない」
ポインタを取得したからといって、オブジェクトが生えてくることはない
あくまで、先にオブジェクトを確保した上で、それに対してポインタを設定する手順をとる

>例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
array を確保しているので、p は array 確保分(p 〜 p + 3)だけプログラムとして意味がある。
pp は p 一個分だけ意味がある。すなわち *pp = p、でも pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない

&pp[1] と書くとなにがしかのアドレスを生成するが、それは使えない
アドレスを生成できるからといって、その領域が意味のあるものとは限らない

>>881 では意味のないことを求めてしまいごめんなさい
0908デフォルトの名無しさん
垢版 |
2017/07/12(水) 08:20:30.93ID:SNfdy8To
>>906
>pp[1]の時点で動作不定
ちなみにそれを規定する規格の記述はどこ?
Cでは明確に禁止されているようだがC++では見つけられなかった
0911デフォルトの名無しさん
垢版 |
2017/07/12(水) 13:20:57.39ID:ahqaJGrL
>>907
まとめとしてはそれでいいし否定するわけじゃないけど、若干気になるのは
1.ポインタ自身もポインタというオブジェクトじゃないのか?
2.末尾+1のアドレス(を指すポインタ)はデリファレンスできないけど、大小比較には使えるのでは
0912デフォルトの名無しさん
垢版 |
2017/07/12(水) 13:41:52.51ID:uqOuLEsE
そんで俺はちょっと思ったんだけど
Cはポインタを配列のように扱えるのが便利だなぁと
逆に配列名を参照したらポインタ値になるし
あと他、関数ポインタを普通の関数のように扱えたり
逆に関数名を参照したらポインタ値になったり
意味の上で別解釈しようがないからそれでいいだろ、的な
二つに共通しているのは
(1)参照しても意味のある値が得られなそうなシンボルは自動的にポインタ値に成り下がってもらおう
(2)その上でポインタに対していろいろな演算 ()[] が出来るようにしておこう
というもので、これでシームレスになるしタイプも減るから便利だろう、と
でもそういう方針なんだったら何故我々は「.」と「->」を
使い分けなきゃならないんだ?と思わんこともない
意味の上で別解釈できたり不明瞭だったりは無いのに
ただ、Cの構造体は(1)を満たしていない
もし(1)を満たすようにしてしまうと、構造体を参照するとポインタ相当に成り下がってしまうので
代入演算子で代入したり、関数に値渡ししたりが出来なくなる
ただし、C言語がそのような仕様になっていた可能性は十分にあると思う
というのも配列がまさにそうであって、代入でコピーできないし、関数に値渡し出来ないから
アセンブリレベルでは配列も構造体もレジスタに入りきらないという意味では同じで
先頭アドレスからのオフセットでアクセスするのは同じであるから
そういう着想に基づけば、構造体も配列と同じようにポインタに成り下がる仕様に
なっていた可能性はあると思う
構造体は代入できないからmemcpyしろ、がCの常識だった可能性はある
そんで、「.」演算子は構造体のポインタに対して有効、となって、「->」は無くなる
で、そうはしなかった代わりに「->」演算子が有る、とも取れる
0913デフォルトの名無しさん
垢版 |
2017/07/12(水) 13:42:12.78ID:uqOuLEsE
気まぐれか、意図的か、歴史的事情か、生い立ちに由来するものか、知らんが、そうなっている
だが実際これが大当たりで、もしそうじゃなかったらC++が全く成り立ってこない
C++のクラスはCの構造体を拡張したものだが、オブジェクトが勝手にポインタに成り下がる仕様だと
代入したり、関数のreturnで値として返したりができない
となれば独自のクラスを定義して、まるで基本型のように振舞わせたり、メソッドチェーンをしたりが出来ない
もしやるとしたらnewして返すしかないので、GCが無いとどうにもならなかっただろう
(実際C++とCの配列は相性が悪く、std::vectorかstd::arrayを使わないと上手くいかない場合も多い
 ポインタ相当に勝手に成り下がってしまうので代入ができない)
ただ、このことが本当に良かった事なのかどうなのかは分からない
GCは有ったほうが良かったかもしれないし、C++の代入やコピーコンストラクタに関する話題は後を絶たない
他の言語のほとんどがオブジェクトを参照で扱うのを見てると
Cの配列のように勝手にポインタに成り下がって代入できない考え方のほうがスタンダードなのかもしれない
C++のクラスは、状況に合わせて、これを選べる、という立場になってるが
もしCの構造体が配列のような仕様だったなら、どうなっていたか分からなかった事を考えると感慨深い
0914デフォルトの名無しさん
垢版 |
2017/07/12(水) 13:43:43.81ID:uqOuLEsE
よくよく考えてみればなかなかに奇妙
まず常人が普通に考えたら、配列や関数名を参照したらポインタ値が得られることにしようっていう発想がない
プログラマは基本的に几帳面で、整合性を気にする生き物だから
ポインタ値は「&」を付けたら得られることにしよう、と決めたのだから
&arrayとか&funcとか書かせたくなるのが普通だろう
そして(*array_ptr)[1]とか(*func_ptr)()とか書かせたくなるものだろう
ところがCは、レジスタに乗らないもの、演算できないもの、を
勝手にポインタと同等に格下げするというルールを設けたうえで
そのポインタに対して各種演算子を定義することで整合性を保ちつつタイプ数を減らすという
ウルトラCをやってのけた
ここまででも俺ではちょっと思いつかないなーと感心するわけだが
逆にこんなすごいことを思いついたんなら、全部このルールで行きたくなってくるのが凡人
その方が整合性がありそうな気がするから
なのに構造体はそうなっていなくて、代わりにアロー演算子が定義してある
だから配列と違って構造体は代入ができるし関数に値渡ししたり、値で返したりが出来る
それはそれで奇妙なことだと思ったりもするが、とにもかくにも
この辺がC++の基本方針や特色にものすごく影響が出てる
GCが無いのもそうだし、最近でも右辺値参照が追加されたりとか、結構尾を引いていて
C++特有のややこしさの一端でもあり、他には代えがたいメリットでもある
ある意味で、Cの配列の考え方のが、他言語のオブジェクトの考え方に近いというのが何とも
そして構造体をベースとするC++とCの配列は相性が悪いという
C言語の功罪は凄い
0916デフォルトの名無しさん
垢版 |
2017/07/12(水) 17:58:12.38ID:SNfdy8To
駄レスの関係無いリンク先をまじまじと読んでしまった
日本語でレスが書かれていない時点で読む価値が無いと判断すべきだった
0918デフォルトの名無しさん
垢版 |
2017/07/12(水) 18:19:22.64ID:Oma/x2r0
ユーザーヘッダーファイルを作って
#include<stdio.h>
#include<math.h>
#define PI 3.14
double r;
void nyuuryoku(void) {
printf("半径を入力してください。\n");
scanf("%fl", &r);
printf("%f\n", r);
return;
}
double keisan(void) {
printf("%f\n", r);
return PI*pow(r, 2);
}
と書いてprintfでrを観察してみたんですがscanfでrに数値を入力しているはずなのにrに何も反映されていないことがわかりました。
rはグローバル変数として扱われていると思うのですがなんでrの値が変わらないんでしょうか?
0919デフォルトの名無しさん
垢版 |
2017/07/12(水) 18:34:20.99ID:+I30gFZ0
void nyuuryoku(void) {
char buf[256];
printf("半径を入力してください。\n");
if(NULL==fgets(buf,sizeof(buf),stdin)){
  printf("ちゃんと入力しろやボケ\n");
  return;
}
sscanf(buf,"%fl", &r);
printf("%f\n", r);
return;
}
0923デフォルトの名無しさん
垢版 |
2017/07/12(水) 18:49:05.30ID:Oma/x2r0
oh....
コンパイラも見逃してくれてたからそんなミスとは思いませんでした(´エ`;)
ありがとうございました
0927デフォルトの名無しさん
垢版 |
2017/07/13(木) 00:31:49.82ID:/oMuxl/G
>>907
>pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない
Cの規格をよく読み直したらそうでもなかった
0928デフォルトの名無しさん
垢版 |
2017/07/13(木) 01:06:35.55ID:+2MHjXyv
>>912-914は基礎的なところで間違った理解をしていると
そのうえに乗っかるすべてのものについて間違った理解をすることしかできなくなるという見本のようだ
0930デフォルトの名無しさん
垢版 |
2017/07/13(木) 07:12:43.09ID:/oMuxl/G
>929
その書いちゃダメを規定する6.5.6p8には「that is evaluated」という条件がある
evaluateはメモリアクセスの有無と関係無く基本的に全て行われるはずだが
6.5.3.2p3の例外既定により該当しないばかりか「&*」が省かれるとある
0931 ◆QZaw55cn4c
垢版 |
2017/07/13(木) 08:39:26.58ID:045lcfaT
>>930
シンタックスではなくセマンティクスというわけですか‥ありがとう
0932デフォルトの名無しさん
垢版 |
2017/07/13(木) 18:16:27.80ID:PDgj9Ebq
#include<stdio.h>
#include<string.h>
#define NUM 10
int main(void) {
int length;
char name[NUM * 2 + 1];
char family_name[NUM + 1];
char first_name[NUM + 1];
printf("姓を入力してください\n");
scanf("%s", family_name);
printf("名を入力してください\n");
scanf("%s", first_name);
strcat(name, family_name);
strcat(name, first_name);
length = strlen(name);
printf("名前:%s\n", name);
printf("長さ:%d\n", length);
return 0;
}
このプログラムで入力まではちゃんとできてるみたいなんですがstrcatのところでおかしくなって
結合結果がフフフフフフフってなります。どうしてでしょうか?
0936デフォルトの名無しさん
垢版 |
2017/07/13(木) 18:37:48.37ID:PDgj9Ebq
ありがとうございました
0937デフォルトの名無しさん
垢版 |
2017/07/13(木) 19:34:29.65ID:b1PvI/zl
どうでもいいけど、
char name[NUM * 2 + 1] = "";

普通こうじゃね?

char name[NUM * 2 + 1] = {'??0'};

これでも良い

コンパイル結果はたぶん全部同じだけど
0939デフォルトの名無しさん
垢版 |
2017/07/13(木) 20:43:44.17ID:lX8cJUTX
Visual Studio のデバッグビルドだと、不定メモリをCCで埋める
だからこれに対応する'フ'が表示される
なぜ途中が'ノ'になるかはわからん

strcatではCCの後の0を探してその後に文字列をコピーするから、0の位置によっては例外が発生したり動作がおかしくなったりするかも
0941デフォルトの名無しさん
垢版 |
2017/07/13(木) 21:23:18.88ID:lX8cJUTX
>>940
タイプミスじゃなくて文字化けした
スマホから見ると、? が◆の中に書かれた文字になってる
0947デフォルトの名無しさん
垢版 |
2017/07/14(金) 20:20:31.05ID:8ghhANnS
えっ
mainのreturnでint値返すのはexitをその返り値で呼ぶのと全く等価でしょ?
少なくとも現行のC,C++規格では等価と書いてあるけど現実の実装ではそうなってないってこと?
0948片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/07/14(金) 20:52:35.05ID:RoIBY40S
#include <iostream>
#include <cstdlib>
struct A {
~A() {
std::cout << "OK" << std::endl;
}
};
int main(void) {
A a;
std::exit(-1);
}
0953片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/07/14(金) 21:46:17.67ID:RoIBY40S
atexitはマニュアルに書いてある通りだから、ここでいちいち説明する必要はない。
0954片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/07/14(金) 21:53:53.48ID:RoIBY40S
マニュアルこそが聖書。マニュアルを読まない奴等はノンプレイヤー。
0956片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/07/14(金) 23:01:28.54ID:RoIBY40S
C++でexit使うぐらいなら、代わりにC++例外を使った方がいいよ。デバッグしやすいし。
0957デフォルトの名無しさん
垢版 |
2017/07/15(土) 05:41:00.21ID:81gh4ly6
>>947
exit() 関数に入ってしまってはデストラクタが働かないのに,それでも return 文と一緒といいはるの?
それ規格がまちがってるから,そのうち修正がはいるはず
0959デフォルトの名無しさん
垢版 |
2017/07/15(土) 16:38:44.94ID:sZ4h7fLQ
ポインタは2段までしか使わないなあ
関数ポインタはstd::functionに入れる癖がついたし
0960デフォルトの名無しさん
垢版 |
2017/07/15(土) 17:20:33.71ID:d+yGYUAe
#include<stdio.h>
int unko(int x);
int aho(int *y);
int main(void) {
int a[5] = { 1,2,3,4,5 };
unko(a);
aho(&a);
printf("%x\n%x\n", a, &a);
return 0;
}
int unko(int x) {
printf("%x\n", x);
return;
}
int aho(int*y) {
printf("%d\n%d\n",*(y+1), y[2]);
return;
}

このとき関数unkoで配列aの中身にアクセスする方法ってありませんか?
アドレスがわかっているからできそうな気もするんですがよく解りません。
0961片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/07/15(土) 17:27:13.54ID:xLcEZRbh
aがint a[5]であるとき、aはint配列の先頭アドレスだ。unkoの引数をポインターにしろ。
0964デフォルトの名無しさん
垢版 |
2017/07/15(土) 21:29:06.16ID:d+yGYUAe
>>963
VSだとコンパイラ通るんですが他のだと通りませんか?
あと関数unkoをいろいろ弄ってたんですが

#include<stdio.h>
void unko(int x);
void aho(int *y);
int main(void) {
int a[5] = { 1,2,3,4,5 };
unko(a);
aho(a);
printf("%x\n%x\n", a, &a);
printf("%d\n",a[4]);
return 0;
}
void unko(int x) {
printf("%x\n", x);
int *p = x;
printf("%d\n%d\n", p[1],*(p+2));
p[4] = 10;
return;
}
void aho(int*y) {
printf("%d\n%d\n",*(y+1), y[2]);
return;
}

こんな記述にすれば少なくともVSでは引数をポインタにしなくても配列aの要素を覗いたり操作したりできることがわかりました。
0969片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/07/15(土) 21:46:08.79ID:18nkvKxh
お使いの32ビット環境ではintとint*が同じサイズだから、キャストされれば代入できる。sizeof(int) == sizeof(int*)。
しかし、64ビット環境では動かなくなるかもしれない。ポインター型を無視した良くない書き方だ。
0970片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/07/15(土) 21:54:52.27ID:18nkvKxh
おそらく、君の環境では、
sizeof(int) == 4,
sizeof(int*) == 4
のはずだ。
64bit環境では、多分
sizeof(int) == 4,
sizeof(int*) == 8
になる。確認してみたまえ。
0971片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/07/15(土) 21:57:34.94ID:18nkvKxh
int*のサイズがintのサイズより大きいと、ポインター(アドレス)の値が正しく代入できない。これが64bitで失敗する理由だ。
0972デフォルトの名無しさん
垢版 |
2017/07/15(土) 22:08:26.63ID:qXQ9KlTo
こまけーことをゴチャゴチャと
Cなんて大なり小なり環境依存な場面しか使わん
貴様はintに32767以下しか入れんのか?
0973デフォルトの名無しさん
垢版 |
2017/07/15(土) 22:10:20.05ID:d+yGYUAe
確かめてみたら確かに自分の環境では両方4バイトでした
64bitのプログラムにしたらダメになるんですね・・・
勉強になります。ありがとうございます。
0974デフォルトの名無しさん
垢版 |
2017/07/15(土) 22:23:44.38ID:vkKq60sj
2レスで失礼します
VC++9Eでruby-opencvのビルドを試みているのですが構文エラーが多発してビルドできません
>C:\dev\ruby-opencv>nmake
>〜
>cl -I. -I. -IC:/dev/ruby-1.8.7-p374/win32/bin/lib/ruby/1.8/i386-mswin32_90 -IC:/dev/ruby-opencv-master/ext/opencv -MD -O2b2xty- /EHsc -IC:/dev/ruby-opencv-master/ext/opencv/ext/opencv
/EHsc -DHAVE_OPENCV2_CORE_CORE_C_H -DHAVE_OPENCV2_CORE_CORE_HPP -DHAVE_OPENCV2_IMGPROC_IMGPROC_C_H -DHAVE_OPENCV2_IMGPROC_IMGPROC_HPP -DHAVE_OPENCV2_VIDEO_TRACKING_HPP
-DHAVE_OPENCV2_FEATURES2D_FEATURES2D_HPP -DHAVE_OPENCV2_FLANN_FLANN_HPP -DHAVE_OPENCV2_CALIB3D_CALIB3D_HPP -DHAVE_OPENCV2_OBJDETECT_OBJDETECT_HPP
-DHAVE_OPENCV2_LEGACY_COMPAT_HPP -DHAVE_OPENCV2_LEGACY_LEGACY_HPP-DHAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H -DHAVE_OPENCV2_HIGHGUI_HIGHGUI_HPP -DHAVE_OPENCV2_PHOTO_PHOTO_HPP
-DHAVE_OPENCV2_NONFREE_NONFREE_HPP -DHAVE_STDARG_H -I/usr/include -IC:\dev\OpenCV2.4\install\include -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c
-TpC:/dev/ruby-opencv-master/ext/opencv/algorithm.cpp
>〜
>algorithm.cpp
>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\istream(699) : warning C4003: マクロ 'read' に指定された実引数の数が少なすぎます。
>C:\〜\istream(699) : error C2059: 構文エラー : ')'
>C:\〜\istream(846) : コンパイルされたクラスの テンプレート のインスタンス化 'std::basic_istream<_Elem,_Traits>' の参照を確認してください
>C:\〜\istream(700) : error C2143: 構文エラー : ')' が '{' の前にありません。
>〜
>C:\〜\xxbind1(320) : warning C4003: マクロ 'bind' に指定された実引数の数が少なすぎます。
>C:\〜\xxbind1(320) : error C2988: 認識できないテンプレートの宣言または定義です。
>C:\〜\xxbind1(320) : error C2059: 構文エラー : ','
0975デフォルトの名無しさん
垢版 |
2017/07/15(土) 22:24:14.08ID:vkKq60sj
何らかのファイルが足りないとかならまだ判るのですがこのファイルはVCに付属の物ですし構文エラーなどと言われても理解できません
algorithm.cppは一番最初のファイルで全く進まない状態です
ちなみにRubyとOpenCVのビルドは一応通っています(本当に問題ないかは未確認)
C/C++は不慣れでVSの使用経験もあまりないため原因の見当も付かず手詰まり状態です。もし何か判る方がいたら教えてもらえると助かります
0976片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/07/15(土) 22:27:42.35ID:18nkvKxh
readというマクロが悪さをしているようだ。#include順を変えるか#undefしろ。
0978974
垢版 |
2017/07/16(日) 12:18:52.82ID:wcmK4agw
>>976
すみません。その場所の特定ってどのようにすればいいのでしょうか
比較的規模の大きいライブラリですし、インクルードしているファイルだけでもかなりの数になりそうです
ファイルの検索とテキストエディタだけでは追えそうにありません
追跡を支援してくれるツールとかないんでしょうかね・・・
0980デフォルトの名無しさん
垢版 |
2017/07/16(日) 15:16:03.75ID:1O/pViqJ
マクロ展開したソース吐くオプションあったよな

VCならhttp://d.hatena.ne.jp/nurs/20100516/1274020395

1.ソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒
 プロパティ⇒プリプロセッサ⇒前処理済みファイルの生成⇒行番号つきか行番号なしを選択
2.再びソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒コンパイル
 これで、cpp が置かれているのと同じファイル階層に、cppと同じ名前だけど拡張子が.iになってる
 ファイルができてるからそれがそうだよ

gccなら -E
0981デフォルトの名無しさん
垢版 |
2017/07/16(日) 17:55:59.24ID:i1aK64sE
class Kitty {
public:
char *str;
Kitty() { str = "Kitty on your lap\n"; }
Kitty(const Kitty &obj) { str = "Di Gi Gharat\n"; }
} g_obj ;

int main() {
Kitty obj = g_obj;
cout << g_obj.str;
cout << obj.str;
return 0;
}

Kittyクラス終わりのセミコロンの間に変数g_objがあるんですがこれはどういう意味なんですか?
0982デフォルトの名無しさん
垢版 |
2017/07/16(日) 18:11:45.98ID:0XlWr73/
「int i; のセミコロンの前に変数g_objがあるんですがどういう意味ですか」
と訊いているに等しい
0985デフォルトの名無しさん
垢版 |
2017/07/16(日) 18:31:52.76ID:ZbG5GhXO
>>981
Kitty と言うクラス定義とその型を持つ g_obj と言うグローバル変数を同時に定義している
要するに
class Kitty {
...
};
Kitty g_obj;
を一つにまとめてるだけ
0986デフォルトの名無しさん
垢版 |
2017/07/16(日) 18:48:37.09ID:i1aK64sE
>>982 >>984
レスありがとうございます
>>985
わかりやすい解説ありがとうございました
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況