■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part32
751 名前:デフォルトの名無しさん :04/07/15 11:39
習慣として両方入れてる。

752 名前:デフォルトの名無しさん :04/07/15 11:45
つーかここ1年ぐらい1からヘッダファイル自分で作った記憶がないな。
そんなもんにIDEの仕事だろ?

753 名前:デフォルトの名無しさん :04/07/15 12:02
インクルードガード知らないのって問題あるだろ。

754 名前:デフォルトの名無しさん :04/07/15 12:04
Webで見た限り、冗長インクルードガードなるものの優位性がわからんのだが・・・。
マクロ変数を複数ヘッダーファイルで共有する必要がある時点でアフォだと思う。

755 名前:デフォルトの名無しさん :04/07/15 12:18
>>754
一万行のヘッダファイルがあったとして
冗長なしだとプリプロセッサが数万行処理するのに対して
ありだと一万行で済むとかそういう話じゃないの。
コンパイル速度にはほぼ影響しないだろうね。

756 名前:デフォルトの名無しさん :04/07/15 12:47
コンパイル時間ではなくコーディング時間の短縮こそが
プログラマの努力すべき課題だしね。
エンドユーザにとってコンパイル時間なぞどうでもいいし。

757 名前:デフォルトの名無しさん :04/07/15 12:54
プリプロセッサって
#if 0〜#endifの領域ってどう処理するんだっけ?
コメントと同様にスペースに置換?

758 名前:デフォルトの名無しさん :04/07/15 12:56
コンパイラに依存する処理を、具体的な製品名を上げずに、そこで質問して何を得ようというのか、
分かりやすくかつ明確に答えてください。

759 名前:デフォルトの名無しさん :04/07/15 13:47
配列の初期化で

char buf[100] = {0};

とやると、最初の要素の後ろが全て0で初期化されると聞いたことがあるんですけど
これは言語規格で定められているんですか?
VC++6.0ではそのようなコードが吐かれているのを確認したのですが…

760 名前:デフォルトの名無しさん :04/07/15 13:55
>>759
その通りに規格で決められています。構造体も然り。

761 名前:デフォルトの名無しさん :04/07/15 13:59
>>757
#if 0と#endifの行自身も含め改行文字以外を削除。
一応#if 0と#endifの中もソースコードの扱いなのでその中でもコメントなどは認識される。

762 名前:760 :04/07/15 14:19
>>760
ありがとうございました。
今までmemsetとかstd::fillでやってましたが
こっちの方が見た目すっきりしてていいですね。

763 名前:デフォルトの名無しさん :04/07/15 14:25
>>762
指定しただけプログラムのサイズが増えるからやめとけ。

764 名前:デフォルトの名無しさん :04/07/15 14:31
サイズくらいきにすんなよ〜


765 名前:デフォルトの名無しさん :04/07/15 14:32
>>764
むしろサイズこそ全て。

766 名前:デフォルトの名無しさん :04/07/15 14:35
無駄に無駄を許容するのはC++の美徳に反するな

767 名前:デフォルトの名無しさん :04/07/15 14:37
10倍に?

768 名前:デフォルトの名無しさん :04/07/15 14:48
volatileの扱いですが

struct A {
 void func() {
  i=1; //(1)
  i=2;
 }
 volatile int i; //(2)
};
A a;
void main() {
 a.func();
}

a) VC7.1で上のコードをそのまま実行するとfuncがmain内に
inline展開されるんだけど、(1)のコードが実行されていない模様。
b) (1)を何度も繰り返した場合、inline展開されずfunc内で全ての
代入が行われている。
c) (2)を非volatileにした場合、a/b)のいずれの場合でも(1)は省略される。
d) (2)をvolatileのままグローバル変数に移動するとa/b)のいずれの場合でも
(1)は省略されない。

私のイメージとしては(b)〜(d)は正しく、(a)がおかしいような
気がするのですが。これって
i) VCのバグor仕様
ii) C++の仕様(メンバ変数にvolatileつけるのが間違ってる)。
のどっち?


769 名前:デフォルトの名無しさん :04/07/15 15:25
volatile A a;

770 名前:768 :04/07/15 15:33
>>769
それでもa)に関しては結果変わらず。

771 名前:デフォルトの名無しさん :04/07/15 16:28
#include <stdio.h>
int a;
int main()
{
char str[127];

printf("文字列を入力してください(127文字以内)\n");

scanf("%s",str);

for(a=0;a<128;a++){

str[a]=str[a]+1;

printf("\t%s!\n" , str);
}
return 0;
}

これってどうよ?

772 名前:デフォルトの名無しさん :04/07/15 16:32
>>771
バッファのサイズが小さくない?

