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

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

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

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

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

2 :デフォルトの名無しさん:2006/10/15(日) 16:58:40
2げと

3 :デフォルトの名無しさん:2006/10/15(日) 17:00:43
上げ

4 :デフォルトの名無しさん:2006/10/15(日) 18:40:25
相談室と初心者スレで十分だなぁ。

5 :デフォルトの名無しさん:2006/10/15(日) 20:31:12
Cが全角で+が半角なのはいただけないな。半角に揃えろよ。
まあでもこのスレは要らないだろ。

【初心者歓迎】C/C++室 Ver.32【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1160893851/l50
はきだめC/C++下級者の質問箱 2
http://pc8.2ch.net/test/read.cgi/tech/1156206091/l50


6 :デフォルトの名無しさん:2006/10/22(日) 21:15:58
あげあげ

7 :デフォルトの名無しさん:2006/10/23(月) 16:37:15
ファイルの内容全部を
バイナリ入力する
場合は、どう書けば良いですか?
char型の配列に入れてしまいたいです。

8 :デフォルトの名無しさん:2006/10/23(月) 17:03:30
バイナリモードで開いた上で、istreambuf_iterator

9 :デフォルトの名無しさん:2006/10/23(月) 23:03:50
>>8
ありがとうございます。
↓このページの最後のほうに例があったのでやってみます。
ttp://www.io.nara-su.ac.jp/kanrishitsu/manual/FSUNf90/LANG/japanese/C++/stdlib/stdref/ist_1762.htm

ちなみにistreambuf_iteratorというのを初めて知ったんですが、
このやり方が一番簡素に記述できて、速度も最速かどうかは
分からんが、無駄はないはずだ。というような解釈で良いでしょうか?

10 :デフォルトの名無しさん:2006/10/23(月) 23:23:18
実行効率という観点からは多分無駄はあると思うが・・・
ポータブルだし簡素ではあるけど。

11 :デフォルトの名無しさん:2006/10/23(月) 23:57:52
C++初心者です。

C言語の知識で波形解析プログラムのソースを作りました。
このままではコマンドプロンプトでしか起動できないので、
今度はオブジェクト指向にならってGUIを実装させ、アプリケーション
と言えるような代物にしたいと思ってます。

しかし、ソースが巨大でこれからどうすればいいか途方にくれてます。
いろいろ参考書を見てオブジェクト指向やUMLを勉強していますが
扱い方がいまいちわかりません。

アプリ開発の一連の流れを具体的に解説してくれるような書籍なんて
ないでしょうか?


12 :デフォルトの名無しさん:2006/10/24(火) 00:01:46
>>11
統合開発環境を選んで、そのマニュアルやチュートリアルを読むといいよ。

あと、オブジェクト指向と GUI とは、親和性は高いのは確かだけど、直接は関係ないよ。

13 :デフォルトの名無しさん:2006/10/24(火) 00:02:07
Windowsプログラミング本の定石

> Win32APIを使うなら
> Visual C++(1)はじめてのWindowsプログラミング 翔泳社
> ↓
> Windows 2000プログラミング標準講座 翔泳社
> ↓
> プログラミングWindows 第5版(上)(下) アスキー
>
> MFCを使うなら
> Visual C++(1)はじめてのWindowsプログラミング 翔泳社
> ↓
> Visual C++(2)はじめてのオブジェクト指向プログラミング 翔泳社
> ↓
> Visual C++(3)はじめてのMFCプログラミング 翔泳社
> ↓
> 標準講座MFC6.0 翔泳社
> ↓
> MFCによるWindowsプログラミング アスキー
> ↓
> プログラミング Microsoft Visual C++ .NET Vol.1 基礎編、Vol.2 活用編 日経BPソフトプレス
> (MFCによるWindowsプログラミングがあればVol.2だけでもよい)
> ↓
> MFCインターナル アジソンウェスレイパブリッシャーズジャパン
>
> スレッド関係
> Advanced Windows 改訂第4版 アスキー
>
> サーバー関係
> プログラミング Microsoft Windows 2000 日経BPソフトプレス

14 :デフォルトの名無しさん:2006/10/24(火) 00:02:50
SDLを使うと楽だよ。

15 :デフォルトの名無しさん:2006/10/24(火) 00:14:06
>9
vector使ってよければ、これだけで済む。ややごちゃごちゃした印象は拭えないが。
std::ifstream inputFile("infile", std::ios_base::binary);
std::vector data(std::istreambuf_iterator<char>(inputFile.rdbuf()), std::istreambuf_iterator<char>());

>11
オブジェクト指向とGUIに直接の関係性は何もない。
ただ相性が良いからGUIプログラムにオブジェクト指向が良く使われているだけ。

お前に必要なのはおそらくGUIプログラミング。
WindowsならWindowsプログラミングとかを謳っているような本を選べ。

16 :デフォルトの名無しさん:2006/10/24(火) 00:15:57
Turbo C++ なんてどうだ?
楽にGUIを組めるよ。


17 :デフォルトの名無しさん:2006/10/24(火) 00:54:23
>>12-16
ありがとうございます。

GUIって聞くとオブジェクト指向って観念を持っていました。

僕は学生なのですが、学校のPCにはVisualC++6.0が入っているので
これを使っていきたいです。

13さんのあげてくださったプログラミング本を参考にさせていただきます。

>>15
すみません、vectorについて教えてください。











18 :デフォルトの名無しさん:2006/10/24(火) 00:56:24
>>17
人に聞く前に自分で調べろ。

19 :デフォルトの名無しさん:2006/10/24(火) 03:43:51
VB辺りでGUIだけ作って、現行コマンドライン版アプリを起動すればいいような気がする。

20 :7 & 9:2006/10/24(火) 16:47:10
>> 10
了解しました。

>>9で挙げたサイトの例では最後に

while( !iter.equal(end_of_stream_iterator) )

// operator++とoperator*の両方を使用する
cout << *iter++;

という記述があり、そこで全てのストリームを標準出力
しているのだと思いますが、標準出力ではなく、
charに入れておきたい場合、どうすれば良いですか?
(Cの基礎みたいな話になってしまってすいません。)
初めにファイルサイズが分かれば charをその分配列で
確保してから

int i = 0;
while( !iter.equal(end_of_stream_iterator) )
char[i] << *iter++;

と書けば良いのでしょうか?
だとすれば、スマートにファイルサイズを得る方法は
あるのでしょうか?それともループ回数をカウントして
サイズを調べるのでしょうか?

21 :デフォルトの名無しさん:2006/10/24(火) 18:23:20
>>20
大きさを知りたいだけなら、ファイルの終わりまでシークしてtellpを呼べばいい。
中身を読み込むために大きさを知りたいのなら、>15。そもそも大きさを知る必要がない。
std::vectorは単なる動的配列で、その使い方は大したことない。

22 :デフォルトの名無しさん:2006/10/24(火) 20:44:11
ずっとVB6.0でゲームを作っていたのですが、そろそろC++に移行したいと考えてます。
ただ、VC++6.0が中古なんかで安く売ってますが……
やはり、最新のVC++2005の方が初心者としても扱いやすいのでしょうか?

C++2005 Suiteなんかもありますが……どれがもっとも扱いやすいのでしょうか?
VB5.0とVB6.0でも、使ってみると結構あちこち違いがありましたので、
C++でもそういったことがあるのではないかと……。

プログラミング以前の問題ですみませんが、よろしければ教えてください。


23 :デフォルトの名無しさん:2006/10/24(火) 21:36:48
C++自体は、ISOが標準を定めており、それは1998年に制定されてからほとんど変わっていない。
VC++は版を重ねる度にその標準へ準拠している度合いが高まっている。

もちろん最近のVC++は、.NETへ対応できるようになっているが、
VB-VB .NETの断絶とは違い、標準C++のソースはそのままコンパイルできるようになっている。

24 :デフォルトの名無しさん:2006/10/24(火) 21:59:19
>>22
Expressがタダなんだからまずそれを試せばいい
MFCがないが、ゲームなら要らないだろう

25 :デフォルトの名無しさん:2006/10/24(火) 22:46:40
#include <iostream>
using namespace std;

int main()
{
int num;
int* pT;

cout << "何人のテストの点数を入力しますか?\n";

cin >> num;

pT = new int[num];

cout << "人数分の点数を入力してください。\n";

for(int i=0; i<num; i++){
cin >> pT[i];
}

for(int j=0; j<num; j++){
cout << j+1 << "番目の人の点数は" << pT[j] << "です。\n";
}

delete[] pT;

return 0;
}
このコードでポインタpTがcin >> pT[i];のところで点数を記憶してますが、
ポインタを配列名に使えるのでしょうか?ポインタはアドレスを格納する変数なのに整数値を記憶できるのでしょうか?

26 :デフォルトの名無しさん:2006/10/24(火) 23:12:46
ポインタに対して、*の間接参照演算子ではなく、
配列のように[]の添え字演算子を利用することができる。

ポインタの場合、p[i]は*(p + i)と同じ。

27 :7 & 9 & 20:2006/10/24(火) 23:40:14
>>21 、15

すいません、15さんのアドバイスにに気が付きませんでした。
ありがとうございました。
しかしvectorの使い方と言えば、
vector<chara> vChar
vChar.push('a');
というように、テンプレートとして<>を書いて使うものしか知りません。
実際、例の2行目の
std::vector data(std::istreambuf_iterator<char>(inputFile.rdbuf()), std::istreambuf_iterator<char>());
をコンパイルすると
「クラステンプレートを利用するにはテンプレート引数リストが必要です」
というエラーが出るのでてしまうのですが、どうすれば良いのでしょうか?

28 :デフォルトの名無しさん:2006/10/24(火) 23:44:46
std::vector<char>の間違いだろうな。

29 :デフォルトの名無しさん:2006/10/25(水) 00:48:11
std::vector<string>を使おう

30 :デフォルトの名無しさん:2006/10/25(水) 01:44:42
>>29 ここでは要らんだろ。

31 :デフォルトの名無しさん:2006/10/25(水) 01:45:16
>>27
エラーメッセージ嫁よ。

32 :デフォルトの名無しさん :2006/10/25(水) 03:09:15
class ClassA{
public:
ClassA(){・・・・;}

friend ClassA operator●(const ClassA& x, const ClassA& y)
{
・・・・;
}
}

class ClassB{
public:
operator ClassA(){return ・・・・;}
}

で引数x,yにClassB型の値が代入された場合、x,yはClassAのコンストラクタによってClassA型に
変換されるのでしょうか? それともClassBの変換関数によってClassA型に変換されるのでしょうか?

33 :デフォルトの名無しさん:2006/10/25(水) 03:18:06
>>32
ClassA のコンストラクタは引数なしのものしか宣言されていないので
ClassB → ClassA の変換はできない。というわけで、おそらく
変換関数の戻り値によって初期化される。

34 :デフォルトの名無しさん :2006/10/25(水) 03:56:22
>>33
早々の回答ありがとうございます。

つまり、(デフォルト)コンストラクタについてはオブジェクトを新たに作成したり[ClassA x]、意図的に
使わない限り[ClassA* x=new ClassA()]呼び出されることはない・暗黙に呼び出される場面はないと考え
ればよいのでしょうか?

35 :32:2006/10/25(水) 04:29:04
>>33
失礼しました。回答の内容取り違えてました。

ClassA のコンストラクタは引数なしのものしか宣言されていない
=ClassA内に「ClassA(ClassB c){・・・・;}」というコンストラクタが存在しない

という意味ですよね。申し訳ありません。ちなみに、このコンストラクタが
ClassA内に存在した場合も結果は同じになるのでしょうか? 連続質問で誠に
恐縮です・・・。

36 :22:2006/10/25(水) 08:36:25

>>23
え? VC++とVC++.NETというのは、別のものだったのですか?
VC++.NET 2003の時期バージョンが、VC++2005だと思ってました……。

>>24
Expressは、MFCがないだけの違いだったのですか。
確かに、それならまずはExpressから試してみようかと思います。

ただ、C++ Builderというのが、VBと同じRADで、VC++よりコンパイラが
速いと聞いており、とっつきやすいかなとも思っているのですが……
やはり一般的なのはVC++なのでしょうか?
C++では、ゲームはDirectXをメインに使っていこうと思っているので、
RADはあまり必要ないかとは思うのですが……。

37 :デフォルトの名無しさん:2006/10/25(水) 09:52:19
>VC++よりコンパイラが速い

幻想にして幻覚。
コードの内容にも寄るが、最適化性能でVCの右に出るコンパイラはまずない。
最適化を最大の売りにしてるICCですらほとんど勝てない有様。
コンパイル速度のことを言ってるならそうかもしれないが、それほど膨大なコードを書くわけでもあるまい。

