5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++なら俺に聞け(入門篇)

1 :デフォルトの名無しさん:2006/10/15(日) 16:37:23
C++の入門者向け解説スレです。

C言語はあってC++が無いのは寂しいので作成

287 :デフォルトの名無しさん:2006/12/22(金) 01:21:25
>>286
可変長配列で使うメモリはどこから取ってくるの?

288 :デフォルトの名無しさん:2006/12/22(金) 01:25:02
スタックじゃねーの?

289 :デフォルトの名無しさん:2006/12/22(金) 01:25:35
多分alloca()に似てるとオモ

290 :デフォルトの名無しさん:2006/12/22(金) 01:41:47
あ、誤解してた。
C99でいう可変長配列は実行時にサイズを決定できる配列のことか。
サイズを動的に変更可能な配列という意味ではないんだね。
それならヒープでなくスタックに領域を取れるね。

291 :デフォルトの名無しさん:2006/12/22(金) 04:33:26
gccだとalloca()で実装されてたりするね。<可変長配列

292 :デフォルトの名無しさん:2006/12/22(金) 07:58:45
すみません、教えてください。
下記のように宣言されてる関数を使いたいのですが
呼び出すとアクセス違反でエラーになってしまいます。

long WINAPI Reset( long Port, long *Sts );

こんな感じで呼び出しています
-----
long *sts;
Reset(1, sts);
----

たぶん第2引数のstsの渡し方が原因と思うのですが、ポインタ関連を理解してないからですかね?



293 :デフォルトの名無しさん:2006/12/22(金) 08:16:28
>>292
Resetがどんな動作かによる
Stsに何かを返すのなら
long sts;
Reset(1, &sts);

294 :292:2006/12/22(金) 09:57:53
>>293
stsはステータスを返すようになってます。
ご指摘のとおりにコーディングしなおしたら無事動きました。
自分のは入れ物を用意してなかったからエラーになったんですね。
ありがとうございました。

あと、もう一つ質問させてください。
このReset()の仕様書をみるとstsに返される値(ステータスワード)の一覧が
こんな感じになっています。

SW1   SW2
E1    00   正常終了
E1    01   エラー
E2    10   待機中

stsはlong型なのでSW1(2バイト)とSW2(2バイト)ということになるのですか?
また、stsからSW1とSW2を切り分けるのはどうすればいいのでしょうか?
本来この関数作った人に聞くべきなんでしょうが、推測でもいいのでよろしくお願いします。

295 :デフォルトの名無しさん:2006/12/22(金) 10:13:04
>>294
上位バイトと下位バイトに分けるんなら
short sw1 = sts&0xFFFF;
short sw2 = (sts>>16)&0xFFFF;
SW1と2でどちらが上位か分からないから逆かもしれん

仕様書とか言ってるってことは仕事?
もしそうならCの基礎も急いで勉強した方がいいような…

296 :292:2006/12/22(金) 13:00:52
>>295
ビット操作ってやつですね。
はい、仕事じゃないです。
趣味です。
勉強がんばります。

297 :デフォルトの名無しさん:2006/12/22(金) 13:05:56
仕事じゃないならのんびり頑張れー

298 :デフォルトの名無しさん:2006/12/22(金) 19:58:28
":"がわかりません。

class m_stack : public stack {
private:
const unsigned int stack_size;
public:
m_stack(const unsigned int size) : stack(size), stack_size(size) { }
}
これで最後の行のm_stack()はclass stackのコンストラクタを
実行し、次にstack_size()を実行するということですか?
どうして{ }の中に記述しないのですか。よろしくお願いします。

299 :デフォルトの名無しさん:2006/12/22(金) 20:04:08
>これで最後の行のm_stack()はclass stackのコンストラクタを
>実行し、次にstack_size()を実行するということですか?
その通り
>どうして{ }の中に記述しないのですか
初期化と代入の違い

300 :デフォルトの名無しさん:2006/12/22(金) 20:04:57
ありがとうございます。おことば、かみしめて考えてみます。

301 :デフォルトの名無しさん:2006/12/22(金) 21:59:51
あの〜、、
演算子のオーバーロードで、インクリメント演算子を
前置と後置用でそれぞれ定義した場合、クラスのメンバにそれぞれインクリメントするようにしたんだけど、
A A::operator ++(){
 this->x++;
 this->y++;
 return *this;
}
A A::operator ++(int nouse){
 this->x++;
 this->y++;
 return *this;
}
例えばob2(1,1)の場合,ob1 = ++ob2;とすると、結果ob1(2,2),ob2(2,2)になるのですが、
ob1 = ob2++;この場合、後置だからob1(1,1),ob2(2,2)の結果にするにはどのようにすればいいですか?
上記だと後置のオーバーロードでもob2++が評価されてから、ob1に代入されてしまいますし・・。