773 名前:デフォルトの名無しさん :04/07/15 16:36
>>771
-for(a=0;a<128;a++){
+for(a=0;a<127;a++){


774 名前:デフォルトの名無しさん :04/07/15 16:44
str[a] = str[a] + !!str[a]; の方が良くない?

775 名前:デフォルトの名無しさん :04/07/15 17:00
>>771,774
これは一体何をしたいの?


776 名前:デフォルトの名無しさん :04/07/15 17:41
グローバル変数にしてる意味はなに?

777 名前:デフォルトの名無しさん :04/07/15 17:59
>>768
volatileに定義などない!


778 名前:デフォルトの名無しさん :04/07/15 18:07
>>771
>scanf("%s",str);
sgets(str, sizeof str / sizeof *str, stdin);かscanf("%127s", str);
>str[a]=str[a]+1;
str[a]++;かstr[a] += 1;
>int a;
どうでもいいがループカウンタの変数は i が一般的
for (int i = 0; i < sizeof str / sizeof *str; i++)

779 名前:デフォルトの名無しさん :04/07/15 18:10
仕事じゃiなんか使わないけど

780 名前:デフォルトの名無しさん :04/07/15 18:14
ひでえ仕事だな

781 名前:デフォルトの名無しさん :04/07/15 18:14
本当にどうでもいいな

782 名前:デフォルトの名無しさん :04/07/15 18:19
>>768
むしろ最適化を切ってみたらどうか?

783 名前:デフォルトの名無しさん :04/07/15 18:22
>>779
まさかiCountとか...(((( ;゚Д゚)))ガクガクブルブル
キモスギル

784 名前:デフォルトの名無しさん :04/07/15 18:24
だからiの話はするなとあれほど言ったのに・・・

785 名前:デフォルトの名無しさん :04/07/15 18:26
>>775
たぶん >>774 は、末尾の '\0' に1足さないようにするため。

786 名前:デフォルトの名無しさん :04/07/15 18:39
idxじゃだめ?

787 名前:デフォルトの名無しさん :04/07/15 18:40
ローカル変数にはtheを付ける。
theIdxみたいな感じ。

788 名前:デフォルトの名無しさん :04/07/15 18:47
マジかよ

789 名前:デフォルトの名無しさん :04/07/15 18:49
適当な名前付けでわかりにくくならない?


790 名前:デフォルトの名無しさん :04/07/15 18:56
ローカルの l をつけて混乱させる
li1とか

791 名前:デフォルトの名無しさん :04/07/15 18:57
メンバ変数の接尾辞には_付ける・
ローカル変数は普通に。
グローバル変数はglobal名前空間の中に。
ループ変数はi,j,k…
但しループさせるのがx,y座標だったらx,y

792 名前:デフォルトの名無しさん :04/07/15 18:57
グローバル変数にはgを付ける。
gFlagみたいな。


793 名前:デフォルトの名無しさん :04/07/15 18:58
分かりにくい書き方しちゃったけどglobal名前空間は
::
じゃなくて
global::
の事ね。

794 名前:デフォルトの名無しさん :04/07/15 18:59
あとでエディタの一括文字列変換とか使うときに、
そこそこ冗長な名前にしておいたほうが都合がいいことがあった。
だから、あまりiとかjとかって短いのは抵抗があるな〜。

795 名前:デフォルトの名無しさん :04/07/15 19:00
>>791
オレも同じ。
あと変数名は単語の区切りには_使う
メンバ関数名は最初は小文字、その他各単語の最初は大文字
母音を省略するような真似はしない

796 名前:デフォルトの名無しさん :04/07/15 19:02
変数の役割によってなんか付ける。
Cnt・・・カウンタ。例:LoopCnt
Tbl・・・テーブル、配列。例:DataTbl[ ...]

797 名前:デフォルトの名無しさん :04/07/15 19:16
>>785
なるほど.774のアドバイスの意図は分かりました.
が,771は一体何なんだ?
774がレスしてるので分かってるのかと思い振ってみたのだけど.


798 名前:デフォルトの名無しさん :04/07/15 19:18
iCounterってキモイ?
結構やってる人、多いんじゃない?

799 名前:デフォルトの名無しさん :04/07/15 19:18
>>797
たんに「ROT1 を動かしてみて、文字コードというものについて実体験しましょう」
ってあたりじゃないのかなぁ。(rot1 は rot13 からの造語ね)

800 名前:デフォルトの名無しさん :04/07/15 19:19
>>798
あんましいないだろ。

801 名前:デフォルトの名無しさん :04/07/15 19:21
>>798
漏れ的には "i" には強くインデクサっぽい意味を感じてしまうので、
個人的にはカウンターとか個数とかには絶対使わない。

インデックサじゃないカウンタや個数は cほにゃらら、にする。

802 名前:デフォルトの名無しさん :04/07/15 19:21
自分の世界が全世界

803 名前:デフォルトの名無しさん :04/07/15 19:22
iはインターフェース

804 名前:デフォルトの名無しさん :04/07/15 19:22
Windowsプログラミングならね...

805 名前:デフォルトの名無しさん :04/07/15 19:23
>>803
大文字でしょ?

806 名前:デフォルトの名無しさん :04/07/15 19:25
>>803
Iだろ

807 名前:デフォルトの名無しさん :04/07/15 19:25
iは世界共通の愛

808 名前:デフォルトの名無しさん :04/07/15 19:26
int i;

ってやるとコンパイルエラーになるんですけど...orz

809 名前:デフォルトの名無しさん :04/07/15 19:26
なんか空きが長いぞ

810 名前:デフォルトの名無しさん :04/07/15 19:27
全角スペースでした。逝ってきます...0rz

811 名前:デフォルトの名無しさん :04/07/15 19:28
std::string str;
char chr;
int integer;
double real;

812 名前:デフォルトの名無しさん :04/07/15 19:28
>>810
なんか顔が長いぞ。


813 名前:デフォルトの名無しさん :04/07/15 19:29
doubleを打ち込むとき、今でも「どうぶる」と
口ずさみながらキーボード叩いてます。
そんな人は私以外にも全世界に3人はいると思います。

814 名前:デフォルトの名無しさん :04/07/15 19:30
なんだか今日はほのぼのしているスレですね

815 名前:デフォルトの名無しさん :04/07/15 19:31
charはキャラだよ

816 名前:デフォルトの名無しさん :04/07/15 19:31
integerって昔、ホンダが車出してなかたっけ?


817 名前:デフォルトの名無しさん :04/07/15 19:32
それを言うなら、integra?
スペル間違えたかも。まあ、確かに紛らわしいが。

818 名前:デフォルトの名無しさん :04/07/15 19:34
トヨタはキャピだっけ?

819 名前:デフォルトの名無しさん :04/07/15 19:41
>>813
私もです。


820 名前:デフォルトの名無しさん :04/07/15 19:47
                \ │ /
                 / ̄\  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< ストゥディオ!
                 \_/  \_________
                / │ \
                    ∩ ∧ ∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ ∩∧ ∧∩\( ゚∀゚)< ストゥディオ!
ストゥディオ〜〜〜〜! >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」
               ̄     / /


821 名前:デフォルトの名無しさん :04/07/15 20:10
いてらとら

822 名前:デフォルトの名無しさん :04/07/15 20:14
>>813
俺もだ

823 名前:デフォルトの名無しさん :04/07/15 20:24
こうと

824 名前:デフォルトの名無しさん :04/07/15 20:29
2つの行列の計算を行うプログラムがわかりません;;
教えて欲しいです。2行2列で。

825 名前:デフォルトの名無しさん :04/07/15 20:31
宿題はすれ違い

826 名前:デフォルトの名無しさん :04/07/15 20:32
Javaってなんの言語で出来てるの。
C++で出来てるって聞いたけどホント?

827 名前:デフォルトの名無しさん :04/07/15 20:46
JavaはJava言語でできてます。
Javaコンパイラが何でできてるかは、コンパイラを作った会社に聞いてください。

828 名前:デフォルトの名無しさん :04/07/15 20:53
だっせー

829 名前:デフォルトの名無しさん :04/07/15 21:17
Java3Dは何でできてるの?

830 名前:デフォルトの名無しさん :04/07/15 21:20
赤ちゃんはどうやってできるのぉ?

831 名前:デフォルトの名無しさん :04/07/15 21:38
コウノトリさんがはこんでくるのぉ

832 名前:デフォルトの名無しさん :04/07/15 22:18
std::string s;

s.c_str() が返すアドレスと &*s.begin() で得られるアドレスは
同じことは保証されているんでしょうか?
それとも実装依存ですか?

833 名前:デフォルトの名無しさん :04/07/15 22:22
>>832
保証されてない

834 名前:デフォルトの名無しさん :04/07/15 22:40
>>832
前者はconst char*で後者はiteratorが返るんだ。違って当然。

835 名前:デフォルトの名無しさん :04/07/15 22:42
>>834
ha?

836 名前:デフォルトの名無しさん :04/07/15 23:15
>>834
すげえ知ったかですね

837 名前:デフォルトの名無しさん :04/07/16 00:02
>>834
>&*s.begin() で得られるアドレス

838 名前:834 :04/07/16 00:04
攣れた!

839 名前:デフォルトの名無しさん :04/07/16 00:11
でました。苦し紛れの釣り宣言。みっともないね。

840 名前:デフォルトの名無しさん :04/07/16 00:16
また釣れたw

841 名前:839 :04/07/16 00:21
釣れた!

842 名前:デフォルトの名無しさん :04/07/16 00:24
      ゃ    こ
    じ             の
 
 ん                   ス

な         ぁ   っ         レ
       ぁ         !
                       は
      ぁ      !  !
                      あ
      ぁ
                    あ
         ぁ       あ
             ぁ

843 名前:デフォルトの名無しさん :04/07/16 00:26
日本で一番早く梅雨が明けたスレはここです

844 名前:デフォルトの名無しさん :04/07/16 00:32
BCC5.5を使っています。
メニューをクリックしたら画面に文字を出力するプログラムを組んでいます。
でも、どうしても画面に出力した文字が ¢ になってしまいます。
どうしてでしょうか。

845 名前:844 :04/07/16 00:33
嗚呼しもた。
Windowsアプリケーションを作っています。

846 名前:デフォルトの名無しさん :04/07/16 00:45
一時オブジェクトの寿命なのですが

class A
{
public:
void func() { /* 処理 */ }
};

A& hoge(A& a)
{
return a;
}

hoge(A()).func();

VC++6.0の場合、funcが呼び出しが終わった後に一時オブジェクトのデストラクタが走りました。
また、
hoge(A()), hoge(A());
としたら、2番目のhogeのA()のデストラクタ→最初のA()のデストラクタ、となりました。

ということは、一時オブジェクトの解体は ; までの処理が終わったときに行われる
という解釈でいいのでしょうか?



847 名前:デフォルトの名無しさん :04/07/16 01:09
>>846
そだよ。

848 名前:デフォルトの名無しさん :04/07/16 01:15
>>847
ありがとうございました。
今まで意識したこと無かったのですが、うまいことできてますねC++って。

849 名前:デフォルトの名無しさん :04/07/16 01:22
>>834は正しいんじゃないのか?
ANSI準拠が進んだVC.NETで試してみ。別物として弾かれるはずだ。

850 名前:849 :04/07/16 01:26
記憶違いだった。

851 名前:デフォルトの名無しさん :04/07/16 02:18
記憶とかの問題じゃないから

852 名前:デフォルトの名無しさん :04/07/16 02:25
>>822
全世界であなたで3人目です。


853 名前:デフォルトの名無しさん :04/07/16 02:48
>>852
探せばあるものだ
ttp://www7.plala.or.jp/imajo/ke/samp/samp06.html

854 名前:デフォルトの名無しさん :04/07/16 04:06
>>853
感動をありがとう

855 名前:デフォルトの名無しさん :04/07/16 05:26
ドウブル型ワロタ

856 名前:デフォルトの名無しさん :04/07/16 08:13
>>853
よく見つけた(w

857 名前:デフォルトの名無しさん :04/07/16 09:05
ドイツ語ではドウブルと読むはず。

858 名前:デフォルトの名無しさん :04/07/16 10:00
どうぶるではなく、どうぶれな俺は1人目。

859 名前:デフォルトの名無しさん :04/07/16 10:31
>>857のアフォな提言に触発されてググってしまった。
ドイツ語ではdoubleではなくdoppel。

以後、ドッベル型でおながいします。

860 名前:デフォルトの名無しさん :04/07/16 10:40
ちなみに英字郎(http://www.alc.co.jp/)でdoubleを引くと
・ double
【名-4】 《音楽》ドゥーブル(の曲)
なんて意味もある.


861 名前:デフォルトの名無しさん :04/07/16 10:45
ドッペルゲンガーの「ドッペル」ってそういう意味かあ。
勉強にナルネ。


862 名前:デフォルトの名無しさん :04/07/16 11:02
>>860
フランス語圏ではド(ゥ)ーブル。

863 名前:デフォルトの名無しさん :04/07/16 11:14
もしかしてドイツ語対応のC++コンパイラなんてあるのかな?
とふと思ったりして。

864 名前:デフォルトの名無しさん :04/07/16 11:15
ウムラウトとかめんどいかも。
標準ライブラリの関数名もドイツ語とか。
ああ、また一から勉強かよ...orz

865 名前:デフォルトの名無しさん :04/07/16 11:19
つまんね

866 名前:デフォルトの名無しさん :04/07/16 11:31
>>863
なかったらドイツ人どうするんだよ

867 名前:デフォルトの名無しさん :04/07/16 11:59
へ、あんの?

868 名前:デフォルトの名無しさん :04/07/16 12:14
オンドゥル語コンパイラも作って

869 名前:デフォルトの名無しさん :04/07/16 13:05
VC6からVC2003ToolKitにかえたら
テンプレート引数に浮動小数点型が指定出来なくなりました。
どうやらISOに準拠した為なんですが、なぜそうなったのでしょう?
何か理由があるんですか?

template< float f > ← エラー

870 名前:デフォルトの名無しさん :04/07/16 13:18
>>869
コンストラクタの引数に取ればいいだけじゃないか。

ただ、それだとそれを添え字にする配列を作ったりできないし、
型名を引数に取ってその型の変数を作ることもできない。
だからテンプレートって仕組みでやれるようにした。
逆にそれ以外はテンプレートの出番じゃないってこと。

871 名前:デフォルトの名無しさん :04/07/16 13:39
#include <stdio.h>

int a;

int main()
{
char str[128];

for(a=0;a<128;a++){


printf("文字列を入力してください(127文字以内)\n");
scanf("%s",str);
if(str[a]==NULL)
{
break;
}
str[a] = str[a]+1 ;
printf("\t%s!\n" , str);

}

return 0;

}

872 名前:デフォルトの名無しさん :04/07/16 13:56
>>871
#include <stdio.h>
int main()
{
 char str[128];
 printf("文字列を入力してください(127文字以内)\n");
 scanf("%127s",str);
 for(int i = 0; i < 127; i++)
  if(str[i] == '\0')
   break;
  else
   str[i]++;
 printf("\t%s!\n" , str);
 return 0;
}

873 名前:デフォルトの名無しさん :04/07/16 14:08
std::basic_stringのことなんですが
VC6に付いてる<string>を見ると

std::string a("abc"), b;
b = a;

とすると、aとbが保持する文字列の実体は同一で、参照カウンタで文字列の実体の寿命を管理してました。
参照カウンタはクリティカルセクション等で保護されてないようなので
a, bを別々のスレッドで同時に操作すると危険ですよね?
また、

std::string a("abc"), b;
b = a.c_str();

とすると、a, bが保持する文字列実体は別々になるようです。

こういう振る舞いを定義してる規格とかあるのでしょうか?

スレッドに渡す文字列を上の b = a; のように渡すと危ないですよね。
かといって b = a.c_str(); として、別の実体が作られることを期待していいものかどうか…

ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrfthreadsafetyinstandardclibrary.asp
>For writes to different objects of the same class, the object is thread safe for writing:
>・From one thread when no readers on other threads.
>・From many threads.

これには安全だと書いてありますが、上の b = a; では当てはまらないのではないでしょうか?

874 名前:デフォルトの名無しさん :04/07/16 14:39
>>873
http://support.microsoft.com/default.aspx?scid=kb;en-us;813810


875 名前:デフォルトの名無しさん :04/07/16 14:41
日本語のもあった
http://support.microsoft.com/default.aspx?scid=kb;ja-jp;813810

876 名前:873 :04/07/16 15:55
>>874-875
まさにこれですね。
いずれ.NETを買うつもりですがとりあえず
前から入れようと思ってたSTLPortを入れてみます。
ありがとうございました。

877 名前:デフォルトの名無しさん :04/07/16 18:44
C++ では stdio をやめて、sprintf とかでも ostringstream にした方がいいですか?
Effective C++ では stdio とは決別すべきと書いてあったのですが、イマイチ踏み切れません…

878 名前:デフォルトの名無しさん :04/07/16 18:58
ostringstreamがそんなに嫌いならboost::formatを使え。
sprintfがどうしても使いたいならsnprintfを使え。

879 名前:デフォルトの名無しさん :04/07/16 19:06
あ、嫌いじゃないですよ。全然。
ただ MS とかのコード見ててもあまり登場しないもんだから
なんか問題があるんじゃないかと思ってたわけです。。

880 名前:デフォルトの名無しさん :04/07/16 20:03
printf 系の場合、

string s = "aaaaa";
printf( "%d", s );

とかやってもコンパイルエラーにならない。
その点、basic_ostream 系ならば、そのあたり適切に判定してくれるし、
自分で型定義もできて便利。

881 名前:デフォルトの名無しさん :04/07/16 20:15
>>832
ランダムイテレータ の場合、ita と itb をランダムイテレータだとすると、

ita == itb; が true の場合、
*ita == *itb; が true を返すことは企画上保障されているが、
&*ita == &*itb; にかんしては規程されていない。

たとえば、UTF-8 文字列に対応した、UTF-8 Iterator itu があったとして、
*itu が UCS-4 のコードポイントを int で返したとしてもそれは問題ない。


882 名前:881 :04/07/16 20:15
でも、>>832 は、std::string についていっているわけだから、
最後の2行は余計か。スマンな

883 名前:デフォルトの名無しさん :04/07/16 22:13
おまいら、printf が好きですね

884 名前:デフォルトの名無しさん :04/07/16 22:27
今のところprintfが最強だからね。

885 名前:デフォルトの名無しさん :04/07/16 22:59
printzが最強

886 名前:デフォルトの名無しさん :04/07/16 23:19
>>869
template<float &f> に汁

887 名前:デフォルトの名無しさん :04/07/17 00:45
「クラスAとクラスBの関連」をC++で実装する場合
これで良いのでしょうか?

class B;

class A{
    B* related_b_ptr;
public:
    A( B* b_ptr ){ related_b_ptr = b_ptr; }
};

class B{
    A* related_a_ptr;
public:
    B( A* a_ptr ){ related_a_ptr = a_ptr; }
};

関連全てにこんな事やるのは面倒ですし、感覚として間違っている
気がするのですが、代替手段が分からないんです。

例えば引数でその都度、関連クラスを渡したりすのは、第3のオブジェクトが
無理矢理必要なこともあって、全然オブジェクト指向じゃなくなる気がします。

関連って実際はどんな事なんでしょうか。

888 名前:デフォルトの名無しさん :04/07/17 00:49
>>887
class A のインスタンスをどうやって作るんだ?

889 名前:デフォルトの名無しさん :04/07/17 00:50
>>887
friendクラスとか、入れ子クラスは?

890 名前:デフォルトの名無しさん :04/07/17 00:52
>>887
(889の続き)
どーせ、モロ依存しまくりなら
変に分離して書こうとすること自体間違ってる

891 名前:デフォルトの名無しさん :04/07/17 00:53
>>887
クロコクラスとか、グレコクラスとか

892 名前:デフォルトの名無しさん :04/07/17 01:14
>>887
UMLでいうところのnavigabilityが双方向ならそれでいいんじゃないですか?
「感覚として間違っている」のは、
実装方法ではなくnavigabilityが双方向であることだと思います。
循環依存ですから(それが必要なことももちろんある)

navigabilityが片方向なら、メンバとして持つなり
1対多ならコレクションでもつなりの実装方法があります。

生成は、包含なら包含元クラスで行いますし、
そうでない関連ならどこかに生成元がいるはずです。

893 名前:デフォルトの名無しさん :04/07/17 09:52
>>834
>>834
>>834
>>834

894 名前:887 :04/07/17 10:30
すいません、すぐレス頂けるとは思わず。
皆さんレスありがとうございました。

>>888-891
インスタンスはポインタを介してなどでしょうか。
疑問に思っていた関連とは、どこにでもあるありふれた関連の事だったんです。
なのでfriendや入れ子は更に大げさかなと。

>>892
おかげで良く分かりました。言われてみれば関連といえど、その実態はほとんど全てが
片方向でした。難しいだけと思っていた専門用語が、ここまで便利とは…。

生成について、しばしばパターンなどと一項目あげて大げさに
取り上げられている理由も、合わせて理解できた気がします。

895 名前:デフォルトの名無しさん :04/07/17 10:58
char_traitsを見てて疑問に思ったのですが
char(0), char() と '\0'、wchar_t(0), wchar_t() と L'\0' は
等しくなることが保証されているんでしょうか?


896 名前:デフォルトの名無しさん :04/07/17 13:21
#include <iostream>

class A {
public:
  static int main() {
    std::cout << "main" << std::endl;
    return 0;
  }
};

int main = A::main();

何気なく書いてみたのですが、これが動いてしまう理由がわからないです。
int main = A::main(); と書いてるのにコンパイルできてしまうってことは、
mainはデフォルトで関数ポインタとして扱われるということでしょうか?

897 名前:デフォルトの名無しさん :04/07/17 13:40
>>896
初期化付きのグローバル変数なだけだろ。


898 名前:デフォルトの名無しさん :04/07/17 13:47
>896
これだとメイン2回実行されるの?
手元に今コンパイラないのでわかんね

899 名前:デフォルトの名無しさん :04/07/17 13:47
>int main
ってかいといて何言ってんだよw

900 名前:デフォルトの名無しさん :04/07/17 13:48
>>896
コンパイルはできるのはわかるけど動く?
mainが未解決とでるんだけど。

901 名前:デフォルトの名無しさん :04/07/17 13:49
>>896
リンカーはmainへ実行を移すコードcrt.oとリンクするけどmainの中は0が入ってる
その後ろに何があるかは環境による。
C++の処理系はmainと言うグローバル変数の初期化をcrt.oがmainを呼ぶ前に実行する
これがA::main()を実行しているのでメッセージは出力される。


902 名前:デフォルトの名無しさん :04/07/17 13:53
vector< char > v( istream_iterator< char >( cin ), istream_iterator< char >() );
が関数宣言になる使用を思い出したのは漏れだけではないはず

903 名前:デフォルトの名無しさん :04/07/17 15:12
何故コンパイルエラーになるか分かりません。

#include <iostream>
#include <algorithm>

struct A {
int x;
int y;
bool operator<(struct A a) {
if(this->x != a.x)
return this->x < a.x;
else
return this->y < a.y;
}
};

int main()
{
const int size = 100;
struct A a[size];
sort(&a[0], &a[size]);
return 0;
}

904 名前:デフォルトの名無しさん :04/07/17 15:13
エラーメッセージ

/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h: In function `const struct A & __median<A>(const A &, const A &, const A &)':
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:1283: instantiated from `__introsort_loop<A *, A, int>(A *, A *, A *, int)'
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:1320: instantiated from here
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:46: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:47: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:49: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:53: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:55: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers


905 名前:896 :04/07/17 15:13
レスどうもでした

>>898
1回だけ"main"と表示して終了するだけです。

>>900
bccでコンパイルして実行確認しました。

>>901
解かりやすい説明ありがとうございました。
プログラムの実行の仕組みとかも調べると、より理解も深まって面白そうですね。

>>902
使い方など、ぱっと見何だかわからないです。
勉強が必要ですね。


906 名前:デフォルトの名無しさん :04/07/17 15:25
>>903
- bool operator<(struct A a) {
+ bool operator<(const struct A &a) const{


907 名前:896 :04/07/17 15:33
恩返しにと>>903にレスしようと思ったら、既にされてましたね。
g++ではなくbccのコンパイラだと>>903みたいのでもコンパイルできてしまったりして、
環境による大きく依存があるのだなぁと感じました。

そこで、さきほどの>>896のプログラムも少し試してみました。
bccでコンパイルしてWindows上で実行すると気づかなかったのですが、
g++でコンパイルしてLinux上で実行すると、"main"を表示したあと、
Segmentation faultで落ちてました。
これは>>901を参考に解釈すると、A::main()が実行されたあとに、
mainの後ろの不定な領域を実行しようとして落ちたという認識で良いのでしょうか?

908 名前:デフォルトの名無しさん :04/07/17 16:01
>>895 OK

909 名前:デフォルトの名無しさん :04/07/17 16:07
>>906
>sort(&a[0], &a[size]);
std::sort(&a[0], &a[size]);


910 名前:デフォルトの名無しさん :04/07/17 16:12
>>907
> mainの後ろの不定な領域を実行しようとして落ちたという認識で良いのでしょうか?
正解。

911 名前:906 :04/07/17 16:17
>>909
2.95.3


912 名前:デフォルトの名無しさん :04/07/18 00:09
CHoge a,b,c;

c = a + b;
をできるように

CHoge& CHoge::operator+(CHoge& hoge)
{
CHoge tmp;
tmp.value = (*this).value + hoge.value;
return tmp;
}

なんてoperatorを書いたのですが、一時オブジェクトの参照を
返してもいいんですかね?


913 名前:デフォルトの名無しさん :04/07/18 00:17
this->valueとかけよ。

914 名前:デフォルトの名無しさん :04/07/18 00:32
>912
CHoge のデストラクタで value = 0 と代入してみ

915 名前:デフォルトの名無しさん :04/07/18 00:41
>>912
自分で参照とか言ってるのに何言ってんの?

916 名前:912 :04/07/18 00:45
解決しました

917 名前:デフォルトの名無しさん :04/07/18 03:27
一番最悪なパターンですね

918 名前:デフォルトの名無しさん :04/07/18 03:30
なんか発情してきました
どうすればいいですか?

919 名前:918 :04/07/18 03:33
解決しました

920 名前:デフォルトの名無しさん :04/07/18 03:37
早漏ですね

921 名前:デフォルトの名無しさん :04/07/18 08:22
もしかするとすれ違いかもしれませんが、一応C++で開発してますのでこちらに質問させてください。

いま引数リスト付のログ用関数を次のように考えました。
bool LogOut(char * file, int line, char * func, int type, char * fmt, ...);

ここでこの関数をマクロでもっと簡単に呼びたいのですが引数リストの部分をどうしたら良いか分りません。
次のような感じでマクロ化したいのですが良い方法はないでしょうか?

#define LOGERROR(s) LogOut(__FILE__, __LINE__, FUNCNAME, LOGTYPE_ERROR, s);
(最後のsの部分以降が関数のプロトタイプと食い違いますよね?)

よろしくお願いします。


922 名前:デフォルトの名無しさん :04/07/18 08:50
>>921
それでいい。
ただしマクロを使うときにLOGERROR((1,"234",4.5))のように括弧を二重にする。
あとセミコロンは取り除いた方がいい。

923 名前:921 :04/07/18 09:17
レス、ありがとうございます。
でも
LOGERROR( ("ファイル名が長すぎます。長さ:%d", strlen(fname) ) );
としたところ、

error C2664: 'LogOut' : 5 番目の引数を 'unsigned int' から 'char *' に変換できません。
となってしまいました。

書き忘れましたがVC++6.0SP6です。


924 名前:デフォルトの名無しさん :04/07/18 09:45
漏れなら以下の様にする。自慢じゃないが試してない。

void _WriteLocate(const char* fname, int pos);
void _WriteContent(const char* fmt, ...);

#define LOGERROR _WriteLocate(__FILE__, __LINE__);_WriteContent

925 名前:デフォルトの名無しさん :04/07/18 09:48
>>923
#define LOGERROR(fmt,s) LogOut(__FILE__, __LINE__, FUNCNAME, LOGTYPE_ERROR,fmt,s)

LOGERROR("ファイル名が長すぎます。長さ:%d",(strlen(fname)));
この例みたいに1つなら囲まなくてもいいけど。

926 名前:デフォルトの名無しさん :04/07/18 10:04
>>924-925
ありがとうございます。
>>925さんの指摘どおりにLOGERRORにfmtをマクロに追加し、
カッコで囲むことで出来ました。



927 名前:デフォルトの名無しさん :04/07/18 12:16
vc++5でLANでつながっている10台のパソコンに、
ファイルを作成しようとしています。
しかしファイルが作成できるパソコンと出来ないパソコンがあります。
ファイルが作成出来なかったパソコンに対し
エクスプローラではファイルを作ることはできます。
どうしてvc++5ではファイルを作れなくて
エクスプローラでは可能なのかわかりません。

ファイルは次の様に作ろうとしています。
fopen("\\\\target\\folder\\test.txt,"w");

コンパイラはvc++5.0です。
OSは作成元がWIN XP(PRO)、
作成先はXP(home)や2000です。


928 名前:デフォルトの名無しさん :04/07/18 14:51
>>927
スレ違い。
ちなみにエクスプローラはコソーリとコネクションを張る処理をしているから同じことをしてやればいいだけ。
難しい処理じゃないから(APIを一つ呼ぶだけ)、自力で頑張ってみそ。
どうしてもわからんかったら今度は他所で質問すれ。

929 名前:デフォルトの名無しさん :04/07/18 16:09
T* ptrArray[];
T Array[];
があった時、
ptrArrayの指す実体をArrayにコピーできるようなSTLアルゴリズムはありますか?

for(int i=0; i</*prtArrayのサイズ*/; ++i)
{
 Array[i] = * ptrArray[[i];
}
をもう少しSTL的にできないかと言う事です。

copy(ptrArray, ptrArray + /*ptrArrayのサイズ*/, Array);
みたいな感じで。

930 名前:デフォルトの名無しさん :04/07/18 16:50
generate

931 名前:デフォルトの名無しさん :04/07/18 16:53
>>929
boostがあるなら,indirect_iteratorを使って

std::copy(boost::indirect_iterator(ptrArray),
boost::indirect_iterator(ptrArray + /*ptrArrayのサイズ*/),
Array);

とか,Boost.Lambdaを使って

std::transform(ptrArray, ptrArray + /*ptrArrayのサイズ*/, Array, *_1);

とかですかね.boostが無ければ上のtransformのヤツの最後の引数を
ファンクタで書き換えてくださいな.

932 名前:?w?? :04/07/18 18:44
int x=10;

int *p=new int;
*p=10;
についてなんですが…
後者の省略形が前者ということ?
ってか後者の書き方が面倒くさいから、前者が生まれたのか?
なんか前者の書き方ってC++らしくない希ガス。

933 名前:デフォルトの名無しさん :04/07/18 18:47
全く違いますよ。

934 名前:デフォルトの名無しさん :04/07/18 18:49
ネタにマジレス

935 名前:?w?? :04/07/18 18:51
>>933
前者は変数にxという名前がつく点が違うってことすか。
そもそも後者のpの指す領域には指定された名前がないわけですし。
それ以外にも違いがあるんすか。

936 名前:935 :04/07/18 18:53
>前者は変数にxという名前がつく点が違うってことすか。

というより、
変数→確保された領域

937 名前:デフォルトの名無しさん :04/07/18 18:54
前者はスタック上に置かれた変数xを10で初期化
後者はヒープ上に確保された領域をポインタ変数pに保存後
その領域に10を格納するという意味です。

938 名前:デフォルトの名無しさん :04/07/18 19:01
スタックのないマシンならどうなる?

939 名前:932 :04/07/18 19:01
>>937
なるほど。スタックかヒープかの違いもあるわけだ。
(まぁスタックとかヒープがなんたらか、よくわかなんのですが、
メモリにそういう領域があるってことは想像出来ます。まぁその
辺りは調べてみます。)
さんくす。

940 名前:デフォルトの名無しさん :04/07/18 19:22
>>938
ソフトでスタック作ってそれを使うか、最適化次第ではレジスタで済ます。

スタックを一切使わない・作らない処理系の実装ってあるんかな?

941 名前:デフォルトの名無しさん :04/07/18 19:45
>>938
少なくともC/C++(のソースをコンパイルしたもの)が動いて
スタックのないマシンなんて聞いたことがないんだが、
実際にそういうマシンがあるなら参考までに教えて欲すぃぽ。

942 名前:デフォルトの名無しさん :04/07/18 19:59
スタックって、ハードウェアスタックのことか?
それとも GETMAIN とかでバックアップのチェインを作ってるのも含むのか?

943 名前:デフォルトの名無しさん :04/07/18 20:08
C++ で C の getch に相当する関数ってあります?

944 名前:デフォルトの名無しさん :04/07/18 20:19
> C++ で C の getch に相当する関数ってあります?
getch

945 名前:デフォルトの名無しさん :04/07/18 20:48
>>937
スタックやヒープなんて低レベルで実装依存な話をする以前に、インスタンスが破壊
されるタイミングが違う。

946 名前:guru ◆BFP4DgQ4Jg :04/07/18 23:43
継承されたクラスのコンストラクタは基底クラス→派生クラス
の順に実行されますが、下記のようなクラスを考えた場合

Derived d(777);
を実行すると、確かに
Base(int x)
Derived(int x)
と実行される。

派生クラスのコンストラクタが実行されたときに初期化子によって
もう一回Base(int x){}が実行されそうですが、実際には実行されません。

この件について私とディベートできる方いませんか?

class Base
{
public:
Base(){}
Base(int x){}
};

class Derived : public Base
{
public:
Derived(){}
Derived(int x):Base(x){}
};


947 名前:デフォルトの名無しさん :04/07/18 23:54
ちょっとだけワロタ

948 名前:デフォルトの名無しさん :04/07/18 23:56
>946
何かの釣りか?

>派生クラスのコンストラクタが実行されたときに初期化子によって
まず基底クラスのコンストラクタを起動した後、
派生クラスの部分の初期化がなされるんだから、何ら不思議もないんだが。

949 名前:guru ◆BFP4DgQ4Jg :04/07/18 23:58
じゃあ、
Base(){}
Base(int x){}
のどちらを実行するでしょうか?
また、その理由は?

950 名前:デフォルトの名無しさん :04/07/19 00:02
引数がなければ前者を、あれば後者をつかう
だけのこと

951 名前:guru ◆BFP4DgQ4Jg :04/07/19 00:06
>>950
ばかは引っ込んでて!

952 名前:デフォルトの名無しさん :04/07/19 00:10
関数のオーバーロードも知らんのか?

953 名前:デフォルトの名無しさん :04/07/19 00:10
引っ込んでるけど、俺がばかな理由を
教えてくれんか?

954 名前:デフォルトの名無しさん :04/07/19 00:11
>>952
guru に向かってなんということを!!

955 名前:デフォルトの名無しさん :04/07/19 00:11
>>953
>>950の改行の位置かな?

956 名前:guru ◆BFP4DgQ4Jg :04/07/19 00:11
もう結構です。2chでC++使える奴はいなそうですね
バイバイキーンw

957 名前:デフォルトの名無しさん :04/07/19 00:13
結局何のguruだったのだろう。。。

958 名前:デフォルトの名無しさん :04/07/19 00:24
>>946
デフォコンを定義する必要性は?
デストラクタについての議論を恣意的に避けているようにも見える。

ディベート以前の問題をクリアしてからまたおいでw

959 名前:デフォルトの名無しさん :04/07/19 00:26
グルグル。

960 名前:デフォルトの名無しさん :04/07/19 00:27
つーか、わざわざ初期化子を指定しておいてなぜ?といわれると困るなw

961 名前:デフォルトの名無しさん :04/07/19 00:33
>>956
「ばか」とか「奴」とかプログラミング以前の問題だなw
二度とくるな糞

962 名前:デフォルトの名無しさん :04/07/19 00:49
こんな馬鹿久しぶりに見たぜ。俺としてはまた来て欲しい(w

963 名前:デフォルトの名無しさん :04/07/19 00:49
自分のバカさ加減に気がついて逃げたんだよ。
そっとしといてやれ。


964 名前:デフォルトの名無しさん :04/07/19 00:50
ちょっと待て今IP抜いてるw

965 名前:964 :04/07/19 00:57
自称guruのIP抜いたったぞw

207.46.144.222

お楽しみに   >guru

966 名前:デフォルトの名無しさん :04/07/19 00:58
それMicrosoftやん

967 名前:guru ◆BFP4DgQ4Jg :04/07/19 01:16
おまいらみたいなあふぉに万が一基億が一にもIPが抜けたとしても
どうしようもないだろ?w
やれるもんならやってみろよ

968 名前:デフォルトの名無しさん :04/07/19 01:30
>>967
958だが何か?

969 名前:guru ◆BFP4DgQ4Jg :04/07/19 01:34
何が何か?だよ

970 名前:デフォルトの名無しさん :04/07/19 01:43
↓以下放置でおながいします

971 名前:デフォルトの名無しさん :04/07/19 01:44
>>guru
せっかく戻ってきてくれたんだから、ディベートの続きしようぜ

>>まず基底クラスのコンストラクタを起動した後、
>>派生クラスの部分の初期化がなされるんだから、何ら不思議もないんだが。

>じゃあ、
>Base(){}
>Base(int x){}
>のどちらを実行するでしょうか?
>また、その理由は?

漏前は上のどちらを実行すると思うのよ。んでその理由は?

972 名前:デフォルトの名無しさん :04/07/19 01:54
香ばしい

973 名前:デフォルトの名無しさん :04/07/19 02:02
大体デイベーとするほど個人の最良が入るもんじゃないだろ
delete thisを許容するかとかならいざ知らず

974 名前:guru ◆BFP4DgQ4Jg :04/07/19 02:05
>>971
Base(int x){} をどうやって実行できるかを論じてるわけよ。わかる?

975 名前:デフォルトの名無しさん :04/07/19 02:13
それこそプログラマ次第だろ。

Base b(10) とやりゃ Base(int x){} が呼ばれ
Base b とすれば Base(){} が呼ばれるわけ。

上でも書かれてるがオーバーロードって知ってる?

976 名前:デフォルトの名無しさん :04/07/19 02:17
すげぇな・・・。
オーバロードも知らないやつがC++に手を出すのか。
悪いことは言わん、やめとけ。
その程度で他人に突っかかるようではC++は死ぬまで無理。

977 名前:デフォルトの名無しさん :04/07/19 02:18
guru ◆BFP4DgQ4Jg は今までどうやって C++ を勉強してきた?
一冊くらい本は読んだんだろう。そこに何も説明がなかったか?
書名を晒せ。

978 名前:デフォルトの名無しさん :04/07/19 02:20
C++に手を出す前にオーバーロードを知ってる香具師って
どういう経歴の持ち主なんだろう・・・。

979 名前:デフォルトの名無しさん :04/07/19 02:22
低レベルな質問には低レベルなやつが対応するという仮説を支持する結果となった。

980 名前:デフォルトの名無しさん :04/07/19 02:23
いや「オーバーロードも理解できない」っていう意味だろ

981 名前:デフォルトの名無しさん :04/07/19 02:33
お、生きのいい天然物が来たね〜

982 名前:デフォルトの名無しさん :04/07/19 02:35
只今、オーバーロードを検索中です
しばらくそのままでお待ちください

983 名前:デフォルトの名無しさん :04/07/19 02:51
脳内がバッファオーバーフローしそうだ

984 名前:デフォルトの名無しさん :04/07/19 02:56
classのメンバ関数A(),B()のそれぞれで、
int rnd;
という変数を宣言しているのですが、この場合名前が同じでも全く別物ですよね?
A()の中でB()を呼び出してるんですが、何か挙動が変で...。

985 名前:デフォルトの名無しさん :04/07/19 02:59
別物

986 名前:デフォルトの名無しさん :04/07/19 03:00
イルカさんに訊いて来いYO!

987 名前:デフォルトの名無しさん :04/07/19 03:02
あ、スマソ。↓の意味ね。
【ディベート】Microsoftイルカ v.s. guru【朝まで】

988 名前:デフォルトの名無しさん :04/07/19 03:04
>>985
ありがとうございます。

989 名前:デフォルトの名無しさん :04/07/19 03:07
>984
C++なんだからデバッガーでメモリのアドレス見ろよ。基本だ。

990 名前:デフォルトの名無しさん :04/07/19 03:09
990

991 名前:デフォルトの名無しさん :04/07/19 03:29
オーバーロードとオーバーライドの違いをわかりやすく覚えるには
どうしたらいいでしょうか。いつもこんがらがるんです...orz

992 名前:デフォルトの名無しさん :04/07/19 03:38
オーバーライド:乗っ取り

993 名前:デフォルトの名無しさん :04/07/19 04:11
乗っ取り乗っ取り乗っ取り・・・
なんとなくイメージつかめそうです。
ありがとうございました。




994 名前:guru ◆BFP4DgQ4Jg :04/07/19 04:23
オーバーロード云々の話じゃない・・・
本当こんな奴らがC++やってるってマジやべーよ

995 名前:デフォルトの名無しさん :04/07/19 04:31
同じ職場にいなければ桶

996 名前:デフォルトの名無しさん :04/07/19 04:32
こんな人とは仕事したくねえ。

997 名前:デフォルトの名無しさん :04/07/19 04:44
>>994
マジレスするとおまいが Derived で初期化子に Base(int x) を指定してるじゃねーか。ということになるんだが。

オーバーロード云々は確かに関係無いが、 >>949 が拙かったな。誤解されても仕方ない書き方。

998 名前:デフォルトの名無しさん :04/07/19 04:45
とりあえず次スレ立ててくる.(ダメだったときはすまんが誰かよろ)

999 名前:デフォルトの名無しさん :04/07/19 05:09
C++相談室 part33
http://pc5.2ch.net/test/read.cgi/tech/1090180012/

1000 名前:デフォルトの名無しさん :04/07/19 05:17
うあー


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.