38 :22:2006/10/25(水) 13:37:50
>>37
すみません、確かにコンパイル速度のことです。
ゲームプログラミングの本で、C++ Builderのコンパイラが付属していたりしたので、
VC++と比べてどちらがよいか迷っていたのです。
雑誌やネット記事には、長所ばかりが書いてあって、具体的な問題点などが書いてないので、
どうにもどれもこれもがよいように見えてしまって……。
ですが、やはりここは一般的なVC++の2005Expressから入って、じっくり勉強してゆこうと思います。
ありがとうございました。

39 :デフォルトの名無しさん:2006/10/25(水) 17:04:16
>>36
> VC++.NET 2003の時期バージョンが、VC++2005
これは間違っていないが、VC++ 2005も.NETプログラミングに対応している。
VB 2005も.NETと付いていないものの、プログラミング言語としてはVB .NETであることと同じ。

40 :22:2006/10/25(水) 18:51:35
>>39
話がのびてしまうのですが、たとえばネット対戦のゲームを作成しようとした場合は、
.NETの、.NET Frameworkを利用したほうが作りやすいものなのでしょうか?
.NET Frameworkで作ったソフトは、配布する際、その環境に、.NET Frameworkが
インストールされている必要があるとかで、ゲームにはあまり利用されていないようですが、
今後はゲーム制作にも多く利用されていくようになるのでしょうか?
それとも、やはり現在一般的なVC++&DirectXの環境が最適なのでしょうか?

どうにも、.NETの利便性がいまだによく掴めないままでいるのです。
今後は何もかもが.NETの時代だと、あちこちでは言われているようなのですが……。
よろしければこの点についても教えてください。

41 :25:2006/10/25(水) 19:11:42
>>26
お礼遅くなりました。ありがとうございます
つまり配列名がポインタ名だった場合、それは*(p+i)を意味するということでよろしいのでしょうか?


42 :デフォルトの名無しさん:2006/10/25(水) 20:13:49
>>37
Borland のほうがコンパイルが速いってのはガチ。

>それほど膨大なコードを書くわけでもあるまい。

コンパイルに 1 秒かかるのと 5 秒かかるってのでは差はデカイぞ。
コンパイル速度に差がありすぎるから、俺はコンパイラ非依存なコードを書くとき
開発中は主に Borland を使う。もちろんリリース版のコンパイルには VC++ を使うが。

43 :デフォルトの名無しさん:2006/10/25(水) 20:20:52
Boostの一番おいしいところが使えないBCCはカス

44 :デフォルトの名無しさん:2006/10/25(水) 20:40:00
>>41
そういうこと。
実は、式の中で配列は原則その先頭要素を指すポインタに変換される規則があり、
逆に配列に対しての添え字演算子を使った場合も、その式は成り立つ。

45 :デフォルトの名無しさん :2006/10/26(木) 02:15:34
C++板盛り上がれ〜♪

46 :デフォルトの名無しさん:2006/10/26(木) 02:16:46
>>42
1秒と5秒の差が問題になるほどコンパイルするのか?
普通は入力やデバッグに対して充分無視できる程度しかコンパイルしないと思うのだが。

47 :デフォルトの名無しさん:2006/10/26(木) 02:21:02
>>46
感覚の問題だから実際にやってみてもらわんとわからんと思う。
Windows のデスクトップを右クリックした時にポップアップメニューがでるまでに
ちょっとでも待たされたら嫌だろ? それと同じような感じ。

48 :デフォルトの名無しさん:2006/10/26(木) 02:29:21
そもそも最適化なしでコンパイルして、5倍も速度差がつくのだろうか。
まさか、最適化しつつ遅いなんて無意味なことを言うわけもないとは思うのだけどね。

49 :デフォルトの名無しさん:2006/10/26(木) 02:46:13
コンパイル時間の話題はもういいよ。

50 :デフォルトの名無しさん:2006/10/26(木) 03:14:12
>>25
おぬし、拙者と同じ棒用派だな?(笑)
俺もその本にはとても世話になったよ。

51 :デフォルトの名無しさん:2006/10/30(月) 19:54:50
俺に聞け〜

