【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
前スレ
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1478440682/ >>554
STLを意識させないためにクラスで包んでるんだろうに
意識させるならパッケージング失敗では? >>556
>あたりめーだ
>真人間ならラップは手段であって目的じゃねーから
ごめん、意味分からん
>計算をミスらないことと演算がオーバーフローしないことだけ注意すんだよ
だから、わざわざvector::size_typeなものをintに変換する必要がないじゃないの
0からmax_size()までの範囲なんだからさ >>557
だからtypedefやusingを使うって話だよ vectorから他の実装に変えたらクラスの仕様も変えるのか? >>559
いちいちメンバ関数ごとに型を定義する?
本気で言ってるの? クラスやメンバ関数ごとに型を定義したら、
それらの数値を複数用いて演算した結果はどうすんの?
まさかauto? クラスが値に関して責任を持つ
当たり前
クラスが値や型に対して責任を持たずにただ値をスルーパスするだけの糞クラスなんかは
ローカルで個人で使う物だけにとどめておきな ただメールを転送するだけの役に立たない糞上司と同じ >>561
?
クラス内に
typedef typename std::vector<T>::size_type size_type
でいいんじゃないの >>565
vector以外のデータは無いっていう前提?
または、クラスで扱うサイズをすべてそれで統一?
仮にそうだとして、
じゃあ別のクラスのsize_typeや他の型と演算した結果はどういう型にするつもり? vectorをそのまま継承した程度のクラスなら、
当然vectorのインターフェースを保つべきと思うよ
今回はvectorはただのデータのひとつ 実装上、たまたまvectorを使っただけ
もしかしたら変えるかも
といった、ごく普通のクラス設計だと仮定した場合の話 てか普通コンテナのサイズはsize_typeでとるだろ
別のクラスのsize_typeもsize_typeで取れ
勝手にintにキャストしてwarningまみれにすんな死ね コンテナはただのクラス内のデータのひとつ
内部の設計事情を外部に出す必要はない >>566
>vector以外のデータは無いっていう前提?
実装を替える必要があるってのは後で作り変えるって意味?それって設計の問題で関係なくね?
静的動的問わずポリモーフィズムするって意味なら最初からそういった設計をするでしょ
今回の話はvectorをラップしているクラスの話でしょ、何で関係ない話を持ち込むの?
>または、クラスで扱うサイズをすべてそれで統一?
size_typeで統一されるならそれでイイんじゃないの?君の言うintに統一と何ら変わらない
それなら内包しているvectorと同じsize_typeを使った方のが余計な記述も減るしバグも減る
>じゃあ別のクラスのsize_typeや他の型と演算した結果はどういう型にするつもり?
それって君の言うint統一でも同じじゃね?
何か話がどんどんズレていない? お前はそれでいいんじゃないか?
intで出せばいいじゃん
他のコンテナと整合取れないから使われないだけで、法に触れてるわけでもないし >>573
私の書き込みの前提は >>568 >>569
クラスの中にvectorやlistや他のコンテナのデータもあるかもしれない
それぞれが、コンテナ独自のサイズの型を定義してるかもしれない
コンテナが返すサイズを加工して返すかもしれない
比較的大きなクラスの話
ただvectorを包んだだけなら当然vectorのインターフェースを継承すべき >>575
何その後出しの仮定
取り敢えず、君が幾らでも解釈を広げていくなら話す意味ないわ
それにそのクラス使いたくないわ
絶対何もかも詰め込んだ糞クラスだと思うわ size_tって何だっけ?
最近c#脳なので忘れた きっと何かのサイズだろう
rsize_tが出てきたあたりで規格を読むのがめんどくさくなった xmlだったかloggerだったかのヘッダオンリーライブラリでsize_t絡みのワーニングを
消そうとintをsize_tに変更すると別の場所にワーニングが出て、そこも直すとまた別
の場所にの繰り返しで使うのやめたことがあった。 インクルードディレクトリの優先順位変えたらうまくいったり http://opencv.jp/cookbook/opencv_img.html#image-resize
ここのソースコードをコピペしてコンパイルしようとしたのですが
関数 `cv::Mat::release()' 内:
test.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47): `cv::Mat::deallocate()' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
このようなエラー文が出てしまいます
使っているOSはdebian stretchです
/usr/include/opencv2には必要なファイルはありました
コンパイルオプションを色々調べて試したのですがうまく行きませんでした
どのようにコンパイルすればいいのでしょうか >>591
エラーメッセージの通り、定義されてない関数を呼んだんでしょ
必要なライブラリをリンクしてないんじゃないの? 解決しました
すみませんでした
ライブラリのリンク方法をきちんと理解してなかったみたいです もちろん、具体的にどうやって解決したかは書きません >>594
-l のあとにopencv_必要なライブラリで解決しました
g++ test.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui 質問です
DLLの中で宣言したvectorを呼び出し側のEXEから使うのにスマートな方法は
どんな方法がありますか? class CFirstClass {
public: virtual const char* GetString() const = 0;
};
class CNinja : public CFirstClass {
public: virtual ~CNinja();
virtual const char* GetString() const;
};
class CMaster : public CFirstClass {
public: virtual ~CMaster();
virtual const char* GetString() const;
};
class CJohnin : public CNinja, public CMaster {
public: virtual ~CJohnin();
};
CNinja::~CNinja(){ }
CMaster::~CMaster(){ }
CJohnin::~CJohnin(){ }
const char* CNinja::GetString() const { return "忍者"; }
const char* CMaster::GetString() const { return "マスター"; }
int main() {
CJohnin johnin;
cout << dynamic_cast<CNinja&>(johnin).GetString() << endl;
cout << johnin.CMaster::GetString() << endl;
return 0;
}
GetStringの戻り値charから*を消したらエラーになるんですが、
これがポインタじゃなければならない理由は何でしょうか? >>599
文字と文字列は違う。C文字列は、ヌル文字で終わる文字配列、または文字の並びへのポインタ。 * は、ポインタ
まさか君は、ポインタを知らないのか?w >>600
>または文字の並びへのポインタ。
これはきちんと理解できてませんでした。大変勉強になりました。ありがとうございます。 >>600
> または文字の並びへのポインタ
お前がポインタを勉強しなおしてこい >>599
>return "忍者"
だから char * で受けないといけない そして リテラルの "文字列" って static で保持しなくていいの? までテンプレ >>603
>文字の並びへのポインタ
をchar**と解釈したのか?
ちょっと気になった
文字の並びの先頭アドレス
でどうだろう >>607
先頭アドレスと言う方が正確だよね。先生と呼ぶのはやめようね。個人崇拝禁止ってルールだから。 文字列リテラルがchar*に勝手に変換されてるのかよ。糞言語だな。 戦国武将を崇拝する事は人●しを崇拝する事になるし、ハッカーを崇拝する事はハッキングを崇拝する事になる。
個人崇拝にとらわれず、正しい道を歩まねばならない。 >文字列リテラルがchar*に勝手に変換
そんなクソ言語はCだけ >>612
char const*なりconst char*ならおk? 日が変わったのね
領海いや了解です
まぁ歴史的理由とは言えクソではある
ROM化するときもどっちだよ?ってな話にはなるね >>613
char[] = "samurai";
はどうなるんだよ。欠陥だらけの言語だな。 char hoge[] = "samurai";
const char hage[] = "harakiri";
無問題 これから勉強しようと調べたら、C#やってたのに、見慣れない文法が俺的に意味不明過ぎて草
取り敢えず書かないとわかんねーなw https://ideone.com/y8mZJo
初心者です
クラスのメンバ変数に別のクラスを持つ場合、
実体かポインタのどちらで持った方が良いのでしょうか?
Data1(別のクラス)、Class1(実体で持つ)、Class2(ポインタで持つ)がその部分です
Class2の方がサイズが小さかったのでこちらの方が良いのですか?
それとも、使う側がメモリ使用量を削減したければ、
使う側がmain関数の変数dやeのような使い方をしてくれるだろう、
ということを期待して、余計なことはせずにClass1のようにするべきですか?
また、ポインタで持つ場合、Data2とClass3のような極端な場合
(実体で持った場合とポインタで持った場合の違いが4バイトしかない)
でもポインタで持つべきですか? この場合は実体で持ったほうがいいと思う
ポインタのほうがサイズが小さいって言ってるけど、あくまでも型のサイズであって使ってるメモリはポインタのほうが多くなってるよ
データがデータを持つクラスと同時に生成され同時に消えるものなら実体のほうが楽だし 既に回答があるけど
実体で持つべきかポインタで持つべきかはもっと複雑な要因で決まる
C++は他の言語と違ってクラスのインスタンスを実体で持てる変わった言語で
それはそれで便利だから基本的には実体で持って構わない
理由はトラブルが無いから
ポインタで持つ場合は、他所から与えられたり、動的に差し変わったり、他所と共有したり
ややこしいことがしたい場合はポインタで持つ
一応「ややこしいこと」の中に君が求めている「サイズを減らしたい」も含まれる
例えば巨大な画像データなどを複数のクラスで共有してメモリ使用量を削減したい場合など
そのようなつもりがないのであれば、実体で持って構わない まあ、まずは意味的な妥当性を考えるべきかな。
よほど大量にオブジェクトを作るのでなければ
少々のメモリ使用量の差なんてどうってことない。
そのクラスで定義したい概念に一致してるかが重要だろう。 >>621
ケースバイケース
実体で持つ利点:
開放漏れやコピーし損ないがない
ポインタで持つ利点:
他の言語と同じ感覚で使える
大きなプロジェクトで再コンパイルの無駄な時間を減らせる みなさんありがとうございます
これからは状況に合わせてどれが適切かどうか考えて実装します
今回(621のコードではない)は、621のコードのようにサイズも小さく、
他のクラスと共有するようなデータを持っているクラスでもなく、
そのメンバを所有しているような概念だったので、
メンバ変数は実体で持つことにしました ポインタで持つと、プログラミングが難しい
ただし、後でインスタンスが作られる場合は、ポインタで持つ。
外側・内側のインスタンスの、寿命が異なる場合 生き死にのタイミングが別・ちょっとずれて欲しい
そういう場合はポインタしかやりよがない?かな? 寿命のタイミングが違うときポインタで持たせるって、
ポインタをnullで初期化してsetterつけるってこと?
そんな糞クラス絶対使わないわ… ↑バカ
>ポインタをnullで初期化してsetterつけるってこと? C/C++の場合、初心者の方がポインタが好きで、多用する傾向があるよね 書店やネットで調べたらポインタの話題が必ず出るし、メモリリークになるから、ポインタ使わないと言語が使えません的な雰囲気があった 低レベルな処理はポインタ必須
上しか書かないなら生で使わないことも可能 >>638
いつも考えるんですけれども低レイヤーでもポインタを使わないことは可能なんでしょうか?ポインタを使わないけれども低レイヤまで対応している言語はなんでしょうか 低レベルな処理でポインタが便利と言われるのはなぜか
言葉で語るのは大変なのでコードで語ろう
hoge *p = (hoge)nanika_no_memory_block;
p->piyo = 100;
これが出来る言語は、あまりない >>641
うわさの rust ではどうでしょうか? 低水準に寄り過ぎると「アドレスを表す整数」だったりして、
(ポインタ相当の操作は可能なものの、)
言語としてのサポートが全然なかったりするので、
ポインタってのは妥当な落としどころだよなー >>641はちょっとコードをミスってしまった
訂正するほどでもないと思うが一応直しておく
hoge *p = (hoge *)nanika_no_memory_block;
p->piyo = 100;
C形式のAPIとの互換性のためにアドレス値が扱える言語は多いが
>>643の言う通り、アドレスを表す整数、ってだけの場合も多い
他の高級言語はオブジェクトに色々な機能を持たせるために
複雑なメモリレイアウトをしているものなので
適当なメモリブロックのアドレスを適当にキャストして
まるで、ネイディブオブジェクトであるかのように扱う、ということが出来にくい
(C++ですら仮想関数テーブルを持っているとアウト)
なので、素のメモリブロックを扱う場合はC/C++のポインタが便利
C言語はナカナカにツボを押さえた設計になっている int main(void) {
int a, b, c;
char x[100] = { NULL };
while (1) {
〜処理〜
printf("終了します。何かボタンを押してください\n");
scanf("%s", x);
if (x != NULL)
break;
else if("\n")
break;
}
return 0;
}
ループを抜ける処理でこんな感じで書いてるんですが
これだと何らかの文字列+エンターキーを押さないと抜けれないんですよね・・・
printf("終了します。何かボタンを押してください\n");
のあとエンターキーを押すだけでもループ終了して終わる方法はないですか? > char x[100] = { NULL };
> if (x != NULL)
Qの炎上学習法か何か? >Q は C++ メインでやってるよ
自分のことQっていうの、キモいぞ c言語で書かれた稼働しているプログラムの中のある変数のアドレスを取得したいです
プログラムを一切変更しないでこれを実現させることはできるのでしょうか? >>652
Windowsなら「プロセスメモリー」で検索。 最適化でレジスタに割りあたっちゃった変数はアドレスとれない >>653
すみません
環境はlinux2.6です ■ このスレッドは過去ログ倉庫に格納されています