302 :デフォルトの名無しさん:2006/12/22(金) 22:10:09
>>301
コピーを作ってそいつをインクリメントすればよい。
A A::operator ++(int) {
 A temp(*this);
 return ++temp;
}


303 :デフォルトの名無しさん:2006/12/22(金) 22:11:26
追記
前置インクリメントは、戻り値の型をAへの参照型にした上で*thisを返すようにすべき。

304 :デフォルトの名無しさん:2006/12/22(金) 22:18:41
>return ++temp;
これでいいの?

A A::operator ++(int) {
 A temp(*this);
 this->x++;
 this->y++;
 return temp;
}

じゃないかな?と思ったんだけど

305 :301:2006/12/22(金) 22:29:53
>>302
ご返信ありがとうございました。
コピーを作成するのは思いつきませんでした。

>>304
ありがとうございます。無事解決しました。

お二人とも感謝です^^。

306 :デフォルトの名無しさん:2006/12/23(土) 00:16:06
>>304
グハッ、何寝ぼけたことを書いたんだろう俺_| ̄|○
でもさ、こうで良くないか。
A A::operator ++(int) { 
 A temp(*this); 
 ++*this;
 return temp; 


307 :デフォルトの名無しさん:2006/12/23(土) 00:26:25
>>306
それも考えたんだけど
なんか後置式の中に前置式を入れるのヤダったから
変数も2つだけだし
でも拡張性とか考えれば>>306がいいんだろうけどね

あとは>>301の好み次第かな

308 :デフォルトの名無しさん:2006/12/23(土) 01:00:40
Effective C++かなんかにも後置インクリメント・デクリメントは前置版を使って実装しろと書いて張ったはず。

309 :デフォルトの名無しさん:2006/12/23(土) 14:54:36
>>298
stack_size は変数だから、実行するのはおかしいだろ。

stack_size(size) は m_stack のメンバ stack_size を size で初期化している。

310 :デフォルトの名無しさん:2006/12/24(日) 00:12:47
素朴な疑問ですが代入演算子のオーバーロードに virtual をつけるような場面ってありますか?

virtual Foo& operator=(const Foo& foo); ???


311 :デフォルトの名無しさん:2006/12/24(日) 00:30:24
代入演算子は継承されないんだから、仮想にしてもしなくても
同じなんじゃねーの?

312 :デフォルトの名無しさん:2006/12/24(日) 00:42:27
>>311 継承されるような気がするんだが・・・ VC++2005
#include <iostream>
using namespace std;

class Base {
public:
virtual Base& operator=(const Base& base) {
cout << "Base" << endl;
return *this;
}
};

class Sub : public Base {
public:
virtual Base& operator=(const Base& base) {
cout << "Sub" << endl;
return *this;
}
};

void func(Base& base) {
Base a;
base = a;
}

int main() {
func(Base());
func(Sub());
return 0;
}

313 :デフォルトの名無しさん:2006/12/24(日) 02:13:14
311は全てのクラスで暗黙の内に定義されるoperator =が、
基底クラスのoperator =を隠すことを言いたいのだと思う。

314 :デフォルトの名無しさん:2006/12/24(日) 05:47:25
1つのスレッドでいくつものソケットを扱うことってできるのでしょうか?

たとえば、1つのスレッドで何箇所からも同時にダウンロードする とか


ご教授願います

315 :デフォルトの名無しさん:2006/12/24(日) 08:40:32
明らかにスレ違い。
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html

ここでも見ておけ。

316 :デフォルトの名無しさん:2006/12/24(日) 17:50:15
C++って何?

317 :デフォルトの名無しさん:2006/12/24(日) 18:19:34
プログラミング言語の1つ。
Cを基にしており、Cと互換な部分が多いことも売りの1つ。
その一方で、オブジェクト指向プログラミングやジェネリックプログラミングなど比較的最近の
プログラミングパラダイムを取り入れたマルチパラダイムな言語になっている。

こんな感じでいいか?

318 :デフォルトの名無しさん:2006/12/24(日) 19:47:48
C言語はじめてみたいと思っていますが、
CとC++ってどちらを選んでよいのかわからないのですが、
どのように選んだらよいでしょうか。

319 :デフォルトの名無しさん:2006/12/24(日) 20:01:49
12月24日にそんなカキコミをするような奴はCだろうがC++だろうが
やっても負け組み決定。

良くて半可通じゃね??

320 :デフォルトの名無しさん:2006/12/24(日) 20:26:48
>>319
なんで?

321 :デフォルトの名無しさん:2006/12/24(日) 20:35:06
>>319
12月24日に2ちゃんねるやってるあなたも負け組みなんでしょ?

322 :デフォルトの名無しさん:2006/12/24(日) 20:35:58
ちょっと中腰でタイプさせてもらうがすまん
今からパーティ行かなきゃならんのでレスできませんよ。

323 :デフォルトの名無しさん:2006/12/24(日) 20:40:56
>>322
妄想御疲れ様です。

324 :デフォルトの名無しさん:2006/12/24(日) 20:49:55
C++ばっかりやってると頭がおかしくなりますよ。

325 :デフォルトの名無しさん:2006/12/24(日) 23:28:16
C++やってると、Kusakabe氏に遊んでもらえませんよ。

326 :デフォルトの名無しさん:2006/12/26(火) 15:08:24
>>322
Mr.BATERや!

327 :デフォルトの名無しさん:2006/12/29(金) 20:34:21
C++で入出力に関するライブラリを使用する際、
iostream系とstdio系を混ぜないようにとはよく言われるのですが、
C++でstdioではなくiostreamを使用する積極的な理由とはなんでしょうか?
別に積極的とは言わないまでも、こういう理由からstdioではなくて
iostreamが必要という回答があれば教えてください。

328 :デフォルトの名無しさん:2006/12/29(金) 20:36:24
>>327
printf()だとクラスの入出力が面倒くさい、あるいはできない。
ストリームなら、多重定義によってコンパイル時に自動判別
してくれるのでとても助かる。

逆に組み込み型の入出力しかしないなら、printf()とscanf()だけの
方がいいと思う。現時点では。

329 :デフォルトの名無しさん:2006/12/29(金) 20:48:51
328の言うような「こっち側」だけでなく、
「あっち側」もiostreamでは自由度が高い。

ストリームバッファクラスを書けば、
ファイルやメモリに限らずどんなものに対しても入出力できるようになる。

330 :デフォルトの名無しさん:2006/12/29(金) 20:54:11
コンソール画面に、複数の項目を表示し、
方向キーでいずれか(1つ)の項目を選択させ、
選択された項目を下のように括弧( [ と ] )で囲みたいです。
※ 画面に表示される項目はvectorになっており(vector<string>)、
pop_backすることで、項目の数は、変動します。
全通りのパターンを書く以外に何かいい方法があれば教えてください!!

例) 項目数が9で[メニュー4]を選択した場合の表示