52 :デフォルトの名無しさん:2006/11/20(月) 04:34:06
for(;; p_turn = !p_turn){

とはどう言う意味でしょうか?

あと
for(;;)と言うのも参考書に載っていますが
意味がわかりませんので
これら二つの、ご助言を宜しくお願い致します。

53 :デフォルトの名無しさん:2006/11/20(月) 06:23:13
>>52
do while (p_turn = !p_turn); と同じ。
それから
for(;;)は while (1) と同じ

54 :デフォルトの名無しさん:2006/11/20(月) 06:45:36
http://pc8.2ch.net/test/read.cgi/tech/1162999861/487-

55 :デフォルトの名無しさん:2006/11/20(月) 11:12:01
マルチかよ死ねカス

56 :デフォルトの名無しさん:2006/11/20(月) 13:09:21
>>53
有難うございました。

>>54-55
それを書いたの私ではありません、私以外の誰かがしたことです。
それを、"マルチかよ死ねカス" なんて酷い

57 :デフォルトの名無しさん:2006/11/20(月) 13:15:27
>>56
そう思うんならそこ行って「これは私ではありません」と書いてこいや

58 :デフォルトの名無しさん:2006/11/20(月) 19:12:30
>>53
違くね?
for (初期化式; 継続条件式; 再初期化式)じゃねーの?
for(;; p_turn = !p_turn)
これだと初期化なし、条件式なしで再初期化時に p_turn の否定を p_turnに入れてるだけじゃねーの
p_turn = !p_turn は比較演算じゃない、否定を代入してるだけ
つまり
while (1){
p_turn = !p_turn;
・・・・
・・・・

だろ


59 :58:2006/11/20(月) 19:13:35
違った
while (1){
・・・・
・・・・
p_turn = !p_turn;

こっちだな



60 :デフォルトの名無しさん:2006/11/20(月) 20:33:46
神様教えて
継承したクラスで、

class A{
private:
int data;
public:
int DataCal(){
return data*2;
}

 int getData(){
return DataCal();
}
 
 ・・・
}

みたいのがあるときに、継承クラスでDataCalをオーバーライドしたとすると

class B :public A{
public:
int DataMod(){
return data*3;
}
 ・・・
}

このときってgetDataもオーバーライドしないといけない??

61 :デフォルトの名無しさん:2006/11/20(月) 20:40:05
>>60
のー

62 :デフォルトの名無しさん:2006/11/20(月) 20:42:29
DataCalをオーバーライドしているようには見えないな。

ぶっちゃけvirtualつけろって話。

63 :デフォルトの名無しさん:2006/11/20(月) 20:46:22
あ、みすった_| ̄|○

class A{
private:
int data;
public:
int DataCal(){
return data*2;
}
 int getData(){
return DataCal();
}
 
 ・・・
}

class B :public A{
public:
int DataCal(){
return data*3;
}
  ・・・
}

です。

>61
getData()はオーバーライドしなくても、
class BでオーバーライドされたDataCal()が使われる?

64 :デフォルトの名無しさん:2006/11/20(月) 20:48:31
これはひどい
オーバーライドではなくて隠蔽だろう

65 :61:2006/11/20(月) 20:49:00
getData() は virtual 宣言したほうがいい

A *a;
B b;
a = &b;
a->getData() は
クラスAのgetData()が呼ばれる

66 :デフォルトの名無しさん:2006/11/20(月) 20:56:42
>>65
知ったか乙

67 :デフォルトの名無しさん:2006/11/20(月) 20:58:20
まぁ、とにかく
virtual調べてきます_| ̄|○

68 :61:2006/11/20(月) 21:06:37
ぶりぶり

69 :デフォルトの名無しさん:2006/11/20(月) 21:47:07
つまり、こうだな。
do {...; } while (p_turn = !p_turn, 1);

70 :デフォルトの名無しさん:2006/11/20(月) 22:40:43
>>63
俺もまだ未熟だから詳しいことはいえないんであれだが・・・
オーバーロードとか意味間違えてるんじゃないのか?

たぶんおまいさんがやりたいことを実行するなら、
DataCalを仮想化しないとだめだろ。

継承、オーバーロード、仮想化っていうのをいまいち理解してないと思うんだが。

71 :デフォルトの名無しさん:2006/11/20(月) 22:53:15
>>69
TRUE

72 :デフォルトの名無しさん:2006/11/20(月) 22:53:53
追加
>>61
getDataを仮想化する理由が意味不明。
むしろこのクラス設計なら絶対仮想化しちゃいけない。

73 :デフォルトの名無しさん:2006/11/20(月) 22:55:05
>>71
それはなに?
#c99ならtrueだろ、ってのは判らんでもないが。

74 :デフォルトの名無しさん:2006/11/20(月) 22:56:12
あー>>61すまねええ。俺が間違ってたorz
よく見たらめちゃくちゃやってるな・・・>>63よ・・・

getDataとか関数に名前与えてるのに中身に余計な関数書くんじゃねえよ。
命名規則ぐらいちゃんとしてこいや。

75 :デフォルトの名無しさん:2006/11/20(月) 23:34:31
>>74
>>61だけど
>>65は勘違い...スマソorz

>>63
んでvirtualにすんのはA::DataCal();
そうしないとA::getData()がよばれるがA::getData()内のDataCal()はA::DataCal()を呼び出す
virtualにすればA::getData()はB::DataCal()を呼び出すようになる
とA::dataはBからアクセスできないんじゃないか?Aのプライベートメンバだし
protectedで宣言しなきゃいかんのでは?

76 :デフォルトの名無しさん:2006/11/21(火) 01:20:01
初心者には親切にね。

77 :デフォルトの名無しさん:2006/11/21(火) 01:55:06
>>75
>>63の場合作法の段階から間違ってると思うんだよね・・・。

getData()を行うならば、
そいつはプライベートからdataの値を取ってくるだけにするべきなのに、
そうではないし。

スマートに書こうとすればこうなるはず。

classA側の処理
int& getData() { return data; }

classA, classBのDataCal処理
virtual int DataCal() const { 各々の処理; return 返したい値; }

コレならすっきりしてわかりやすいと思うんだけど。

78 :デフォルトの名無しさん:2006/11/21(火) 01:59:05
getData側にconst入れ忘れた・・・。訂正。
const int& getData() const { return data; }

79 :デフォルトの名無しさん:2006/11/21(火) 14:34:01
const int& なんて戻り値使うのはマトモなアプリ書いた/読んだことのない奴だけ。
荒らしっぽいレスですまんが、老婆心からのコメント。

80 :デフォルトの名無しさん:2006/11/21(火) 15:32:04
>>79
戻り値変数でもまったく問題ないけど、
ちょっと今回は思うところもあって、俺は参照でもいいと思うんだけど。

クラスAにはint dataっていう変数を持ってるのは確実、
内部でgetData()*2という計算をDataCal()で持とうとしている。
そんな理由でconst int&にしたんだけど間違ってだろうか?

普通の代入の場合は参照の値のコピーが行われるからint getData();と同じように振舞うしさ。

81 :80:2006/11/21(火) 16:31:32
あ、ちなみに今回に限りなのでそこは忘れないでくださいな(;´Д`)

82 :デフォルトの名無しさん:2006/11/21(火) 16:34:20
そんな理屈こねくり回すまでもなく、ポインタサイズ以下の基本型をconst参照で返す奴は普通逝け沼。
外にどうしてもアドレス公開したいのなら別だが、そういうコードが求められる状況はかなりぬるぽ。

83 :デフォルトの名無しさん:2006/11/21(火) 16:40:13
正直const参照が求められる状況ってのは、
まあ読み込んだ3Dオブジェクトを利用するとかいう大量データを扱う時なんだけどさ(;´Д`)

まあ変に屁理屈書いてすまん。

84 :デフォルトの名無しさん:2006/11/21(火) 17:40:38
>>82
ポインタサイズ以下の基本型なんてのを意識するのはGenericとはいえんな
そんなのはコンパイラの仕事だ

85 :デフォルトの名無しさん:2006/11/21(火) 17:45:48
>>84
Generic な人でもいつかどこかで int くらい使うだろ。

86 :デフォルトの名無しさん:2006/11/26(日) 19:07:40
C++でmakeは必須?

87 :デフォルトの名無しさん:2006/11/26(日) 19:56:21
>>86 いいえ

88 :デフォルトの名無しさん:2006/11/26(日) 20:47:09
>>86

でも、知ってて損はない

89 :デフォルトの名無しさん:2006/11/27(月) 02:43:53
だが時代遅れ。

90 :デフォルトの名無しさん:2006/11/27(月) 03:09:45
C++が?

91 :デフォルトの名無しさん:2006/11/27(月) 04:28:33
それもある。

92 :デフォルトの名無しさん:2006/11/27(月) 06:13:20
処女のように清らかで美しいソースが見たいです
あまり実用的でなくてもいいです
どこか参考になるところはありませんか?

93 :デフォルトの名無しさん:2006/11/27(月) 09:51:01
C++自体が既に非処女言語なので無理

94 :デフォルトの名無しさん:2006/11/27(月) 13:03:26
>>92
機械語

95 :デフォルトの名無しさん:2006/11/27(月) 16:31:39
>>92
Whitespace

96 :デフォルトの名無しさん:2006/11/27(月) 19:54:12
>>95
それは処女も中身は汚いってこと?

97 :デフォルトの名無しさん:2006/12/03(日) 08:36:26
最近C++初めました、Cのコードはそこそこ読めて、書けます
クラスの概念がよくわかりません
入門書では、車(オブジェクト)に対してハンドル、タイヤetc(メソッド)の関係のように
比喩した解説が多いのですが分かり辛いのですが
要するにCのtypedefやenumのような構造体と同じだと思うのですが
そのように理解してもOKですか?
簡単な事を難しく解説して初心者をかく乱している気がするのですが・・・・・

98 :デフォルトの名無しさん:2006/12/03(日) 09:01:48
> 簡単な事を難しく解説して初心者をかく乱している気がするのですが
そのとおり。

99 :デフォルトの名無しさん:2006/12/03(日) 09:07:07
初心者が簡単に理解できるように比喩を使って解説しているわけだが
分析・設計段階の話なので実装のことは考えないほうが吉。
データベースの正規化が自分の感覚としては近いかな。

100 :デフォルトの名無しさん:2006/12/03(日) 10:46:32
>>99
>>97です
>>データベースの正規化が自分の感覚としては近いかな。
あたらずしも遠からずって事で納得しました。

101 :デフォルトの名無しさん:2006/12/03(日) 15:42:13
>>98
×そのとおり
○そのとおり
>>100
×あたらずしも遠からず
○当たらずとも遠からず

>>97
実装上は、C++のクラス ≡ C++の構造体 ⊃ Cの構造体、
C++の構造体 ≒ Cの構造体+(その構造体に関与する)関数。

継承だとかテンプレートだとかは脇に置いて、取り敢えず
Cで構造体とそれを操作する関数を纏めたものがクラスって認識で医院で内科医?

102 :デフォルトの名無しさん:2006/12/03(日) 18:56:01
そのとおりはそのとおりだろ。

103 :デフォルトの名無しさん:2006/12/03(日) 20:12:05
そのとおりだね。

104 :デフォルトの名無しさん:2006/12/03(日) 22:24:03
>×そのとおり
>○そのとおり

吹いた。馬鹿だ。

105 :デフォルトの名無しさん:2006/12/04(月) 01:52:03
その通り!!

106 :デフォルトの名無しさん:2006/12/04(月) 18:14:50
そ の と お り !!!!

107 :デフォルトの名無しさん:2006/12/06(水) 22:33:00

オーバーライドされる関数にvirtualを指定したりしますが、なぜですか?
別にvirtualを指定しなくてもオーバーライドできますよね?

教えてください。


108 :デフォルトの名無しさん:2006/12/06(水) 22:38:57
仮想関数でぐぐれ

109 :デフォルトの名無しさん:2006/12/06(水) 22:43:04
>>108


その回答は意味が無い。


110 :デフォルトの名無しさん:2006/12/06(水) 23:01:52
>>107
派生クラスがオーバーライドするんだと言う意思表示だと思えばいい。

111 :デフォルトの名無しさん:2006/12/06(水) 23:12:45
>>107
とりあえず仮想関数とかでぐぐってみ

112 :デフォルトの名無しさん:2006/12/06(水) 23:17:38
基底クラスにvirtualがなかったらただの隠蔽だな

113 :デフォルトの名無しさん:2006/12/06(水) 23:45:57
ちょうどサンプルがあった。
#include <iostream>

class A { public: void func() { std::cout << "A::func()" << std::endl; }}; 
class B : public A { public: void func() { std::cout << "B::func()" << std::endl; }}; 

class C { public: virtual void func() { std::cout << "C::func()" << std::endl; }}; 
class D : public C { public: void func() { std::cout << "D::func()" << std::endl; }}; 

int main() {
    A *a = new B(); a->func();
    C *c = new D(); c->func();
    return 0;
}


114 :デフォルトの名無しさん:2006/12/06(水) 23:48:33
virtual付けないとコンパイル時に結合(静的結合)されてしまうので
実際の型に応じた関数を呼び出してくれないという例か

115 :デフォルトの名無しさん:2006/12/07(木) 15:21:36
派生クラス側のメンバ関数の宣言にもvirtual を付ける流儀が多いようだがそれはなぜか、
という質問かと思った。


116 :デフォルトの名無しさん:2006/12/07(木) 19:23:47
>>115
いや、そういう質問だろう。多いというわけじゃなくて、まちまちなのが気になってるみたい。

117 :デフォルトの名無しさん:2006/12/07(木) 21:12:21
>>107にはオーバーライドされる関数とあるが、それが基底クラスのもの
かどうかは書いてないので、どっちの話題かは確定できないな。

118 :デフォルトの名無しさん:2006/12/07(木) 22:28:41
>>117
いや、基底クラスのものだったら(virtual付けないと)オーバーライドできないんだから、
>>107みたいな質問は出ないでしょ。
よって、派生クラス側のメンバ関数に付けるvirtualのことかな。

119 :デフォルトの名無しさん:2006/12/07(木) 23:09:15
C++の関数の引数の質問で、しょぼいんですがお願いします><;


int hogehoge[10];

func( hogehoge );

void func( int b[] ){
}

と書いた場合、int bは
int* b ですか?それとも int* &b ですか?

120 :デフォルトの名無しさん:2006/12/07(木) 23:18:18
>>119 int* b

121 :デフォルトの名無しさん:2006/12/07(木) 23:24:01

基底クラスかどうかなんてわかるの?


122 :デフォルトの名無しさん:2006/12/07(木) 23:24:46
>>119

int& b

123 :デフォルトの名無しさん:2006/12/07(木) 23:28:51
>>119
void func( int b[] ){ }

void func( int *b ){ }

void func( int *&b ){ }
かって話なら
void func( int *b ){ } これ

124 :デフォルトの名無しさん:2006/12/08(金) 00:19:45
STLのmapのイテレータは要素数が変化しても無効にならないって本当?

125 :デフォルトの名無しさん:2006/12/08(金) 00:21:46
>>124
本当。
map のイテレータが無効になるのは、それが指す要素がコンテナから削除されたときだけ。

126 :デフォルトの名無しさん:2006/12/08(金) 00:25:57
>>125
本当だったんだ。
mapがそうならlistやsetも?

127 :デフォルトの名無しさん:2006/12/08(金) 00:30:49
>>126
map がそうだからってわけじゃないけど list や set もそう。

128 :デフォルトの名無しさん:2006/12/08(金) 00:33:41
なるほど。

>>125,127
サンクス

129 :Nw:2006/12/08(金) 00:40:13
Cじゃないんですけど。゚(゚´Д`゚)゚。 BASICで書いて頂けませんか?
10: 20: ってな感じで・・
1.数A,B,Cを入力してA>BかつB>CならA*B*Cの計算を、A>BかつB≦Cなら
 A+B+Cの値を、A≦BならA/B+Cの値を求めるプログラム。
2.1+2+3+・・・・+X の合計が初めて200を超える X の値を表示するプログラム。
3.1,3,5,7,9,・・・・, X までの和を求め、和が1000を超えない X の最大値を表示するプログラム。
4.X,Yを入力し、X=1でY=2なら"A"と、X=3でY=4なら"B"と、X=5でY=6なら"C"と表示し、
 上記以外の数字の組み合わせを入れたときはプログラムの最初に戻るプログラム。
5.2つの数XとYを入力し、両方マイナスのときは√(X*Y)を、どちらか一方がプラスのときはX*Yを、
 両方プラスのときはX/Yのそれぞれの値を表示するプログラム。
6.自然数MからNmでの和と平均を求めるプログラム。(NとMの値は入力するものとし、M<Nとする)
S=M+・・・・+N
7.Y=3X^3 +2X^2 +X +15 において、Xの値を-10から10まで、0.5刻みで変化させてYの値を求めるプログラム。
8.AAB+BB=BAA つまり、(100×A+10×A+B)+(10×B×B)=(100×B+10×A+A)となるAとBを
 求めるプログラム。(A,Bは一桁の整数)
9.ABA×B=BCBつまり(100×A+10×B+A)×B=(100×B+10×C+B)となるA,B,Cを求めるプログラム。
10.三角形の辺A,B,Cにおいて、それぞれを1から20まで変化させたとき、直角三角形となる組み合わせをすべて
 求めるプログラム。
11.Y=6X^2 - 5X - 9 の式において、-10≦X≦10 の範囲でYの最大値を求めるプログラム。
 (Xは、0.2刻みとする)

130 :デフォルトの名無しさん:2006/12/08(金) 00:50:31
断る。スレタイ嫁

131 :デフォルトの名無しさん:2006/12/08(金) 01:04:56
>Cじゃないんですけど。゚(゚´Д`゚)゚。 BASICで書いて頂けませんか?

ここはC++だ!!!!!

出直せ。

132 :デフォルトの名無しさん:2006/12/08(金) 01:28:37
仮想関数を使うべきか、純粋仮想関数を使うべきか悩むときがある。
皆さんは、どんな使い分けをしていますか?



133 :デフォルトの名無しさん:2006/12/08(金) 01:30:13
抽象クラスにしたいとき。

134 :デフォルトの名無しさん:2006/12/08(金) 01:46:16
実装するのが面倒くさいとき。

135 :デフォルトの名無しさん:2006/12/08(金) 02:53:38
「基本の動作」を定義しておいてあげた方が親切そうなら、普通に仮想関数を用意してあげる。
例えば別に無視してしまっても構わないイベントをハンドリングするコールバック関数とか。

使う側に「必ずここは自分で実装してもらわないと困る!」って強制したい場合は純粋仮想にする。
例えばクラス保守責任者の名前を文字列で返す関数を組み込め!とか上司の命令で決まったなら、
純粋仮想にして各担当者にオーバーライドしていただく。

至極簡単。

136 :デフォルトの名無しさん:2006/12/08(金) 03:24:13
>>115
モジラのとこに何か書いてあった。
文法上は規定クラスにあれば十分だが、警告を出すコンパイラもあるので全部つけとけということだそうです。
ttp://www.mozilla-japan.org/hacking/portable-cpp.html#virtual_on_subclasses

137 :デフォルトの名無しさん:2006/12/08(金) 11:31:39
C#ではoverrideが追加されたよな、逆にオーバーライドしない指定のnewと共に。

138 :デフォルトの名無しさん:2006/12/09(土) 01:39:14
モジラのルールは、アレだよ。
モジラ内ではそう決まっちゃったからそうするしか無いのかもしらんが、
何かの指針になる様なルールじゃねえっすよ。
うん。

でもまあ、これに限っては付けた方がいいのかね。
書かないで済むものは書かないのがC++流って気もするけど。

139 :デフォルトの名無しさん:2006/12/09(土) 02:34:48

テキストエディタでプログラムを書くときは、エディタは何を使用していますか?


140 :デフォルトの名無しさん:2006/12/09(土) 03:18:49
手頃なテキストエディタ。

141 :デフォルトの名無しさん:2006/12/09(土) 03:21:30
>>139
【エディタ】ソース何で書いてる? 1スレ目
http://pc8.2ch.net/test/read.cgi/tech/1164154920/

142 :デフォルトの名無しさん:2006/12/09(土) 21:12:55
>>69
> do {...; } while (p_turn = !p_turn, 1);
whileの中のこの式ってありですか?どういう意味ですか?
代入が成功したらtrueで繰り返しというのはわかるのですが、その後ろの
",1"がわかりません。

143 :デフォルトの名無しさん:2006/12/09(土) 21:16:20
>>142
代入に失敗も糞も無い。
do while 使うんなら do {...; p_turn = !p_turn; } while(1) で同じこと。
と思ったけど、 continue とか使うと違うのかな?

144 :デフォルトの名無しさん:2006/12/09(土) 21:38:02
>>143 あれ、代入に失敗も糞も無かったでしたっけ?
> do {...; p_turn = !p_turn; } while(1)
これはわかるんですが、それをwhile (p_turn = !p_turn, 1);という書式に
書き換え可能なんですか?


145 :デフォルトの名無しさん:2006/12/09(土) 21:39:42
>>142
ちがうよ
while (p_turn = !p_turn, 1);
そもそも上の式では p_turn = !p_turn は評価されない
while の式として評価されてるのは 最後(一番右の) 1 だけ
つまり while は常に ture でループするってこと


146 :デフォルトの名無しさん:2006/12/09(土) 22:00:24
>>144
カンマ演算子ってやつだ。

>>145
評価はされる。結果が使われないだけ。

147 :デフォルトの名無しさん:2006/12/09(土) 22:01:03
>>143, 145 ご教示ありがとうございます。
> そもそも上の式では p_turn = !p_turn は評価されない
代入は実行されるんですよね?こういう書式が可能とは知りませんでした。
while(1){p_turn = !p_turn;...}と同じですよね?
条件として評価できるものがくるまで、式を何個も置くということも
できるのですか?

148 :デフォルトの名無しさん:2006/12/09(土) 22:02:42
>>146
> カンマ演算子ってやつだ。
ご教示ありがとうございます。調べてみます。

149 :145:2006/12/09(土) 22:05:06
>>146
書き方悪かった、結果が評価されないって意味だ

>>147
追記しとく
while が繰り返しをするかどうかは式評価で決まるわけだが
「,」は左の式を評価した後に右の式を評価しろというもの
たとえば while( a == b , a < 10 , b < 50 ) という式があったとする
この式の評価は左の a==0 を評価し、次にa < 10 を評価、最後に b < 50 を評価するのだがこの式全体の評価は最後の b < 50 だけで決まる
最初と真ん中の a == b と a < 10 は意味を成さない(意味の無い比較)
使い方とすれば while( a=a*2 , b=a+10 , b < 50 ) のように式の中で代入をして最後に比較したいときなど




150 :デフォルトの名無しさん:2006/12/09(土) 22:14:00
>>149
「評価」を言語の動作についての用語として使うなら「結果が評価されない」も意味不明だろ。
あと「式全体の評価は〜」もおかしい。「式全体の値は〜」ってところか。

151 :デフォルトの名無しさん:2006/12/09(土) 22:16:09
>>149 追記ありがとうございます。
>最初と真ん中の a == b と a < 10 は意味を成さない(意味の無い比較)
最初の有効な条件式を評価する、ということではないのですか?
例えば、こんなのは可能ですか?
int i = 0;
while(i++, i < 10){...}


152 :デフォルトの名無しさん:2006/12/09(土) 22:18:37
>>151
条件式かどうかは関係ない。可能かどうかは、人に聞く前に自分でやってみろ。

153 :151:2006/12/09(土) 22:20:17
i > 0になったところで、永続ループになりますか?

154 :145:2006/12/09(土) 22:30:20
>>153
問題ない


155 :デフォルトの名無しさん:2006/12/09(土) 22:33:20
副作用とか大丈夫だったっけ?

156 :デフォルトの名無しさん:2006/12/09(土) 22:33:27
>>152 家のPCに開発環境なんて入れてません。
というか、スレタイ見てね(はーと

>>154 ありがとうございます。
問題ない=10回繰り返す=i > 0になったところで、永続ループにならない、
と理解しましたが、OKですね。

月曜日に試してみます。

157 :デフォルトの名無しさん:2006/12/09(土) 22:34:59
俺に聞けスレだったな。スマンカッタ。

158 :デフォルトの名無しさん:2006/12/09(土) 22:41:36
>>157 そう言われてしまうと、こちらもスマンカッタ。

159 :デフォルトの名無しさん:2006/12/09(土) 23:00:36
そして二人の間に友情が芽生えた

>>155
なんかあったっけ?

160 :デフォルトの名無しさん:2006/12/09(土) 23:38:53
聞くのはいいが、開発環境くらい入れとけと

161 :デフォルトの名無しさん:2006/12/10(日) 16:40:57
vectorのn番目の要素のイテレータをずばっと得るにはどうすりゃいいの?

it = vec.begin();
std::advance(it, n);
は思いついたけどこれって線形時間掛かるんじゃなくて?

162 :デフォルトの名無しさん:2006/12/10(日) 16:51:35
いいえ。

163 :デフォルトの名無しさん:2006/12/10(日) 16:52:14
vec.begin()+n
ちなみに大抵の処理系でstd::advanceは各イテレータコンセプトについて
適切に実装されているから上のような書き方をする必要はない。
規格でそう決まっていたかはシラネ

164 :デフォルトの名無しさん:2006/12/10(日) 17:40:52
規格でそう決まっている。 24.3.4

165 :デフォルトの名無しさん:2006/12/10(日) 17:46:00
THX

166 :デフォルトの名無しさん:2006/12/10(日) 18:00:52
advanceなんてあるのか
今までforループ使ってた…
勉強になるな

167 :デフォルトの名無しさん:2006/12/10(日) 18:14:42
あはは。普通に+演算子オーバーロードされてるじゃーん。気付けよ、俺。orz

>>162-164
d

168 :デフォルトの名無しさん:2006/12/10(日) 18:28:56
【標準出力の画面を消去する方法】
一つ目の標準出力   (例) cout << "前画面\n"

をしてから、

二つ目の標準出力   (例) cout << "次画面\n"

をしたときに、
------------------------
前画面
次画面
------------------------
ではなく、最初に出力した内容を消去して
------------------------
次画面
------------------------
とする方法を教えていただけますか?

169 :デフォルトの名無しさん:2006/12/10(日) 18:36:12
>>168
標準ではできない。たぶんコンソール操作を行うライブラリを使う必要がある。

170 :デフォルトの名無しさん:2006/12/10(日) 18:53:05
>>169
レスありがとうございます。

少しWEBで検索しました。
>コンソール操作を行うライブラリ
これは、
ttp://www.kumei.ne.jp/c_lang/intro/no_61.htm
みたいなのを自作するということでしょうか?

171 :デフォルトの名無しさん:2006/12/10(日) 19:11:25
>>170
コンソールアプリなら
#include <conio.h>
void clrscr(void);
これ使えねー?

172 :デフォルトの名無しさん:2006/12/10(日) 19:33:58
>>171
>void clrscr(void);
使い方は、
ヘッダをインクルードして、
clrscr();
ですよね?
エラーが出てしまいます。(なんで?)
VS EEでは使えないのでしょうか?
(.\main.cpp(73) : error C3861: 'clrscr': 識別子が見つかりませんでした)

173 :デフォルトの名無しさん:2006/12/10(日) 19:47:18
WindowsSDKを入れましょう

174 :デフォルトの名無しさん:2006/12/10(日) 20:01:53
>>173
WindowsSDKってのは、Windows Platform SDKのことですか?
これは、

 高機能でパフォーマンスに優れた Windows アプリケーションを
 作成できます。

と書いてありました。

私はコンソールアプリケーションで作成していますが、いいですか?

ダウンロードは、3つくらい候補があるようですが、
英語で私には難しいかもしれません。
 PSDK-amd64.exe 1.3 MB
 PSDK-ia64.exe 1.4 MB
 PSDK-x86.exe 1.3 MB



175 :デフォルトの名無しさん:2006/12/10(日) 20:08:56
>>172
VS EEって何?

176 :デフォルトの名無しさん:2006/12/10(日) 20:12:39
>>175
>VS EEって何?
Visual C++ 2005 Express Editionです。


177 :デフォルトの名無しさん:2006/12/10(日) 20:14:17
>>175
>VS EEって何?
略している人がいましたが、VSなんて略さないかもしれないですね。
略すならVCかも。

178 :デフォルトの名無しさん:2006/12/10(日) 20:19:48
>>176
変に略さんでくれ

http://msdn2.microsoft.com/ja-jp/library/system.console.clear(VS.80).aspx
これのC++の部分
Console::Clear();  と書いてある

179 :デフォルトの名無しさん:2006/12/10(日) 20:20:32
>>174
PlatformSDKとWindowsSDKは違う。
Platform SDK + NET SDK = Windows SDK

180 :デフォルトの名無しさん:2006/12/10(日) 20:21:46
>>178
ドトネトはスレ違い

181 :デフォルトの名無しさん:2006/12/10(日) 20:28:43
>>179

>PlatformSDKとWindowsSDKは違う。
>Platform SDK + NET SDK = Windows SDK
そうですか。

182 :デフォルトの名無しさん:2006/12/10(日) 20:30:58
>>168
\nの代わりに\rを使うとそういう風になる環境は結構ある。
Windowsのコンソールもそうなっているはず。

183 :デフォルトの名無しさん:2006/12/10(日) 20:43:25
>>182
>\nの代わりに\rを使うとそういう風になる環境は結構ある。
これはその行の先頭へ復帰する、というだけだったと思いますが......

184 :デフォルトの名無しさん:2006/12/10(日) 20:49:24
>>183
いったん画面をクリアしたいんだろ

185 :デフォルトの名無しさん:2006/12/10(日) 21:04:22
行の先頭に戻れても前の行は消せないだろカス

186 :デフォルトの名無しさん:2006/12/10(日) 21:07:49
>>185
えっ?

187 :デフォルトの名無しさん:2006/12/11(月) 16:29:38
システムエラー時以外で例外を使うのはダメプログラム?
例えば、ファイル名を決めていないのに上書き指示を受け取ったときとか。


188 :デフォルトの名無しさん:2006/12/11(月) 16:53:25
その例外に対処するのが至近距離にいるなら、通常のエラー処理で十分な気はする。
まとめて受け取り処理できる受け皿があるなら、普通に例外投げれば。

上記の例は例外対象じゃないだろ。
設計エラーな気すらする。

189 :デフォルトの名無しさん:2006/12/11(月) 16:58:35
書き込み禁止になってたりした時には例外飛ばしたいような気もするし、
名無しの場合も例外でもいいんじゃないかという気もする。

Windows でメニューに上書きコマンドを持つソフトなら、
メニューアイテムをグレイにしなきゃならんから事前にチェックする
ことになると思うけど。

190 :デフォルトの名無しさん:2006/12/11(月) 17:03:26
よくわからんのだが、名無しで書込み禁止なんて状況、あるんだ?
デタラメにハッシュとかで名前作ってみたらたまたま既に居て書込み禁止だったよとか、そんな状況?

191 :デフォルトの名無しさん:2006/12/12(火) 03:00:24
std::logic_error の出番だな。

192 :デフォルトの名無しさん:2006/12/12(火) 18:39:09
文字列ストリームのostringstreamへの出力に限界ってあるのでしょうか?

ostringsteam ret;
ret << "****************";

って感じで、文字列ストリームを宣言して、
テキストファイルを読み込んで、
内容を編集し、
文字列ストリームに出力します。

プログラムの最後で、
ofstream fout
と生成した出力オブジェクトfoutに
fout << ret.str();
という風に出力しているんですが、
なぜかある一定サイズ(28行くらい)を超えると、
ダイアログが出て
『問題が発生したため、****.exeを終了します。
ご不便をおかけして申し訳ありません』
と言われます。なぜでしょう?

193 :デフォルトの名無しさん:2006/12/12(火) 19:01:09
>>192
>なぜでしょう?

バグでしょう。

194 :デフォルトの名無しさん:2006/12/12(火) 19:01:40
コードと環境晒せよ

195 :デフォルトの名無しさん:2006/12/16(土) 10:39:27
下で使うメンバ関数のgetはCのgetcharと似ていると思います。
同じくCのgetchに似ている関数ってありますか?

#include <iostream>
using namespace std;
int main()
{
int ich;
while( (ich = cin.get) != EOF ){
cout.put(ich);
 }
}


196 :デフォルトの名無しさん:2006/12/16(土) 11:05:57
ない。
基本的にC++の入出力はCのそれと同じ機能を持っている。
ちょうどgetchar/(f)getcはstd::istream::getに対応している。
しかしgetchは標準でないので、C++に対応するものはない。

197 :デフォルトの名無しさん:2006/12/16(土) 11:14:05
>>196
回答感謝です。
そうですか。
わかりました。


198 :デフォルトの名無しさん:2006/12/16(土) 14:18:46
関数の引数に****.c_str()を入れて、関数内でファイルからデータを読み込むのは
どうすればいいのでしょうか・・・・?

****=ファイル名


199 :デフォルトの名無しさん:2006/12/16(土) 17:17:56
>>198
日本語でどうぞ。

200 :デフォルトの名無しさん:2006/12/17(日) 06:58:47
****.c_str()
ていうことは、
****
はstringですよね?
stringにファイル名を入れてそのファイルをreadするなら

○-----○-----○-----○-----○-----○-----○-----○-----
string ----- = "パス名"; ← ----は文字列 (末尾に、"\\")
---- += "ファイル名"
filein.open((----.c_str()), ios::in);
○-----○-----○-----○-----○-----○-----○-----○-----

でだめですか?

201 :デフォルトの名無しさん:2006/12/17(日) 08:18:52
なにこの頭悪そうな流れ。

202 :デフォルトの名無しさん:2006/12/17(日) 10:43:59
はぁ? なんのことじゃ? >>201

203 :デフォルトの名無しさん:2006/12/17(日) 17:07:09
coutで2350000と表示したいんですが、
どうしても2.35e+06と表示されるんですが、どうしたらいいでしょうか?

204 :デフォルトの名無しさん:2006/12/17(日) 19:16:58
いきなりすいません。
Visual C++でC++を書いていたのですが、
どこかのショートカットキーを押してしまい、
スペースが・で表示されたり、
Tabが→(矢印)で表示されるようになってしまいました。
どうすれば元に戻せますか?

205 :デフォルトの名無しさん:2006/12/17(日) 19:23:00
>>204
(VCのエディタの設定が変わったのでしょうかね?[ツール]-[オプション]とか適当にいじってもダメですか)
私は設定にはあまり詳しいわけでないのでお答えできませんが、
VCのシリーズによって、微妙に設定方法って違うかもしれませんね。
(基本的には同じだと思いますが)


206 :デフォルトの名無しさん:2006/12/17(日) 20:06:57
>>203
double d = 2350000.;
std::cout << std::ios::fixed << d << std::endl;

207 :デフォルトの名無しさん:2006/12/17(日) 20:11:20
>>204
204です。
205さん、アドバイスありがとうございます。
[ツール]-[オプション]をいじってみたのですが、
今のところ元に戻りません…

208 :デフォルトの名無しさん:2006/12/17(日) 20:23:25
>>203
このへん
http://www.geocities.jp/cbc_vbnet/vc/console.html
04.マニピュレータ

209 :デフォルトの名無しさん:2006/12/17(日) 22:37:19
>206>208
どうもありがとうございました。
問題は解決されました・・

210 :デフォルトの名無しさん:2006/12/18(月) 00:02:30
関数アダプタかまして作り出したオブジェクトって、
元にしたオブジェクトが死んだら使えなくなるの?

関数アダプタって、どう言う仕組みで実装できてるのだ?

211 :デフォルトの名無しさん:2006/12/18(月) 00:06:56
Visual C++ を使っています。
行列の固有値と固有ベクトルを求めるため、
ttp://www.neuro.sfc.keio.ac.jp/~masato/source/
このサイトにあるヘッダーファイルとリソースファイルを組み込み、マニュアルに示されているとおり、
#include <stdio.h>
#include "matrix.h"
void main(void)
{
Matrix A(2, 2), X;
Vector lamda;

A[0][0] = 3.0; A[0][1] = 2.2; // 行列 A 3.0 1.2
A[1][0] = 1.2; A[1][1] = 2.0; // 1.2 2.0

X = A.eigen(&lamda);

printf("\neigen value = ");
lamda.print();
printf("\neigen vector =\n");
X.print();
}
として、コンパイルしたところ、
 1番目の引数を 'Vector *' から'Vector &'に変換できません。(新しい機能; ヘルプを参照)
というエラーが出ます。どうようにすればよいのかぜひ教えてください。


212 :204:2006/12/18(月) 00:19:44
Visual C++の表示が変わってしまった件が解決しました。
(ctrl+R) + (ctrl+W) で元に戻りました。
205さん、ありがとうございました。

213 :デフォルトの名無しさん:2006/12/18(月) 00:29:10
>>211
ざっと見た感じ
X = A.eigen(&lamda)ではなくて
X = A.eigen(lamda);じゃないか?

(実際に確かめてないのであしからず)

214 :デフォルトの名無しさん:2006/12/18(月) 00:34:59
>>213
すでに試してみました。固有値は0が二つ、固有ベクトルは[0.5914,-0.8964]が二つ返され、うまくいきませんでした、

215 :デフォルトの名無しさん:2006/12/18(月) 00:44:04
ifstreamでファイル名が日本語のものを読み込むにはどうすればいいのでしょうか?

216 :デフォルトの名無しさん:2006/12/18(月) 00:47:11
>>215
#include <clocale>
setlocale(LC_CTYPE, "");

217 :デフォルトの名無しさん:2006/12/18(月) 00:48:09
VisualStudio2005Express入れました
一から全部教えてください
m(_ _)m

218 :デフォルトの名無しさん:2006/12/18(月) 00:49:05
>>215
読み込もうとするとどうなるの?

219 :デフォルトの名無しさん:2006/12/18(月) 01:00:38
>>216
すごい!解決したかもです。ありがとうございます

>>218
以下のチェックで必ず引っかかってましたが216さんので引っかからなくなりました
ifstream ifs(argv[1]);
if(!ifs)
return 1;


220 :デフォルトの名無しさん:2006/12/18(月) 01:41:41
>>219
そのままファイルに日本語書き込めるか?
ライブラリがバグッててどうしようもなかったと思うんだが。

221 :デフォルトの名無しさん:2006/12/18(月) 01:49:29
>>220
バグリました
引数の日本語は消え、変数内に日本語を使用するとそこで処理が止まりアプリが落ちる感じで…
振り出しに戻ったところでございます。よき方法があればご教授をTT

222 :デフォルトの名無しさん:2006/12/18(月) 11:22:14
>>221
SP1 が出てるから、試してみるといいかもしれない。
むしろ、試してみて報告たのむ。

223 :デフォルトの名無しさん:2006/12/18(月) 17:13:39
C++で質問です。
String str[] = {"aa", "bbb", "ccccc"};
のような配列の要素数を得るにはどうしたらいいのでしょうか。

224 :デフォルトの名無しさん:2006/12/18(月) 17:23:02
まさしくそのような配列なら、sizeof(str) / sizeof(str[0]) でOK。

225 :デフォルトの名無しさん:2006/12/18(月) 17:24:04
Integer型をgcc3以降のg++でも使えるようにするためにはどうすれば良いでしょうか?
今は2.95.3を併用してctype.oでごまかしながら使ってます。

226 :デフォルトの名無しさん:2006/12/18(月) 17:25:53
Boostを使って良(くてコンパイル時定数でなくても良)ければ、
<boost/range/size.hpp>をインクルードしてboost::size(str)という手もある。

227 :デフォルトの名無しさん:2006/12/18(月) 18:00:06
>>224>>226
ありがとうございます。
>>224の方法で出来たのですが、それを少し変えて
const string a[] = {"aa", "bbb", "ccccc"};を

int function(const string str[]) const {
return (int)sizeof(str)/sizeof(str[0]);
}

のような関数でfunction(a);として要素数を出すようにしたら、
戻り値が0になってしまうのですが、なんででしょうか。

228 :デフォルトの名無しさん:2006/12/18(月) 18:12:53
>>227
引数として得た配列のサイズを得ることはできません(固定サイズの場合を除く)。
もし問題がなければ、std::vector などを使うのが良いと思います。

229 :デフォルトの名無しさん:2006/12/18(月) 18:13:29
template <typename T, std::size_t N>
std::size_t array_size(T (&)[N])
{
  return N;
}


230 :デフォルトの名無しさん:2006/12/18(月) 18:14:17
>>228
templateで出来るだろ。

231 :デフォルトの名無しさん:2006/12/18(月) 22:14:53
>>227
仮引数でのTの配列型は、Tへのポインタ型へ変換される規則。

>>228
boost::sizeは、普通の引数として配列の引数を受け取るが。
(配列に対する部分特殊化は、正に229のようなことをやっている)

232 :デフォルトの名無しさん:2006/12/18(月) 23:13:41
度々申し訳ありません。>>229の方法で、
function() {
const string a[] = {"aa", "bbb", "ccccc"};
array_size(a);
}
のようにした場合、上手くいくのですが、下のようにすると上手くいきません。

function2() {
const string a[] = {"aa", "bbb", "ccccc"};
function1();
}
function1(const string b[]) {
array_size(b);
}

VisualStudio .NET 2003環境で以下のようなエラーが出てしまいます。
「'size_t array_size(T (&)[N])' : 'T1 (&)[N] 用のテンプレート引数を
'const std::string []' から減少できませんでした。」
どこがまちがってるんでしょうか。

233 :デフォルトの名無しさん:2006/12/18(月) 23:14:44
VisualC++ 2005 Expressを使ってWindowsソフトが作って見たいと思ったのですが
windows.hがインクルードできません。

Cの知識はあるのですが、C++の知識はないです。
何が原因でしょう?

234 :デフォルトの名無しさん:2006/12/18(月) 23:15:06
すいません訂正です。
function2() {
const string a[] = {"aa", "bbb", "ccccc"};
function1(a); // ←
}

235 :233:2006/12/18(月) 23:23:27
すいません、聞かなかったことにしてください・・・。

236 :デフォルトの名無しさん:2006/12/18(月) 23:25:20
>>232-233
226/229の方法は、配列にしか使えず、ポインタには使えない。
配列型は引数に取れないが(>231)、配列への参照型は引数に取れる(配列へのポインタ型も可)。
というわけで次のようにすればいい。
template <typename Range>
void function1(Range& b) {
  array_size(b);
}

237 :デフォルトの名無しさん:2006/12/18(月) 23:51:46
>>236
ありがとうございます。その方法で出来ました。
C++にはtemplateという便利なものがせっかくあるのに
使いこなせないというのはもったいないので、これから勉強し直そうと思います。

238 :デフォルトの名無しさん:2006/12/19(火) 08:17:38
lseek関数っていうものがいまいちよく分からないんですけど、
分かりやすく教えてください、エロい人。

239 :デフォルトの名無しさん:2006/12/19(火) 09:54:22
>>238
判らない人は使わなくて宜しい。
ファイルストリーム系のfseek()使えば?

240 :デフォルトの名無しさん:2006/12/19(火) 14:10:11
一次元配列の問題で、
六個の整数を配列に記憶して配列の中から最大値と最小値を出せって問題なのですが
これは配列に入っている数字をif文で総当りの式書かないとできないのでしょうか?
配列使って応用が効きそうだなとは思うのですがなかなかその先に考えがいけません。
何かヒントなどいただけないでしょうか?



241 :デフォルトの名無しさん:2006/12/19(火) 14:16:43
C++でHTTP通信をするには、どうすればいいですか?

242 :デフォルトの名無しさん:2006/12/19(火) 14:17:24
>>240
「ソート」とか、「ソート 配列」でググってみろ

243 :デフォルトの名無しさん:2006/12/19(火) 14:18:51
>>240
ヒントというか・・・
気に入ったTVが一番安く買える値段を探すときに、あなたならどうしますか?
探している途中、今まで見つけた中でいちばん安い値段をメモしておいたり・・・

244 :デフォルトの名無しさん:2006/12/19(火) 15:09:01
>242
>243
すいません追記で
使っていいのはif文とfor文だけです。


245 :デフォルトの名無しさん:2006/12/19(火) 15:14:45
>>244
>>242-243に追記と言ってどうするw
ヒントをくれてるんだから自分でやれよ
ここは宿題スレではない

246 :デフォルトの名無しさん:2006/12/19(火) 15:23:30
>245
はぁ?w
元からできるよw
ひとつだけ言わせてくれソ−ト使わないとこんな問題もできないんですか?wwwwww
入門スレだからどれくらいできるやついるか試しただけ、
だけどこんな初歩の問題もできないなんてwwwww
このスレの価値なし

247 :デフォルトの名無しさん:2006/12/19(火) 15:27:06
やれやれ・・。
次の質問どうぞ。

248 :デフォルトの名無しさん:2006/12/19(火) 16:36:55
>>241
処理系定義の機能を使う必要がある。よって、環境が明示されて
いなければ答えようがない。

249 :デフォルトの名無しさん:2006/12/19(火) 22:57:39
配列内の整数値を整列させたいのですが、qsort()を始めとしたソートアルゴリズムは使いたくありません。
どういう方法があるでしょうか。

250 :デフォルトの名無しさん:2006/12/19(火) 23:00:55
整列させたいのにソート使いたくないとはこれ如何に。

251 :デフォルトの名無しさん:2006/12/19(火) 23:02:06
アルゴリズムを使わない方法と言えば、
・他の機械(やプログラム)にデータを渡してソートしてもらう
・ユーザにデータを示してソートしてもらう
・並べ替えを一切せず、低い確率でのみ正常動作するという仕様で我慢してもらう
くらいしか思いつきません・・・

252 :デフォルトの名無しさん:2006/12/19(火) 23:51:45
qsort()を始めとしないソートアルゴリズムを使えばいいじゃないか。

253 :デフォルトの名無しさん:2006/12/20(水) 00:38:02
逆に考えるんだ。
今あるデータをソートするのではなく
最初から整列したデータを用意するんだ。

254 :デフォルトの名無しさん:2006/12/20(水) 07:42:40
それでいけました。ありがとうございます。

255 :デフォルトの名無しさん:2006/12/20(水) 10:13:55
.open,.closeとfopen,fcloseって何が違うんでしょうか?


256 :デフォルトの名無しさん:2006/12/20(水) 10:16:48
C++でラプラシアンフィルターを作りたいのですが誰か教えてください

257 :デフォルトの名無しさん:2006/12/20(水) 10:23:25
>>255
なんで同じだと思うの?

258 :デフォルトの名無しさん:2006/12/20(水) 13:25:00
なに?>>255
.open,.closeとfopen,fcloseの違いが分からない?

>>255それは無理矢理違いを探そうとするからだよ

逆に考えるんだ
「基本的に全く違うもので、どんな共通点を持つのか」
と考えるんだ

259 :デフォルトの名無しさん:2006/12/20(水) 18:36:29
C++でラプラシアンフィルターを作りたいのですが教えてもらえないですか

260 :デフォルトの名無しさん:2006/12/20(水) 18:38:11
>>259
お前いい加減うざい。
マルチしずぎ。

261 :デフォルトの名無しさん:2006/12/20(水) 18:39:30
×しずぎ
○しすぎ

262 :デフォルトの名無しさん:2006/12/20(水) 18:51:24
Visual C++を使用しています。
文字列操作を行うプログラムなんですが、

data[256] = "abc,de f,,,,,, g";
char finder = ','; //検索用文字

をstrchr()とmemset()とmemcpy()を用いて
,をのぞいた文字列(abcde f g)を出力させたいのですが、どのように
すればいいかサッパリ…
どんな感じで組み立てればいいか教えてもらえませんか?


263 :デフォルトの名無しさん:2006/12/20(水) 19:07:15
>>262
strchr()とmemset()とmemcpy()を使わないで一文字ずつ辿るのが手軽だと思うよ
というかstrchr()とmemset()とmemcpy()を使わないといけない≒宿題なら別なところ行け

264 :デフォルトの名無しさん:2006/12/20(水) 21:05:31
>>262
というかVC++使っててC++スレに質問来るんだから
std::string使えよ…

265 :デフォルトの名無しさん:2006/12/20(水) 21:50:21
>>262
文字列処理でmemset()だとかmemcpy()なんか使うなよ。

266 :デフォルトの名無しさん:2006/12/21(木) 01:24:45
std::string使ってremoveみたいなん使えばすぐすむ話じゃん
あとCならmemmoveを使った方がね

267 :デフォルトの名無しさん:2006/12/21(木) 20:15:57
java始めて3ヶ月の者です。質問なのですが、C++を勉強すればCも勉強したことに
なりますか?たとえて言うなら、大型自動車の免許を取れば普通自動車も運転でき
ちゃう、といった感じのイメージで捉えていいのかということです。C++を勉強すれば
Cも書けるようになるのかということです。

268 :デフォルトの名無しさん:2006/12/21(木) 20:29:59
大型免許の例えはうまい、その考えでいいと思う。
できるけど、慣れないのでやや面倒かもしれないということはあるだろう。

269 :デフォルトの名無しさん:2006/12/21(木) 20:31:12
やはり、そうですか。回答どうもです。

270 :デフォルトの名無しさん:2006/12/21(木) 20:44:49
大型は普通をもってなきゃ取れないけどな。

271 :デフォルトの名無しさん:2006/12/21(木) 20:53:56
自衛官になればおk

272 :デフォルトの名無しさん:2006/12/21(木) 21:07:50
>>267
段階踏んでまずCやるほうがいいよ。

273 :デフォルトの名無しさん:2006/12/21(木) 21:10:08
戦車…

274 :デフォルトの名無しさん:2006/12/21(木) 21:57:49
たいていのC++できる人ってC++始める前にCやってるんじゃないかな

275 :デフォルトの名無しさん:2006/12/21(木) 22:32:56
C++が主に使われてる分野ってなんですか?ゲームですか?組み込み式?

276 :デフォルトの名無しさん:2006/12/21(木) 22:38:09
GUI

277 :デフォルトの名無しさん:2006/12/21(木) 23:42:46
随分抽象的な回答ですね。

278 :デフォルトの名無しさん:2006/12/21(木) 23:48:39
え?

C++やったらCの知識は要らないんだよね
式にするとC++ - C = C+ みたいに…

279 :デフォルトの名無しさん:2006/12/22(金) 00:11:13
C++-C=1じゃね?

280 :デフォルトの名無しさん:2006/12/22(金) 00:13:07
ワロタ

281 :デフォルトの名無しさん:2006/12/22(金) 00:31:33
C++-C=0

282 :デフォルトの名無しさん:2006/12/22(金) 00:32:19
C++ - C = ++

283 :デフォルトの名無しさん:2006/12/22(金) 00:49:30
マジレスすると、CはC99でC++とは違う道を歩き始めたから
C99の新機能は勉強しておいて損はないと思う。

284 :デフォルトの名無しさん:2006/12/22(金) 00:56:22
と言ってもinlineやboolなど、明らかにC++を意識したとしか思えない機能も結構あるけどな。

285 :デフォルトの名無しさん:2006/12/22(金) 01:04:52
wikiで「上位互換はなくなった」という記事を読んだ

286 :デフォルトの名無しさん:2006/12/22(金) 01:15:56
可変長配列は便利だ。
ヒープを使わない点もパフォーマンス狙いのときには利用価値がある。

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
俺のエスパー値が低くてわからないので、
症状が再現する最小限のコードを晒してくれ。

337 :327:2006/12/30(土) 07:15:46
>328
>329

必要な局面があるという事がわかって安心しました。
C++の勉強中ですが、iostream系もサボらずに覚えようと思います。

338 :デフォルトの名無しさん:2006/12/30(土) 09:33:18
>>333
スレッドは提案が出ていたと思う。

>>335
inline付ければ平気。
インラインでない(かつテンプレートでない)関数をヘッダで定義すると、
それをインクルードした全てのcppファイル(そしてそれをコンパイルしたobjファイル)にその関数の定義が含まれてしまう。
するとリンク時に同一名のシンボルが複数見付かったというエラーになる。

そもそもその関数を定義するのはなぜ?自分で書かなくても(std::istreamのメンバとして)標準ライブラリにあるだろうに。

339 :デフォルトの名無しさん:2006/12/30(土) 12:47:06
実行ファイル化した物や開発環境でデバッグファイルを作成した物は
問題なく読み込めるのですが、少しでもファイルの内容に変更を加えるだけで

error C2146: 構文エラー : ';' が、識別子 'lpDD' の前に必要です。
error C2501: 'LPDIRECTDRAW7' : 識別名を宣言するのに、型が指定されていません。

というエラーが出て、自家用PCでのVisualC++での開発が頓挫しております。
この場合、どうすればこの構文エラーがなくなってくれるのでしょうか・・・

340 :デフォルトの名無しさん:2006/12/30(土) 15:23:14
main()
{
 int*p;
 if(1)
 {
  int x; = 3;
  p = &x;
 }
 printf("%d", *p);
}

xがスコープから外れてるので使えないと思ったのですが
vc2003だと 3 と出力されました。
これの出力はどのコンパイラでも 3 になりますか?
それとも実装や状況に依存しますか?

341 :デフォルトの名無しさん:2006/12/30(土) 15:27:23
>>339
LPDIRECTDRAW7 が宣言されているヘッダをインクルードすればいいんじゃない?

342 :デフォルトの名無しさん:2006/12/30(土) 15:28:04
>>340
未定義動作。

343 :デフォルトの名無しさん:2006/12/30(土) 15:30:32
>>342
激しくさんくすこでつ!!

344 :デフォルトの名無しさん:2006/12/30(土) 15:32:44
クラス図の書き方がよくわからないのですがどういう決まりがあるんですか?
線の先が▲だったり、■だったりするのがよくわかりません

345 :デフォルトの名無しさん:2006/12/30(土) 17:34:21
JavaとかC#は一つのクラスにつき、一つのソースファイルを使う傾向があるようですが、
C++の場合は一般的にどうするべきなのでしょうか。

複数クラスを機能別にソースファイルに分けるべきなのでしょうか、
それともJavaのように一つずつクラス毎で分けたほうが良いのでしょうか。

346 :デフォルトの名無しさん:2006/12/30(土) 20:14:48
>>338
わかりやすい説明ありがとう
いや楽がしたくて
int a, b;
cin >> "(" >> a >> "," >> b >> ")";
みたいに出力と対称に入力出来るようにしてみた。

あと>>336もありがとう

347 :デフォルトの名無しさん:2006/12/30(土) 20:41:04
> JavaとかC#は一つのクラスにつき、一つのソースファイルを使う傾向があるようですが、 

そんなことありません。


348 :デフォルトの名無しさん:2006/12/30(土) 23:11:15
Javaはそうだろ

349 :デフォルトの名無しさん:2007/01/01(月) 02:52:07
>>347
バカ。
そんなことある。

350 :デフォルトの名無しさん:2007/01/01(月) 04:10:31
>>345
分けるべきだな
ひとつの関数でも分ける
プログラミングの苦痛は、大きいクラスでも
大きい関数でもなく、大きなファイルから来る。
これは少し冗談だがBoostでも見ればだいたいこれくらいで
分けたらいいというのは分かるぞ

351 :デフォルトの名無しさん:2007/01/01(月) 04:58:17
そうしてリビジョン管理もろくにできない香具師が量産される罠。

352 :デフォルトの名無しさん:2007/01/01(月) 09:18:50
確かに(-_-)

353 :デフォルトの名無しさん:2007/01/02(火) 20:59:07
Visual C++ express Editionで、コンソールアプリケーションを使っていて
↓のようなウォーニングが出ます。動作事態は問題ないのですが、
 出さないようにする方法を教えてください。
d:\rankpro\addmatchresult.cpp(43) : warning C4996: 'getch' が古い形式として宣言されました。


354 :デフォルトの名無しさん:2007/01/02(火) 21:02:30
>>353 http://www.google.co.jp/search?q=C4996&lr=lang_ja

355 :デフォルトの名無しさん:2007/01/02(火) 21:02:54
ヘッダincludeするまえに
#pragma warning(disable:4996)

356 :デフォルトの名無しさん:2007/01/02(火) 21:49:01
>>354 , >>355
出来ました。
どうも、ありがとうございました。


357 :デフォルトの名無しさん:2007/01/03(水) 23:15:07
#include <vector>

class Integer {
 const int i;   // ここのconstが問題
public:
 Integer(int i) : i(i) { }
};

int main()
{
 std::vector<Integer> vec_int;
 vec_int.push_back(Integer(1));
}

なぜこのコードがコンパイルできないのか理解できません。
4行目のconstがなければ通るんですけど。。。。
コンパイラはGCC3.2.3です。


358 :デフォルトの名無しさん:2007/01/03(水) 23:47:05
vectorの要素には代入演算子が必要。
自分で書いてないから暗黙の代入演算子がコンパイラによって作られる。
暗黙の代入演算子がconstメンバ変数に代入しようとしてアウト。

359 :デフォルトの名無しさん:2007/01/04(木) 02:30:00
constは引数か定数でしかあまり使わないな〜

360 :デフォルトの名無しさん:2007/01/04(木) 04:23:38
STLのコンテナの要件は、代入演算子じゃなくてコピーコンストラクタだよ。
その部分以外は正しいけどね。

361 :デフォルトの名無しさん:2007/01/04(木) 09:34:48
>>357
vector の push_back() ならコピーコンストラクタだけで
実装できそうだな。エラーメッセージは?

362 :デフォルトの名無しさん:2007/01/04(木) 10:06:32
>>360
2003 版の規格の 23.1 p3 によると、コンテナ全般での要素型への要求として
CopyConstructible と Assignable が両方必要になってる。

http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#276
これでコンテナ全般では Assignable を必要としなくなったけど、
vector では別途 Assignable が明記されたので vector に限れば
同じこと。

363 :デフォルトの名無しさん:2007/01/04(木) 10:27:44
>>358
暗黙で定義されるのはコピー代入演算子

>>360
規格23.1.3
コンテナに格納されるオブジェクトの型はCopyConstructibleかつAssignable

364 :357:2007/01/04(木) 11:35:59
皆さんありがとうございます。

エラーメッセージはこんな感じです。
コピー代入演算子でエラーが出ているようです。
また、push_back()をしなければエラーは出ません。

/usr/include/c++/3.2.3/bits/stl_vector.h: member function 内の
`Integer& Integer::operator=(const Integer&)':
/usr/include/c++/3.2.3/bits/stl_vector.h:895:
`void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<_Tp*, std::vector<_Tp, _Alloc> >,
const _Tp&) [with _Tp = Integer, _Alloc = std::allocator<Integer>]' から実体化されました
/usr/include/c++/3.2.3/bits/stl_vector.h:498: `void std::vector<_Tp, _Alloc>::push_back(const _Tp&)
[with _Tp = Integer, _Alloc = std::allocator<Integer>]' から実体化されました
const_member.cpp:12: ここで実体化されました
/usr/include/c++/3.2.3/bits/stl_vector.h:895: non-static const member `const int Integer::i', can't use default assignment operator

メンバ変数をconstにするのは、関係のある複数の変数をひとまとめにするためだけに
クラスを使いたいからです。
Cの構造体にコンストラクタをくっつけるだけみたいな。
だから最初に載せたコードのInteger::iは本当はpublicメンバです。

やりたいことをスマートに実装する方法はないものでしょうか。
あえてメンバをconstにしなくても困らないっちゃあ困らないんですが。

365 :デフォルトの名無しさん:2007/01/04(木) 11:46:37
>>364
じゃあconst取れヴォケ。

366 :デフォルトの名無しさん:2007/01/05(金) 23:54:09
>>364
インスタンスをconstで宣言して代入じゃ問題が?


367 :デフォルトの名無しさん:2007/01/07(日) 16:38:31
火葬軽症って何ですか?

368 :デフォルトの名無しさん:2007/01/07(日) 17:09:34
文法等で規定されている形式的な継承であるかどうかに関係なく、
実質的に継承関係になっているような継承のこと。

369 :デフォルトの名無しさん:2007/01/07(日) 22:02:52
継承元は実体化できないよ〜ん
必ず継承して実体化できるようにしてね(はぁと)

370 :デフォルトの名無しさん:2007/01/07(日) 23:26:58
ダイナミックキャストって、動的に判断されるのだよな?
クラスのインスタンスにクラス情報でも勝手に組み込まれて、
グローバル領域にクラス相関図情報みたいのが勝手に作られてるのか?

371 :デフォルトの名無しさん:2007/01/07(日) 23:41:26
>>368,369
もっともらしく嘘を教えていただきまして
ありがとうございます

372 :357:2007/01/08(月) 00:00:36
>>370
手元にある本には、処理系によって異なりうるが、仮想関数テーブルのなかに
型情報を収めたテーブルへのポインタが格納されると書いてある。
だからdynamic_castは多相型(仮想関数をひとつ以上持つクラス)の
オブジェクトにしか適用できないらしい。


373 :デフォルトの名無しさん:2007/01/08(月) 00:02:15
ひどいミスだ。
ちなみにオブジェクトと言ってもポインタかリファレンスね。

374 :デフォルトの名無しさん:2007/01/08(月) 00:27:44
class Base
{
public:
int n;
};
//仮想継承
class D1 : public virtual Base { /* 〜 */ };
class D2 : public virtual Base { /* 〜 */ };

class Derivation : public D1, public D2 { /* 〜 */ };

この例のような状態は特に菱形継承(ダイアモンド継承)と呼ばれる。

仮想継承でない(D1, D2の部分のvirtualを取り除く)場合、DerivationのインスタンスにはD1の基底のBaseのnとD2の基底のBaseのnという2つのnが別に存在することになる
(メンバ関数も同様)。仮想継承した場合、 DerivationのインスタンスにはBaseの部分はただ1つしか存在しない。D1の基底とD2の基底が共有されている状態である。

C++ではクラスの多重継承・仮想継承が共に使用できる。しかしC++を基にしているJava、C#、Dではいずれも使用できない。

375 :デフォルトの名無しさん:2007/01/08(月) 01:42:50
>>374
ありがとうございました。
よく分かりました

376 :デフォルトの名無しさん:2007/01/08(月) 01:49:33
vector<int> vec1;
vector<int>::iterator iter;
int tmp;
cout << "項目を入力:" << endl;
while (cin >> tmp)
vec1.push_back(tmp);
cout << "表示方法を数字で選択:" << endl;
cout << "\t1\40入力順" << endl;
cout << "\t2\40逆" << endl;
int choise;
cin >> choise;   ※
cout << choise << endl;
switch(choise){
(以下省略)

上のソースで※の行のcinが無視されてしまいます。
だから例えば※の1行上で int choise = 0; 等とすると最後までchoiseは0のままです。
入力できるはずのところで入力できません。どうしてでしょうか?

377 :デフォルトの名無しさん:2007/01/08(月) 02:00:40
while (cin >> tmp)
vec1.push_back(tmp);

をどうやって抜けてる?

378 :デフォルトの名無しさん:2007/01/08(月) 02:06:50
>>377
Ctrl+Z です

379 :デフォルトの名無しさん:2007/01/08(月) 02:14:18
cinにstd::ios::failbit立ってるんとちがう?
cin.clear()してみ。

380 :376:2007/01/08(月) 03:10:27
>>379
できました。ありがとうございます。
Ctrl-Z が failbit フラグをonにするということですか?検索してみましたがよくわかりません。

381 :デフォルトの名無しさん:2007/01/08(月) 03:25:19
>>380
正しくは、cinがEOFを検出した事でstd::ios::eofbitが立つが、
std::ios::eofbitが立つ時は必ずstd::ios::failbitも立つ。

failbitが立ってしまうとそのストリームに対する操作はclear()と
close()以外は無効になる。

382 :デフォルトの名無しさん:2007/01/08(月) 07:59:33
>>371
あほな当て字をするからまともに答えてもらえないんだよ。
おれも仮○包茎の説明をしよかと思って思いとどまった。

383 :デフォルトの名無しさん:2007/01/08(月) 10:14:02
なにせマたちはスルーカが足りないからね。

384 :デフォルトの名無しさん:2007/01/09(火) 01:49:22
longをstringに変換する方法を教えてください。
お願いします。

385 :デフォルトの名無しさん:2007/01/09(火) 01:52:54
>>384
sprintf
snprintf
stringstream
strstream
boost::lexical_cast
でググって、好きな方法を選べ

386 :デフォルトの名無しさん:2007/01/09(火) 01:56:10
>>385
ありがとうございます。
それ以外のにします。

387 :デフォルトの名無しさん:2007/01/09(火) 01:58:10
>>386 語るんじゃねーよ。
>>385 ありがとです。

388 :デフォルトの名無しさん:2007/01/09(火) 02:02:31
>>387 騙るんじゃねーよ。
>>384 ありがとです。

389 :デフォルトの名無しさん:2007/01/10(水) 22:19:38
ダライアス継承の利点を教えてください

390 :デフォルトの名無しさん:2007/01/10(水) 22:44:47
何、そのシューティングっぽい継承。
ダイアモンド継承なら知ってるけど。

391 :デフォルトの名無しさん:2007/01/14(日) 21:12:30
C++で、適当な多次元配列を定義して、その型名をtypeid演算子によって表示するプログラムが分かりません。教えて下さい。

392 :デフォルトの名無しさん:2007/01/15(月) 11:07:49
あああ

393 :デフォルトの名無しさん:2007/01/15(月) 12:23:15
>>391
型名というか名前は実装依存だが。

int n[1][2][3];

std::cout << typeid(n).name() << std::endl;

394 :デフォルトの名無しさん:2007/01/15(月) 22:30:57
よろしこ
UINT max;
UINT foo;
if(1 < foo < max)
{
処理
}
このように書くと、

warning C4804: '<' : 演算中の 'bool' 型の使用方法が安全ではありません
warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
こんなときはどうしたらいいですか?
1にUINTの1だ〜と宣言させればよいかと思い
UINT 1なんて書いたら、コンパイラに馬鹿にされました
int 1と書いたらそんなものを付けるなともっと馬鹿にサレマスタ
VS2005
SDKデツ

395 :デフォルトの名無しさん:2007/01/15(月) 22:46:03
if (1 < foo && foo < max)

396 :デフォルトの名無しさん:2007/01/15(月) 22:55:35
>>395
394です
サンクス、馬鹿にされなくされなくなりましたが
foo && foo
でなんで直ったのか、もっと分からなくナリマスタ
解説してもらえませんか


397 :デフォルトの名無しさん:2007/01/15(月) 22:59:07
>>396
悪い事は言わん
1から勉強やり直せ

398 :デフォルトの名無しさん:2007/01/15(月) 23:02:09
foo && foo
じゃなくて
(1 < foo) && (foo < max)
と捉えろ

399 :デフォルトの名無しさん:2007/01/15(月) 23:43:30
>>395です
>>398サンクス良く分かりマスタ
が、1にプレフィックスを付ける方法とかは無いのですか?


400 :デフォルトの名無しさん:2007/01/15(月) 23:46:01
1u

401 :デフォルトの名無しさん:2007/01/15(月) 23:56:18
>>400
ちょww、お前ソレいま教えるなよ、こいつなんか勘違いしたまま先に進んじゃうぞw

402 :デフォルトの名無しさん:2007/01/15(月) 23:59:19
>>400
1uだとやっぱり、
warning C4804: '<' : 演算中の 'bool' 型の使用方法が安全ではありません
warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
これが出るんだよね・・・・

403 :デフォルトの名無しさん:2007/01/16(火) 16:26:11
「計算式対応電卓」
・計算式を文字列として入力すると、その計算を行い、結果を出力するプログラムを
作成せよ。
-入力文字列を解析し、数値と演算子に分けて計算する。
-例:計算する式を入力してください。終了:end
   使用可能演算子:四則演算(+-*/)
1+2
   答えは3です。
・必ず四則演算のほかに、使用可能な演算子を追加せよ。
 入力する際の演算子記号は任意にきめてよい。
-例:あまりを求める %
   二乗を求める
・繰り返し何度も計算できるようにする。

404 :デフォルトの名無しさん:2007/01/16(火) 16:29:03
つ 数式 and (パーサー or 構文解析)
http://pc10.2ch.net/test/read.cgi/tech/1168663908/

405 :デフォルトの名無しさん:2007/01/16(火) 17:34:56
前置法 中置法 後置法について調べてから
あとは>>404のスレで

406 :デフォルトの名無しさん:2007/01/16(火) 20:37:52
初期化が必要なコンストラクタしかないクラスインスタンスの配列を生成するにはどのように書けばよいのでしょうか?

class A
{
public:
A(int a);
};

このクラス定義に対して
A *ADim=new A[100]; //初期化がないと言って怒られます

よろしくお願いします

407 :デフォルトの名無しさん:2007/01/16(火) 20:45:58
byte 配列でメモリを確保してからひとつづつ placement new で初期化かなー。

408 :デフォルトの名無しさん:2007/01/16(火) 21:47:56
>>406
どう初期化したいの?

409 :406:2007/01/17(水) 00:08:00
1個だけであれば
A a(0);
あるいは 
A *a=new A(0);
でインスタンスが生成できますが
これを100個配列として生成する記述の仕方がわかりません。
よろしくお願いします

410 :デフォルトの名無しさん:2007/01/17(水) 08:09:53
std::vectorでも使っておけ。

411 :デフォルトの名無しさん:2007/01/17(水) 11:08:00
#include <cstdlib>
#include <memory>

A *ADim = (A*)std::malloc(sizeof(A) * 100);
std::uninitialized_fill_n(ADim, 100, A(1234));

別々の初期値が要るならraw_storage_iteratorで。

412 :デフォルトの名無しさん:2007/01/17(水) 11:18:16
たしかにそれをやってくれるのがvectorなわけだよな

413 :デフォルトの名無しさん:2007/01/17(水) 13:53:28
>>409
A(0) を100個でいいなら

std::vector<A> ADim(100, A(0));

414 :デフォルトの名無しさん:2007/01/17(水) 19:12:42
#include <iostream>
using namespace std;

int main(void)
{
unsigned char x,y;

cout << "2つの値を入力してください。\n";

cin >> x >> y;

x -= '0';
y -= '0';

int a = x + y;
int b = x * y;

printf("x = %d, y = %d, x + y = %d, x * y = %d",x,y,a,b);

return 0;
}

これで出力したら10以上の数値が出ないんですが、
どうしたら出るようになるか教えてください。

415 :デフォルトの名無しさん:2007/01/17(水) 19:16:51
>>414
xとyをint型か何かにする。
なんだかんだいって(signed/unsigned) charは文字を扱うためのもの。

416 :デフォルトの名無しさん:2007/01/17(水) 19:20:00
そうしたいのはやまやまなんですが、
宿題で『unsigned char』と『printf』ははずせないんです…。


417 :デフォルトの名無しさん:2007/01/17(水) 19:26:41
文字列して atoi じゃダメなのか?

418 :デフォルトの名無しさん:2007/01/17(水) 19:31:54
>>414
正直、気持ち悪すぎ

419 :デフォルトの名無しさん:2007/01/17(水) 19:32:22
>>417
atoiってchar以外で使えたっけ

420 :デフォルトの名無しさん:2007/01/17(水) 20:22:22
クラスって今まで頭の中で理解してたつもりだったが、クラスを使う場面が無かった
(あったけどうわべのだけ理解していた)のですが、Win32APIを弄りだしたら
物凄くクラスを使うと便利ということが分かったばかりの初心者です。

privateで宣言した
TCHAR *buffer[512];
というコンストラクタをデクストラクタする時に

foo::~fooSet()
{
  delete buff;
}
とすると、警告が出るのですが使い方間違ってますかというより、privateな変数は
デクストラクタしなくてもいいのでしょうか?

warning C4156: 'delete' の配列でない形式を使った配列の削除は、定義されていません。
warning C4154: 配列の delete が定義されていません。配列は、ポインタに変換されます。

VS2005
SDK

421 :デフォルトの名無しさん:2007/01/17(水) 20:29:22
buffer は配列であって new で確保したものじゃないだろ?
delete するなら buffer[0] とかだ

422 :デフォルトの名無しさん:2007/01/17(水) 20:31:16

スマソなれない言葉なんで(^^;
×デクストラクタ
○デストラクタ
です、よろしく

423 :デフォルトの名無しさん:2007/01/17(水) 20:33:48
>>421
サンクス
>>buffer は配列であって new で確保したものじゃないだろ?
そうです
buffer[0]したら警告が止んだ、これでいいのか、なるほど。


424 :デフォルトの名無しさん:2007/01/17(水) 20:38:10
よくねー
newしてないものをdeleteしちゃダメ。

425 :デフォルトの名無しさん:2007/01/17(水) 20:45:04
>>424
サンクス
>>423だす
ていうかnewしてなかったら、deleteしなくてもいいの?

426 :デフォルトの名無しさん:2007/01/17(水) 20:49:16
当たり前だ・・・・
何も知らないという事は恐ろしい

427 :デフォルトの名無しさん:2007/01/17(水) 21:19:33
そう言うなよ兄者
処でクラスって楽しいですね、これからは全てクラス化しようと
決心シマスタ

428 :デフォルトの名無しさん:2007/01/17(水) 21:22:51
> privateで宣言した
> TCHAR *buffer[512];
> というコンストラクタを
それコンストラクタじゃなくてメンバ変数だよ、多分
あと、デストラクタするってのも普通言わない

429 :デフォルトの名無しさん:2007/01/17(水) 21:49:29
>>428
なるほど、拙者承知した
処で、兄者はC++使いのつわものと拝見したが、Win32APIの関数もクラス化して
ライブラリィとか作ったりしたこともあると思うのだが、どんなものを作ったのか
教えてくれまいか、コードを書いてくれとは言わないが、これは便利だった役にたった
という物があったら教えてくれましか。
ATLとかvectorとか見たら目眩がするのでいっそ自分で作ったほうがましかと思う次第であるのでヨロシク


430 :デフォルトの名無しさん:2007/01/17(水) 22:00:23
> 自分で作ったほうがましかと思う
自分で作っても劣化版になるだけ。車輪の再発明と言う。
だいたい曲がりなりにも金を取ることもある製品なんだから作っているのはそれなりのプロだ、自分よりスキルがないわけがない。

431 :デフォルトの名無しさん:2007/01/17(水) 22:03:16
まぁ勉強のためにしてるんだからいいんじゃないの


432 :デフォルトの名無しさん:2007/01/17(水) 22:46:46
ATLとかVectorとかとてもプロが作ったものとは思えないのですが、単に
作者が自分の技術に心酔して一般には使いにくい塵を売りつけたおぞましい物にみえますが・・・・・

433 :428:2007/01/17(水) 23:14:41
>>429
何で用語の間違い指摘しただけでそんな認定受けなきゃならんのだ
質問するとき用語が間違っているとトラブルになりやすいからわざわざ指摘したんだが…
覚えたてなら用語を間違って覚えてる場合もあるだろ

あとオレはそんなにC++が得意なわけじゃないから

APIのラッパークラスも書いた事無いよ
書く予定も無い
まあ、使い捨てなものとか勉強目的のはあったと思うが、
少なくとも使い回せるようなのは一つも
今のオレが書けないような汎用性の高いライブラリが色んなサイトで公開されてるし

434 :デフォルトの名無しさん:2007/01/17(水) 23:26:44
>>432
それよりもっと使いにくいものなんて世の中ごまんとある。
ところで、ATLはATL::CHandleなんかの小物が便利だよ。

435 :デフォルトの名無しさん:2007/01/17(水) 23:30:55
>>410>>412-413
コピーコンストラクタがあるとも限らないから、>>411が良いんじゃないだろうか。


436 :デフォルトの名無しさん:2007/01/18(木) 04:40:26
>>435
>>411 でもコピーコンストラクタは必要なわけだが。

437 :デフォルトの名無しさん:2007/01/18(木) 18:01:19
なるほど。
コピーコンストラクタが無い場合には自前で placement new で初期化する必要アリか・・・

438 :デフォルトの名無しさん:2007/01/18(木) 20:37:54
std::uninitialized_fill_n(ADim, 100, 1234);
ならコピーコンストラクタは要らないんじゃね?

439 :デフォルトの名無しさん:2007/01/18(木) 21:23:21
>>438 うん。要らない。

440 :デフォルトの名無しさん:2007/01/20(土) 10:12:19
>>406には、そういう質問が出てくる段階においては、
C++ではデフォルトコンストラクタが無いクラスの配列は
基本的には無理とするのがベター。

441 :デフォルトの名無しさん:2007/01/20(土) 16:05:24
VC7.1(VisualStudio.NET2003)でコンソールアプリを作成しています。
独自拡張の出力ストリームを以下のように作成しました。(一部省略)


// 拡張ストリームバッファ
class streambuf2
: public std::basic_streambuf< wchar_t, std::char_traits< wchar_t > >
{
public:
// 必要最低限の仮想関数をオーバーライド
}

// 拡張ostream
class ostream2
: public std::basic_ostream< wchar_t, std::char_traits< wchar_t, > >
{
private:
  streambuf2 m_sb2;
public:
  ostream2()
    : std::basic_ostream< wchar_t, std::char_traits< wchar_t, > >( &m_sb2 )
  {
  }
// 特にオーバーライド無し
}


つづく


442 :441:2007/01/20(土) 16:11:48
上記 >>441 のように作成したストリームを用いて
以下のように文字列を出力すると、入力文字列のポインタがうまく判別されず(?)、
文字列のoperatorとは違う関数がよばれ、文字列のアドレスが数字で表示されてしまいます。

ostream2 cout2;
cout2 << L"TestString";

出力結果:00,524,1F0

どうしてこのような現象になってしまうのでしょうか?
原因がわからず困っています。



なお、以下のように二回同じ文字列を出力した場合、二回目は正しく文字列として出力されます。
ostream2 cout2;
cout2 << L"TestString";
cout2 << L"TestString";
出力結果:00,524,1F0 TestString

また、初回をbasic_stringでわたしてやった場合は以後普通に動作するようです。
ostream2 cout2;
cout2 << basic_string< wchar_t >("TestString");
cout2 << L"TestString";
出力結果:TestString TestString


同じ値をそのまま二回渡して呼ばれるoperator関数が、変わる事ってありえるのでしょうか???

443 :デフォルトの名無しさん:2007/01/20(土) 19:38:14
とりあえず/Zc:wchar_tをつけたらどうか?
プロジェクトのプロパティ→C/C++→言語→wchar_tをビルトイン型として扱う

444 :441:2007/01/21(日) 02:24:08
>>443さんに指摘してもらったオプションをON/OFF
切り替えても変化がありませんでした。

なお、同一ソースをlinuxに持っていって実行した所、
上記の問題は発生しませんでした。


もしかしたらVS2003のバグなんだろうか・・・一応SPは当ててあるのですがorz
別の場所でなにかしらのメモリを上書きしてしまっている可能性とかもありえるのかな・・・

445 :デフォルトの名無しさん:2007/01/21(日) 09:35:52
とりあえずデバッグでステップインしたらどうか?

446 :デフォルトの名無しさん:2007/01/24(水) 19:28:50
VC++の例のロケール絡みのバグ?

447 :デフォルトの名無しさん:2007/01/25(木) 15:04:17
std::stringはコピーオンライトだとずっと思ってました・・・
少なくとも私の使ってるGCCでは違いました。ショック!

448 :デフォルトの名無しさん:2007/01/25(木) 15:57:35
copy on write は参照を数えておかなきゃならないから、
マルチスレッド/マルチコア/SMPで効率が悪くなることもあって
ずいぶん前に流行らなくなったような記憶がある。

449 :デフォルトの名無しさん:2007/01/28(日) 23:11:05
>>442>>414のコードは全然書き方違うけど同じC++なんですよね?
よく分かりません

450 :デフォルトの名無しさん:2007/01/28(日) 23:44:06
そのうちわかるさ

451 :デフォルトの名無しさん:2007/01/29(月) 18:23:14
C言語なら俺に聞け(入門篇) Part 6
http://pc10.2ch.net/test/read.cgi/tech/1167325490/

上のスレが埋まったけど、次はここ使うのか?

452 :デフォルトの名無しさん:2007/01/29(月) 18:23:56
って、ここ、C++ のスレだった。
新スレキボンヌ。

453 :デフォルトの名無しさん:2007/01/29(月) 23:42:31
>>452
C言語なら俺に聞け(入門篇) Part 7
http://pc10.2ch.net/test/read.cgi/tech/1170064980/

454 :デフォルトの名無しさん:2007/01/30(火) 01:25:05
>>453
Thanks

455 :デフォルトの名無しさん:2007/02/15(木) 09:58:57
std::iostream から >> で std::string として
文字列を取り出すってことができないのは悲しい。

456 :デフォルトの名無しさん:2007/02/15(木) 10:16:58
いろいろと誤解しているとしか思えない

457 :デフォルトの名無しさん:2007/02/15(木) 19:47:14
勘違いしてました。
#include <string>
じゃなくて #include "string.h"
としていたために、
以前自分が作ったクソ文字列クラスを使ってました。
もちろん >> 演算子なんて定義してませんでした。
テヘッ

458 :デフォルトの名無しさん:2007/02/16(金) 19:48:23
>>457
namespace 使おうぜ

459 :デフォルトの名無しさん:2007/02/16(金) 20:23:26
ぜんぶ orz:: 名前空間に入れよう。
そうしよう。

460 :デフォルトの名無しさん:2007/02/23(金) 18:50:22
C++って、変数cに1足してるんですか?

461 :デフォルトの名無しさん:2007/02/23(金) 19:14:56
いいえ。

462 :デフォルトの名無しさん:2007/02/23(金) 19:56:59
変数Cでしょ

463 :デフォルトの名無しさん:2007/02/23(金) 20:54:27
その理論でいくとC#の#って何の演算なんだ?

464 :デフォルトの名無しさん:2007/02/23(金) 21:51:41
文字列連結だ
CにJavaとかDelphiとかSQLとかくっつける

465 :デフォルトの名無しさん:2007/02/25(日) 00:13:32
>>460
Cの拡張版という意味で++、つまりワンステップ上の、ということでは


466 :デフォルトの名無しさん:2007/02/25(日) 20:54:53
>463
C++++の+4つをくっつけて#じゃないっけ?

467 :デフォルトの名無しさん:2007/02/25(日) 21:07:09
C♯なんだから、半音上がっているんだよ。
もう半音上がったら当然Dだな。

468 :デフォルトの名無しさん:2007/02/25(日) 21:47:08
# って♯(シャープ)じゃなくて#(ナンバー)だよね。
シーシャープじゃなくて、シーナンバーとするべきだ。

469 :デフォルトの名無しさん:2007/02/25(日) 23:06:08
シャープ記号をASCIIに入れなかった昔の偉い人に文句言え。

470 :デフォルトの名無しさん:2007/02/26(月) 00:03:33
C#の#はprotectedのことかと思ってた。


471 :デフォルトの名無しさん:2007/02/26(月) 00:59:19
C# ←犬と木

472 :デフォルトの名無しさん:2007/02/26(月) 01:02:16
次でぼけてっ!

473 :デフォルトの名無しさん:2007/02/26(月) 23:17:05
>>472
(プロデューサーの声)
それだと>>471以前がまともな事言ってたみたいになるけどいいのか?

474 :デフォルトの名無しさん:2007/02/27(火) 23:19:40
倍精度型は変数名に#を後付する、ってならったよ。

475 :デフォルトの名無しさん:2007/02/28(水) 03:33:04
そうそう、単精度は!で文字列は$、整数型にも%を忘れないようにね。

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

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

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)