メニュー1 メニュー2
メニュー3 [メニュー4]
メニュー5 メニュー6
メニュー7 メニュー8
メニュー1 メニュー2
メニュー9

(横2列で表示)

331 :デフォルトの名無しさん:2006/12/29(金) 21:18:09
率直に考えたらこうなったが問題あるか?ただしコンパイル・実行は全く行っていない、悪しからず。
typedef std::vector<std::string> MenuItem;

void ShowMenu(MenuItem item, MenuItem::size_type selected)
{
& using std::cout;
& for (MenuItem::size_type i = 0; i < menuItem.size(); ++i)
& {
& & if (i == selected)
& & & cout << '[';
& & cout << item[i];
& & if (i == selected)
& & & cout << ']';
& & cout << (i & 1 ? '\t' : '\n');
& }
}

332 :デフォルトの名無しさん:2006/12/29(金) 21:30:08
>>331

>率直に考えたらこうなったが問題あるか?ただしコンパイル・実行は全く行っていない、悪しからず。

いいえ。問題なんてとんでもない。利用させていただきます。
ありがとうございました。

333 :デフォルトの名無しさん:2006/12/30(土) 01:48:34
C++はスレッドとかGCとか標準GUIライブラリの
規格化はしないの?

334 :デフォルトの名無しさん:2006/12/30(土) 01:50:01
>>333
C++の設計と進化を読め。

335 :デフォルトの名無しさん:2006/12/30(土) 02:07:57
istream& operator>>(istream &,const char *)
の定義をヘッダでするとリンクエラー吐くのは何故?in .net2003
cppファイル内なら通るんだけど


336 :デフォルトの名無しさん:2006/12/30(土) 02:19:06
>>335
俺のエスパー値が低くてわからないので、
症状が再現する最小限のコードを晒してくれ。

86 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)