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

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

C++相談室 part66

1 :デフォルトの名無しさん:2009/02/12(木) 15:34:43
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part65
http://pc11.2ch.net/test/read.cgi/tech/1230341243/

2 :デフォルトの名無しさん:2009/02/12(木) 15:43:49
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

3 :デフォルトの名無しさん:2009/02/12(木) 21:58:53
真スレです 仲良く使ってね楽しく使え クズども

4 :デフォルトの名無しさん:2009/02/13(金) 00:19:34
基本的なことなのですが、質問させてください。

DLL のクラスの変数をほかのアプリケーションから利用したいのですが、アプリケーションのビルドでリンカーエラーになってしまいます。

---DLL のクラスのヘッダーの一部---
class __declspec(dllexport) Sample1
{
public:
Sample1(void);
~Sample1(void);
public:
static const char *str_data;
};

---DLLのクラスのCPPの一部---
const char *Sample1::str_data = "Hoge";

---アプリケーションのCPPの一部---
_TCHAR buf[255];
_swprintf(buf, _T("str_data = %s\r\n"), Sample1::str_data);
::OutputDebugString(buf);

DLLはビルドできますが、アプリケーションでは
error LNK2001: 外部シンボル ""public: static char const * const Sample1::str_data" (?str_data@Sample1@@2PBDB)" は未解決です。
とでてしまいます。

よろしくお願いします。

5 :デフォルトの名無しさん:2009/02/13(金) 00:21:55
DLLを使う側では、__declspec(dllimport)付きでクラス定義している?

6 :4:2009/02/13(金) 00:24:20
>>5
していません。 __declspec(dllexport) はしているのですが。

dllimport については使ったことがなかったので調べて見ます。ありがとうございます。

7 :4:2009/02/13(金) 00:54:46
すいません。まだ、少ししか dllimport について調べていないのですが、もう一度質問させてください。
以下のように アプリケーションのヘッダーに dllimport を追加しましたが、同じリンカーエラーになりました。

---アプリケーションのヘッダー---
#include "resource.h"

#include "..\\Test_class\\Sample1.h"
#pragma comment(lib, "Test_class.lib")

__declspec(dllimport) Sample1;

リンカーエラー
Test_classApp.obj : error LNK2001: 外部シンボル ""public: static char const * const Sample1::str_data" (?str_data@Sample1@@2PBDB)" は未解決です。

ちなみに、VC++ 2008 Express を使っています。

static const のメンバ変数の書き方は、
ttp://frog.raindrop.jp/knowledge/archives/000281.html
などを参考にさせていただいたのですが、問題ないように思えます。

はっきりいって、原因がさっぱりわかりません。
強いていえば、やはり dllimport のような DLL をつかった場合の設定を間違えているのかと思っています。
今日はもうレスができないかもしれませんが、よろしくおねがいします。

8 :デフォルトの名無しさん:2009/02/13(金) 00:58:13
関数のときと同じで、DLLを作る側はclass __declspec(dllexport) Sample1にして、
使う側はclass __declspec(dllimport) Sample1になるようにしないとだめだよ。


9 :デフォルトの名無しさん:2009/02/13(金) 02:22:29
>>1
ゴミクズ

10 :デフォルトの名無しさん:2009/02/13(金) 08:49:08
>>9
生ごみ

11 :デフォルトの名無しさん:2009/02/13(金) 11:18:34
オブジェクトを作成するとき
クラス名 ob1;
クラス名 *ob2;

この上と下の違いはなんでしょうか?
上は新しくクラスをつくっていて
下はクラスのアドレスを渡しているということですか?

12 :デフォルトの名無しさん:2009/02/13(金) 11:36:20
>>11
上はオブジェクトの作成。
下はオブジェクトへのポインタの作成。
ただの宣言文なのでアドレスを渡しているわけではない。

13 :デフォルトの名無しさん:2009/02/13(金) 11:55:06
↓こっち先に使わないか?
C++相談室 part66
http://pc11.2ch.net/test/read.cgi/tech/1231640498/l50

14 :デフォルトの名無しさん:2009/02/13(金) 18:51:59
>>13
使わない

15 :デフォルトの名無しさん:2009/02/13(金) 22:35:57
こっちが先だな

16 :デフォルトの名無しさん:2009/02/14(土) 15:16:58
age

17 :赤西仁:2009/02/14(土) 16:31:29
2年間悩んでます。お力をお貸しください。

PSのアークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。

◆試してダメだったこと

 ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
 (ちなみに他のゲームはほとんど抽出可能)

◆教わったこと

 ・アークザラッドUは独自の画像形式を使っているから抽出できない。
 ・PS上で表示されてるということは絶対に摘出はできるはず。
 ・ttp://www.gradius2.com/index.php?UID=1174775153

◆抽出は不可能ではないということを知ったとき

 2ちゃんねるで質問したところ、
 ある方が実際にキャラクターの歩行画像を抽出して
 私が立てたスレにアップしてくださいました。

スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。

18 :デフォルトの名無しさん:2009/02/14(土) 16:34:21
コピペ君って本当馬鹿だな、まで読んだ。

19 :赤西仁:2009/02/14(土) 16:35:37
20年間悩んでます。お力をお貸しください。

PSのアークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。

◆試してダメだったこと

 ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
 (ちなみに他のゲームはほとんど抽出可能)

◆教わったこと

 ・アークザラッドUは独自の画像形式を使っているから抽出できない。
 ・PS上で表示されてるということは絶対に摘出はできるはず。
 ・ttp://www.gradius2.com/index.php?UID=1174775153

◆抽出は不可能ではないということを知ったとき

 2ちゃんねるで質問したところ、
 ある方が実際にキャラクターの歩行画像を抽出して
 私が立てたスレにアップしてくださいました。

スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。

20 :デフォルトの名無しさん:2009/02/14(土) 16:37:40
PS1エミュがあるんだから吸い出せば速攻できるのになw

21 :デフォルトの名無しさん:2009/02/14(土) 19:48:57
65536年間悩んでます。お力をお貸しください。

PSのアークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。

◆試してダメだったこと

 ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
 (ちなみに他のゲームはほとんど抽出可能)

◆教わったこと

 ・アークザラッドUは独自の画像形式を使っているから抽出できない。
 ・PS上で表示されてるということは絶対に摘出はできるはず。
 ・ttp://www.gradius2.com/index.php?UID=1174775153

◆抽出は不可能ではないということを知ったとき

 2ちゃんねるで質問したところ、
 ある方が実際にキャラクターの歩行画像を抽出して
 私が立てたスレにアップしてくださいました。

スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。

22 :デフォルトの名無しさん:2009/02/14(土) 21:09:26
ヘッダで using namespace はご法度な話で、

// hoge.hpp
#include <色々>
namespace hogeImpl {
using namespace 色々;
class hogeClass { ... }
}
}
using hogeImpl::hogeClass;

こんな感じで押し込むのはダメ?

23 :赤西仁 :2009/02/14(土) 21:10:56
00000010年間悩んでます。お力をお貸しください。

PSのアークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。

◆試してダメだったこと

 ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
 (ちなみに他のゲームはほとんど抽出可能)

◆教わったこと

 ・アークザラッドUは独自の画像形式を使っているから抽出できない。
 ・PS上で表示されてるということは絶対に摘出はできるはず。
 ・ttp://www.gradius2.com/index.php?UID=1174775153

◆抽出は不可能ではないということを知ったとき

 2ちゃんねるで質問したところ、
 ある方が実際にキャラクターの歩行画像を抽出して
 私が立てたスレにアップしてくださいました。

スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。

24 :デフォルトの名無しさん:2009/02/14(土) 21:19:37
>22
外部から hogeImpl::XXX として「色々」の中のものがアクセスできる、つまり「色々」の中のものは
hogeImpl の要素なんだ、と思えるのならば OK。
それでも大抵は using namespace よりは using 宣言になるだろうけど。

25 :デフォルトの名無しさん:2009/02/14(土) 21:46:21
>>24
説明が足りなかった。ごめん。ヘッダ利用者は hogeImpl 以下を使わない。

namespace hogeImpl {} をプライベートな名前空間だと思って
好き勝手に実装を書き、外に見せたいものだけ using hogeImpl::... しておく。
そうすれば、実装部分で using namespace std; していても、
余分な名前が漏れることは防げると思うんだけど、そういうコードを見たことがないので
何か落とし穴があるのかと不安で。

26 :デフォルトの名無しさん:2009/02/15(日) 00:56:56
>25
> namespace hogeImpl {} をプライベートな名前空間だと思って
> 好き勝手に実装を書き、外に見せたいものだけ using hogeImpl::... しておく。
これ自体は boost とかでも頻出パターン(大抵は detail という名前空間)。

using directive の使用についてはライブラリ利用者としては問題ないだろうけど、
実装者側で名前の衝突が発生する危険はある。
boost だと(意図的に名前を持ち込む場合以外の) using directive は関数ブロック内に
限定した利用がほとんどのようだ。
できるだけ影響範囲を限定しよう、という意図だと思う。

27 :デフォルトの名無しさん:2009/02/15(日) 13:43:13
>>26
なるほど。ありがとう。
やはり using は、関数ブロック内程度に留めておくことにします。

28 :デフォルトの名無しさん:2009/02/16(月) 20:40:53
STLスレから誘導されてきました。

質問があります。
STLはヘッダにその実装が書いてあるわけですが、
ということは「翻訳単位毎にコードが生成される」のでしょうか?

a,cpp
b.cpp
両方<vector>をincludeし、両方で vector<int> が使われていた場合、vector<int>のコードは2つ作られてしまうのでしょうか?
EXEファイルの容量がガンガン増えるような気がするのですが・・・

29 :デフォルトの名無しさん:2009/02/16(月) 20:50:51
そう。ガンガン増える
かしこいコンパイラなら少しは最適化してくれるけど当てにしちゃいけない

30 :デフォルトの名無しさん:2009/02/16(月) 20:59:52
普通はリンク時に1つにまとめられるか、インライン展開して消え去るかのどちらかだと思う。
さすがに同じものが2つも残るのは珍しいだろう。

31 :デフォルトの名無しさん:2009/02/16(月) 22:16:31
C++の規格では1つにまとめるよう要求しているぞ。
1つにまとめなかったらstaticメンバ変数とかどうなるんだよ。

32 :デフォルトの名無しさん:2009/02/16(月) 22:17:13
>28
真・スレッドリスターター(以下略)をあぼんしてたので誘導されてるのに気づかず向こうで答えちゃった。

33 :デフォルトの名無しさん:2009/02/16(月) 22:23:25
a.cppでインクルードしたテンプレートから作ったvector<int>と
b.cppでインクルードしたテンプレートから作ったvector<int>が
同じである保証はどこにもないんだから、まとめようがないだろ
普通に考えれば

オレオレ<vector>が使われてないという前提なら<vector>は全部一緒だから
標準ライブラリだけ特別扱いしてでまとめてくれるとか、そういう話?

34 :デフォルトの名無しさん:2009/02/16(月) 22:27:56
まとめようがなかったら
一体この A<int>::a はどうなるんだよ。
翻訳単位事に作られたら規格違反じゃねぇか。

template <typename T> struct A {
 static T a;
};
template <typename T> T A<T>::a;

35 :デフォルトの名無しさん:2009/02/16(月) 22:32:57
別の所にこれがあったらどうするんだよ
勝手にまとめられるわけないだろ

template <typename T> struct A {
 static int a(T);
};

36 :デフォルトの名無しさん:2009/02/16(月) 22:34:16
>>33
単一定義規則 (ODR) と言って、その保証をするのはプログラマの仕事。

37 :デフォルトの名無しさん:2009/02/16(月) 22:38:23
>>35
リンクエラーになるに決まってるだろw

38 :デフォルトの名無しさん:2009/02/16(月) 22:43:15
>>37
だろ?
まとめられるわけがないんだって

39 :デフォルトの名無しさん:2009/02/16(月) 22:57:29
なんだ。池沼か。日本語通じねえ。

40 :デフォルトの名無しさん:2009/02/16(月) 23:04:04
ダメだこりゃ

41 :デフォルトの名無しさん:2009/02/16(月) 23:18:51
>>35
同名の複数の実体をまとめるかまとめないかはコンパイラ・リンカしだい。

>>36が言うように
いずれにせよプログラマが同一であることを保障する必要がある。

42 :デフォルトの名無しさん:2009/02/16(月) 23:39:26
>>28
誘導されんなボケナス

43 :デフォルトの名無しさん:2009/02/17(火) 16:31:16
ごめん、よくわかんないんだけど、
>>28さんが実際にいくつもa.cppやb.cppらを作って全部リンクしてみて実際に実行ファイルの容量がでかくなるか試してみればいいんじゃないの?

44 :デフォルトの名無しさん:2009/02/17(火) 23:47:42


45 :デフォルトの名無しさん:2009/02/18(水) 11:11:14
>>42
ボケナスとはずいぶん古風な煽り方をなさるw

46 :デフォルトの名無しさん:2009/02/18(水) 11:39:34
どこが古風だスットコドッコイ

47 :デフォルトの名無しさん:2009/02/18(水) 18:27:43
寿司喰い姉ぇでしめくくるんだよな

48 :デフォルトの名無しさん:2009/02/18(水) 19:13:35
当たり前田のクラッカーだ。

49 :デフォルトの名無しさん:2009/02/18(水) 23:27:33
何言ってんだい、このでこシャッポ。

50 :デフォルトの名無しさん:2009/02/19(木) 13:05:44
標準C++ライブラリの範囲で
std::stringとstd::wstringの変換って出来ません?
std::ostringstreamとかを使うのも可で、とにかく標準C++の範囲で。


51 :デフォルトの名無しさん:2009/02/19(木) 13:22:17
>>50
std::codecvtを使うらしいが詳細はシラネ

52 :デフォルトの名無しさん:2009/02/19(木) 13:42:40
>>50
http://hw001.gate01.com/eggplant/tcf/cpp/strcnv.hpp

53 :50:2009/02/19(木) 13:58:44
ありがとう。
今から見てみるわ。


54 :デフォルトの名無しさん:2009/02/19(木) 23:52:07
コードの変換っつて難しいね
標準だけとコンパイラによって微妙に違ったり
OSに渡すのに適してなかったり。


55 :デフォルトの名無しさん:2009/02/20(金) 00:12:31
std::mbstowcs と std::wcstombs じゃだめ?

56 :デフォルトの名無しさん:2009/02/20(金) 02:01:19
リンク時に「未解決のシンボル"public:_thiscall CDunBase::CDunBase(void)"が関数"public:_thiscall CDun01::CDun01(void)"で参照されました。」
というエラーが出るのですが、原因が分かりません。

57 :デフォルトの名無しさん:2009/02/20(金) 02:06:28
CDunBase::CDunBase(void)
の定義が無いと言ってる

58 :デフォルトの名無しさん:2009/02/20(金) 02:07:25
>>56
たとえば CDun01 の継承元 CDunBase の引数を持たないコンストラクタが
宣言されているが定義されていない場合、そんなエラーが起こるでしょう。

59 :デフォルトの名無しさん:2009/02/20(金) 02:07:47
CDunBaseのディフォルトコンストラクタがないんじゃないかな。

60 :デフォルトの名無しさん:2009/02/20(金) 02:08:26
うぁはは、被り捲くり。

61 :デフォルトの名無しさん:2009/02/20(金) 02:22:34
なるほど、コンストラクタが定義されていなかったのですね。
やっぱり理解してないものはあまり使うべきじゃありませんね。

62 :50:2009/02/20(金) 06:48:28
>>55
std::wcstombsとかでも出来るのか。
なんかこういうのホント分からん。こんな関数みたことねぇ。


63 :デフォルトの名無しさん:2009/02/20(金) 17:28:19
>>62
>>52のコードを書いた張本人だけど、ぶっちゃけ俺もロケールの動作とか関数とかはよく判っていない。
そもそもwchar_t関係は具体的な定義が仕様になかったり、VCとgccでwchar_tの大きさが違ったり、
さらにVCの各Ver.ごとに致命的なバグとか仕様の違いとかが結構あったりして、
正直C++標準のロケールは使い辛いと言わざるを得ない。

あまり本格的でない用途に使うならwchar_t/codecvtでもいいと思うけど、
ちゃんとしたいならやっぱりICUとかの外部ライブラリを使って、
さらにプリプロセッサでwin32と*nixを分岐させるとかの面倒なことをしなきゃだめだと思う。

// >>52の引数2つの関数は、たぶん予めstd::locale::global(std::locale("japanese"));しないといけなかったはず。

64 :50(=62):2009/02/20(金) 20:25:21
>>63
そうなんですか。wchat_tはこのままだとC++の黒歴史状態に?
そして、まさかあのコードを書いた方がここにいらっしゃるとは、2chって(てかネットって)わからない。


65 :デフォルトの名無しさん:2009/02/20(金) 23:02:04
あのぅ、俺は
hoge(int &arg)
を参照渡しだと思っているんだが、

hoge(int *arg)
int i;
hoge(&i)
これも参照渡しって言うの?

誰かこのモヤモヤを取ってくだしあうあ

66 :デフォルトの名無しさん:2009/02/20(金) 23:03:04
>>65
それはアドレス渡し

67 :デフォルトの名無しさん:2009/02/20(金) 23:06:55
厳密にはC++に「参照渡し」は存在しない
hoge(int &arg)は参照の値渡しだし
hoge(int *arg)はポインタの値渡しだし
渡された値を参照にも使えるというだけ

68 :デフォルトの名無しさん:2009/02/20(金) 23:19:04
>>65
まさかとは思うけど、参照とアドレスを取得する時に使う&の区別は付いているよね?
int a=&b;

int &x=y;
とでは意味が全く違うことは知ってるよね?

69 :68:2009/02/20(金) 23:20:08
あ。
int a=&b;

int* p=&b;
の間違いっす!

70 :デフォルトの名無しさん:2009/02/20(金) 23:34:40
>>67
じゃあ、厳密な「参照渡し」ってなんだよ。

hoge(int &arg)が正真正銘の参照渡しじゃなければ、何が違うというのだ?

71 :デフォルトの名無しさん:2009/02/20(金) 23:39:46
あぁ、勘違いしてたわ
int a = &b;
これも(意味は異なるが)参照だと思ってた

ということは参照渡しって
hoge(int &arg)
だけなんだね

sanx


72 :デフォルトの名無しさん:2009/02/20(金) 23:53:24
>>67
参照の値渡しwww
hoge(int &arg) は正真正銘参照渡しだ。
参照は再代入できないって点をよーく考えてみるんだな。

73 :デフォルトの名無しさん:2009/02/20(金) 23:59:52
>>67
これってJavaの話だろう

74 :デフォルトの名無しさん:2009/02/21(土) 00:05:27
>>70
C++の参照はポインタのシンタックスシュガーに過ぎない
裏でやってるのはあくまでアドレスの値渡し

>>72
意味がわからない
じゃあhoge(int *const arg)は「正真正銘参照渡し」だと言いたいの?

75 :デフォルトの名無しさん:2009/02/21(土) 00:11:20
なんでもかんでもシンタックスシュガー♪

76 :デフォルトの名無しさん:2009/02/21(土) 00:12:19
>>74
ポインタのシンタックスシュガーだと規格に載ってるのか?

77 :デフォルトの名無しさん:2009/02/21(土) 00:17:39
>>74
FORTRAN は参照渡しだけど
C から FORTRAN の関数呼ぶときゃ
引数をポインタにして扱うだろw
裏でアドレス渡していようが、それが見えなきゃ参照渡しだ。

あと、再代入ができない、というのは、お前に対してははしょりすぎたな。
参照そのものを触ることができない、というのが一番重要な点だ。
常に参照先ののものにしか触る事が出来ない。
ポインタは参照元に触る事が出来る。
const だろうがポインタのアドレスをとることもできる。

78 :デフォルトの名無しさん:2009/02/21(土) 00:19:35
参照だのreferenceだのという名前が付いてるからって、その通りの実体だと思うと足元すくわれるよ
特にC++という言語はそうだ

int&というものはint*と基本的には一緒
書き方とできる操作の範囲がちょっと違うだけ

79 :デフォルトの名無しさん:2009/02/21(土) 00:23:05
>>77
FORTRANの下りは当たり前じゃん
Cから呼ぶんだからCの作法で呼ぶ
それは参照に使えるアドレス値の値渡しだ

参照のアドレス値が取れるかどうかなんて大した問題じゃないね
参照はコピーできるんだから、番地は見えなくたってアドレスを扱うことはできてる

80 :デフォルトの名無しさん:2009/02/21(土) 00:28:25
FORTRAN の参照だって別の関数に渡しゃコピーできるだろw

81 :デフォルトの名無しさん:2009/02/21(土) 00:31:05
>>78>>79 あたりは裏の構造に頭がいきすぎて
参照ってなんなの? ってのが分かってないようだな。

82 :デフォルトの名無しさん:2009/02/21(土) 00:31:39
俺なりに整理した。
void f(int *p)は、値渡しの一種であるポインタ渡し
void f(int &p)は、参照渡し
Cには値渡ししかないがC++には参照渡しもある

>参照はコピーできる
参照しているものはコピー出来る
参照している先のアドレスもポインタを使えばコピー出来る
けど、参照の参照(参照自体のアドレスの取得)は出来ないよ

83 :デフォルトの名無しさん:2009/02/21(土) 00:39:06
>>82
それで問題ない。

84 :デフォルトの名無しさん:2009/02/21(土) 00:39:30
「参照渡し」 という概念を、C では アドレスを値渡しすることで実現している、ってことじゃないの
概念的には参照渡しだけど、Cの用語としては参照渡しではない
知らないけど

85 :デフォルトの名無しさん:2009/02/21(土) 00:40:24
リロードせずに書き込みましたすみません><

86 :デフォルトの名無しさん:2009/02/21(土) 00:41:23
>>82
取ることが言語で禁止されてるだけでアドレスはメモリ上のどっかにあるはずなんだが
なんでアドレス値をプログラムから見ることにこだわるの?

87 :デフォルトの名無しさん:2009/02/21(土) 00:42:34
>>86
そんなこといったら参照渡しなんて存在しなくなるぞw

88 :デフォルトの名無しさん:2009/02/21(土) 00:45:07
>>84
int n;
f(&n);

n にとっては参照渡しと言えなくもないが、
&n を入れた変数自体も触れるので完全な参照渡しとは言えない。
参照渡しを値渡しを使って無理矢理エミュレートしている、程度の代物。
無条件で「参照渡しだ!」と言っちゃうと色々困った理解をする人が現れるのを
何度も見た事があるので、口が裂けても参照渡しと言いたくはない。

89 :デフォルトの名無しさん:2009/02/21(土) 00:48:26
参照のアドレスを見たがってる人は
関数ローカルの参照作ってスタック覗けば多分「参照の値」が見えると思うよ
注意しないと最適化で消されちゃうだろうけど

90 :デフォルトの名無しさん:2009/02/21(土) 00:51:27
>>86
プログラムから触れないから意味があるんじゃないか
いい記事見つけたから、分からず屋のあんたはこれでも読みない
ttp://java-house.jp/ml/archive/j-h-b/026214.html

91 :デフォルトの名無しさん:2009/02/21(土) 00:55:55
>>77
C++からならC++参照使ってもできるよ。
そこでは、Fortranの参照とCのポインタとC++の参照の内部表現がたまたま共通だったから。

92 :デフォルトの名無しさん:2009/02/21(土) 01:08:13
何々?結局どうなったん?
俺もまぜて

93 :デフォルトの名無しさん:2009/02/21(土) 01:08:13
>>91
要するに内部表現は参照渡しかどうかにゃ関係ないっつー話だ。

94 :92:2009/02/21(土) 01:10:27
考えてみれば
「ソースコードに記述したとおりに標準C++の規格準拠に動けば
内部でアドレスを使おうが、
あるいはどのような非効率で妙な内部表現であったとしても、
そんなん全然関係ないよ」
ってことか??


95 :デフォルトの名無しさん:2009/02/21(土) 01:10:33
結構勉強になったわ
一番違いがわかりやすいのは、参照渡し⇒「仮引数に左辺値」がくる
int f(int &p)に対してf(1)って呼び出しは出来ない。1は右辺値だからな

96 :デフォルトの名無しさん:2009/02/21(土) 01:12:56
const 参照は右辺値を引数にできる。
しかし、参照するのは右辺値そのものではなく、
それをコピーして作ったテンポラリオブジェクト(左辺値)だけどね。

97 :92:2009/02/21(土) 01:13:57
>>95
int f(const int &p)
というコードを書いてみ。


98 :デフォルトの名無しさん:2009/02/21(土) 01:16:05
書き込む前にはリロード。
これ常識。

99 :デフォルトの名無しさん:2009/02/21(土) 01:16:41
96のプロフェッショナルぶりにワロタw
書いてみるもんだな、勉強になたよ

100 :92:2009/02/21(土) 01:16:42
サーセン

101 :デフォルトの名無しさん:2009/02/21(土) 01:20:07
この辺、右辺値参照でまたプログラムがだいぶ変わるのかなぁ

102 :デフォルトの名無しさん:2009/02/21(土) 01:22:39
変わんないだろう
気を遣って書かない限りすぐ左辺値参照に倒れるようになってるし

103 :デフォルトの名無しさん:2009/02/21(土) 01:29:38
クラスを作ったら、「コピーコンストラクタ・コピー代入演算子」を書かねばならない(あるいは禁止にする)
の鍵括弧の中にムーブコンストラクタ・ムーブ代入演算子が増えるだけ。
(コピー不可・ムーブ可という選択肢もあるが)

あとはvectorの中とか関数戻り値でコンパイラが生成するコードとかで勝手にやってくれる。

104 :デフォルトの名無しさん:2009/02/21(土) 01:34:46
ムーブコンストラクタとムーブ代入演算子は必要なければ書かなければいいだけだから
あんまり気にしなくていい

105 :デフォルトの名無しさん:2009/02/21(土) 01:35:50
しっかし、今でさえC++の本ってごっついのに、
C++0xに対応したらどんなごつさになるんだ?

106 :デフォルトの名無しさん:2009/02/21(土) 01:56:54
swapもコンストラクタなみの扱いにしてほしいな
std空間に定義していく今のやり方はあまり良くないだろうと

107 :デフォルトの名無しさん:2009/02/21(土) 02:03:14
>>106
swapは自分の名前空間で定義するのが主流になりつつあるでしょ。
あとは、標準でいくらかお墨付きになるのを待つだけで。

108 :デフォルトの名無しさん:2009/02/21(土) 02:04:09
全部読むだけで人がしぬ(寿命で)ごつさになります。

109 :デフォルトの名無しさん:2009/02/21(土) 02:30:32
細心の注意を払わないと上手く最適化されない言語仕様

110 :デフォルトの名無しさん:2009/02/21(土) 11:05:45
カレントスレッドのスタックサイズを取得したいんだけど、どうすればよい??

111 :デフォルトの名無しさん:2009/02/21(土) 11:08:50
環境依存です。はい、次の方どうぞ。

112 :デフォルトの名無しさん:2009/02/21(土) 11:16:44
>>111
ちょwww待って先生!!重症なんですw
とりあえず Windows で教えてください。
EXEのヘッダにエントリがあった気もするし…
サイズじゃなくても、sp の最小値でもいいです。
取れませんか??

113 :デフォルトの名無しさん:2009/02/21(土) 11:22:35
Win32APIスレに行った方がいいぞ

114 :デフォルトの名無しさん:2009/02/21(土) 11:50:35
>>113
よく考えたらスレチでしたorz
APIスレ行ってきます!

115 :デフォルトの名無しさん:2009/02/21(土) 16:53:54
名前空間の命名にあたって何か規約ないし慣習はありますか?
例えば最初が_で始まってはならないなどです

116 :デフォルトの名無しさん:2009/02/21(土) 16:56:04
予約語にしてはいけない、以外の慣習は、人それぞれだろう。
まあ、全部大文字はマクロに使う人が多いから使わない方がいいだろう、程度しか。

117 :115:2009/02/21(土) 16:57:22
>>116
なるほど、ありがとうございます。。


118 :デフォルトの名無しさん:2009/02/21(土) 16:58:44
未だにテンプレートを何に使えばいいのか分からないのですが何か良い本はありますか?

119 :デフォルトの名無しさん:2009/02/21(土) 17:04:50
>>118
STLとshared_ptrを使ってみるとありがたみがわかる。


120 :デフォルトの名無しさん:2009/02/21(土) 17:09:05
>名前空間の命名
全部小文字派とアッパーキャメルケース派に大別されるのではないかな。
クラス名と被らないような、より抽象的なカテゴリ名を使ったり、
一部.netでやってるように複数形にしてお茶を濁したり。

121 :115:2009/02/21(土) 17:14:16
>>120
個人的にはCamelCaseよりcamelcase派です。
いずれにせよ、そこまで強いルールはないんですね。

122 :デフォルトの名無しさん:2009/02/21(土) 17:16:26
N付ける派もいたか

123 :デフォルトの名無しさん:2009/02/21(土) 17:19:26
>>122
どういうことですか?
namespaceのNってことですか?


124 :デフォルトの名無しさん:2009/02/21(土) 17:27:48
そのとおり

125 :デフォルトの名無しさん:2009/02/21(土) 17:40:06
自分の名前を頭に付けている俺

126 :デフォルトの名無しさん:2009/02/21(土) 17:42:52
名前空間名が型名や変数名と混ざることは少ないから
変な細工はあんまりいらないと思う

127 :デフォルトの名無しさん:2009/02/21(土) 17:49:00
今度から頭に母ちゃんってつけようぜ

128 :デフォルトの名無しさん:2009/02/21(土) 17:50:44
テンプレートの使い方で分からないんだけど、
template <typename T>
class Myclass
{
public:
T mem;
//他、Tを使ったメンバ関数・メンバ変数が多数
int foo(int x){std::cout << x << std::endl;return x;}
double foo(double x){std::cout << x << std::endl;return x;};
unsigned long foo(unsigned long x){std::cout << x << std::endl;return x;};
};
のようなクラスがあって、呼び出すときは
Myclass<char> hoge;
hoge.foo((int)-1);
hoge.foo((double)3.14);
hoge.foo((unsigned long)42);
のように使っている状況。
で、この3つのfooをテンプレートにしてまとめたいんだけど、どうすりゃいいかね??
template <typename T,typename U>
class Myclass
{//〜〜};
とは意味合いが違うじゃん。。。

129 :デフォルトの名無しさん:2009/02/21(土) 17:56:51
template<typename U>
U foo(U x){std::cout << x << std::endl;return x;}
をメンバにすればいいだけじゃないの

130 :デフォルトの名無しさん:2009/02/21(土) 18:03:02
>>128
できた。
テンプレートの中にテンプレートを入れ子にできるのか。
ありがとう。


131 :128:2009/02/21(土) 18:26:11
今度はコンストラクタで死んだ。
template <typename T>
class Myclass
{
public:
T mem;
//他、Tを使ったメンバ関数・メンバ変数が多数
Myclass();
template<typename T,typename U> Myclass(U x);//コンストラクタ
};
template <typename T>
Myclass<T>::Myclass(){}
template <typename T,typename U>
Myclass<T>::Myclass(U x){}

こうするとbccにて
テンプレート 'Myclass<T>' に対して宣言されたテンプレートパラメータが多すぎる
'Myclass<T>::Myclass(U)' は 'Myclass<T>' のメンバーではない
'Myclass<char>::Myclass(int)' に一致するものが見つからない(関数 main() )
って言われた。
int main()
{
Myclass<char> hoge;
Myclass<char> piyo(42);
return 0;}
です。
この場合はどうやって宣言したらいいですか??


132 :デフォルトの名無しさん:2009/02/21(土) 19:16:17
template<typename U> Myclass(U x);

133 :128:2009/02/21(土) 19:44:41
>>132
クラス内の定義はそれでいけた。
クラス外はどうすればいい?
template <typename T,typename U>
Myclass<T>::Myclass(U x){}
だとダメっぽいんだが
template <typename T>
template <typename U>
Myclass<T>::Myclass(U x){}
にしてみたら出来る。
これで、間違ってない?



134 :デフォルトの名無しさん:2009/02/21(土) 20:11:23
operatorの使い方で相談です。
プログラムと相談内容はこちらにまとめて書きました。
ttp://www.nigauri.sakura.ne.jp/src/up8638.txt

135 :デフォルトの名無しさん:2009/02/21(土) 20:14:52
operator+=を作ってそれを使うのがベストじゃね
というかeffective c++位読んだ方が良い


136 :デフォルトの名無しさん:2009/02/21(土) 20:41:12
>>133
順番に考えればいい
普通のクラスのコンストラクタテンプレートならこう書くだろう

template <typename U>
NormalClass::NormalClass(U x){}

このNormalClassを具体化に置き換えてみる

template <typename U>
MyClass<int>::MyClass<int>(U x){}

テンプレートの規則からコンストラクタ名の方の<int>は省略できる

template <typename U>
MyClass<int>::MyClass(U x){}

このintをテンプレート化すると

template <typename T> template <typename U>
MyClass<T>::MyClass(U x){}

ほらできた

137 :デフォルトの名無しさん:2009/02/21(土) 21:02:01
わー、すごーい。ヤッターー!

138 :133:2009/02/21(土) 21:17:33
>>136
ありがとう!!
template <typename T>template <typename U>
Myclass<T>::Myclass(U x){}
なんだけど、これをUの部分だけexplicit instantiationすることは出来る?
(まあまだ完全にインスタンス化されないからexplicit instantiationとは言わないだろうが。)
template <typename T>
class Myclass
{
public:
T mem;
//他、Tを使ったメンバ関数・メンバ変数が多数
Myclass();
template <typename U> Myclass(U x);//コンストラクタ
template <typename U> U bar(U x);//適当な関数
};
この時、一番最後の適当な関数barは
template <typename T>template <typename U>
U Myclass<T>::bar(U x){std::cout << x << std::endl;return x;}
みたいに定義出来ることは>>136に今 教わったことで分かるんだが、このU型の部分をdoubleやintなど既にある型でexplicit instantiation(っぽいこと)しておきたい。
現状は、現在はヘッダーファイルと実装のソースファイルを分けている状態で、ソースファイルの末尾で
template class Myclass<char>;
の様にexplicit instantiationしている。
この状態でコンストラクタやメンバ関数bar()をまとめてU型でテンプレートにしようとしたら困っているところ。


139 :デフォルトの名無しさん:2009/02/22(日) 07:50:29
>138
explicit instantiation (みたいなことを)したい理由は何?
ライブラリを作ってるとかなら explicit instantiation する意味はあるだろうけど、
何がしたいのか良く分からない。

処理系のインスタンス化の実装方法によっては多少コンパイルが効率化されるかもしれないが、
他の処理系ではむしろ効率が悪化したりするんじゃないだろうか。

140 :138:2009/02/22(日) 09:26:36
>>139
>>ライブラリを作ってるとかなら explicit instantiation する意味はあるだろうけど、
ライブラリ作ってる。
いろんなところで使っている処理なんだ。。。
そして、ぜーんぶヘッダファイルに実装まで含めてinlineなんてことはしたくない。

141 :デフォルトの名無しさん:2009/02/22(日) 10:58:07
カキコテスト

142 :138:2009/02/22(日) 10:58:50
Uとしてはint,double,unsigned longを想定する。
この時とりあえずTがcharな場合しか使わないなら、ライブラリのソースファイルで
//explicit instantiation<T=char版>
template class Myclass<char>;
template Myclass<char>::Myclass<int>(int x);
template Myclass<char>::Myclass<double>(double x);
template Myclass<char>::Myclass<unsigned long>(unsigned long x);
template int Myclass<char>::bar<int>(int x);
template double Myclass<char>::bar<double>(double x);
template unsigned long Myclass<char>::bar<unsigned long>(unsigned long x);
とすれば解決することまでは理解できた。

143 :138:2009/02/22(日) 10:59:28
だが実際にはTがchar以外の場合もあったら、例えばTがstd::stringやwchar_t,std::wstringな場合に、上のcharの時の物に加えて
//explicit instantiation<T=std::string版>
template class Myclass<std::string>;
template Myclass<std::string>::Myclass<int>(int x);
template Myclass<std::string>::Myclass<double>(double x);
template Myclass<std::string>::Myclass<unsigned long>(unsigned long x);
template int Myclass<std::string>::bar<int>(int x);
template double Myclass<std::string>::bar<double>(double x);
template unsigned long Myclass<std::string>::bar<unsigned long>(unsigned long x);
のように書かねばならないのだろうか?
そうだとすると、メンバ関数のexplicit instantiationだけで12行書くことになるよね?
(Tで4通り、Uで3通りのかけ算として。)
俺としてはTだけはおいといてU(メンバ関数テンプレート)だけでとりあえず3通りのexplicit instantiation(もどき)なことをしておいて、その後Tを4通りexplicit instantiationできればいいなぁと思っているのだが…。
たいていこういう場合ってC++だとちゃんと逃げ道あるよね?

144 :デフォルトの名無しさん:2009/02/22(日) 13:58:05
関数多重定義では駄目なの?

145 :138:2009/02/22(日) 14:05:35
>>144
現在がその状況です。
ライブラリのヘッダーファイルが
template <typename T>
class Myclass
{
public:
T mem;
//他、Tを使ったメンバ関数・メンバ変数が多数
Myclass();
Myclass(int x);//int
int bar(int x);//int
Myclass(double x);//double
double bar(double x);//double
Myclass(unsigned long x);//unsigned long
unsigned long bar(unsigned long x);//unsigned long
};
でライブラリのソースファイルの末尾で
//explicit instantiation
template class Myclass<char>;
template class Myclass<std::string>;
template class Myclass<wchar_t>;
template class Myclass<std::wstring>;
としている。
まあ現状問題無く動くいてるんだが、なんかこれって美しくないコードじゃない?
やっぱもう一つテンプレート(Uの部分)にしたくない?

146 :デフォルトの名無しさん:2009/02/22(日) 15:13:56
int, double, unsigned long ... でやる事は同じだけど
これら以外の型では呼んで欲しくないという事なのかな

147 :138:2009/02/22(日) 15:16:19
>>146
そう!そう!
そういうことです!

148 :138:2009/02/22(日) 15:21:27
あとまあ
Uのところをint, double, unsigned longで明示的にインスタンス化してやらないと
ヘッダファイルをインクルードしてソースファイルをリンクしたところで
リンカが「みつかりませんよ」エラーを出すと思ったんだが。
class Myclass

template <typename T>
class Myclass
にしたときそうだった。

149 :デフォルトの名無しさん:2009/02/22(日) 16:30:46
引数の暗黙の型変換も許さないなら関数テンプレートでいいと思う。
関数多重定義だと(リンク時でなく)コンパイル時に合致する関数が
あるか分かる利点があるけど。

150 :デフォルトの名無しさん:2009/02/22(日) 16:53:38
>>149
なるほど。ありがとう。
実は今、別のところで引っかかってる。(さっきのやつと関連しているのだが。)
class Sample_Class
{
public:
Sample_Class();//これは普通の。
template <typename intT> Sample_Class(intT n);
template <typename floatT> Sample_Class(floatT x);
};
Sample_Class::Sample_Class(){}//これは普通の。
template <typename intT>
Sample_Class::Sample_Class(intT n){if(n){std::cout << n << std::endl;}}
template <typename floatT>
Sample_Class::Sample_Class(floatT x){if(x){std::cout << x << std::endl;}};
このようにすると、
エラー E2238 Sample_Class.cpp 14: 'Sample_Class::Sample_Class(intT)' の宣言が複数見つかった
エラー E2344 Sample_Class.cpp 13: 一つ前の 'Sample_Class::Sample_Class(intT)' の定義位置
エラー E2171 Sample_Class.cpp 20: 関数 'Sample_Class::Sample_Class(intT)' の本体はすでに定義されている
と言われてしまう。
まあ当然と言われれば当然なのかもしれないが、
「整数型と浮動小数点型とで処理が別」だけど「整数型はshort,int,long,unsigned〜で処理が共通」で「浮動小数点型はfloat,double,long doubleで処理が共通」
って状況はテンプレートでどうにかならない?



151 :150:2009/02/22(日) 17:02:28
テンプレートを使わないならば
class Sample_Class
{
public:
Sample_Class();//これは普通の。
Sample_Class(short v);
Sample_Class(int v);
Sample_Class(long v);
Sample_Class(float v);
Sample_Class(double v);
Sample_Class(long double v);
};
Sample_Class::Sample_Class(){}//これは普通の。
Sample_Class::Sample_Class(short v){if(v){std::cout << "整数" << v << std::endl;}}
Sample_Class::Sample_Class(int v){if(v){std::cout << "整数" << v << std::endl;}}
Sample_Class::Sample_Class(long v){if(v){std::cout << "整数" << v << std::endl;}}
Sample_Class::Sample_Class(float v){if(v){std::cout << "小数" << v << std::endl;}}
Sample_Class::Sample_Class(double v){if(v){std::cout << "小数" << v << std::endl;}}
Sample_Class::Sample_Class(long double v){if(v){std::cout << "小数" << v << std::endl;}}
としておけば、
Sample_Class hoge=42;
Sample_Class piyo=3.14;
と呼び出してもちゃんと該当する物が呼び出されるじゃん。
これをテンプレートにしようとするととたんにつまずいてしまう。


152 :デフォルトの名無しさん:2009/02/22(日) 18:08:23
特殊化では駄目なの?

153 :150:2009/02/22(日) 18:17:45
>>152
特殊化だと、結局
hort,int,long,float,double,long double
の全てに関して特殊化を定義しないとだめだよね?
それだったら最初から最初からテンプレートを使わない方が良いと思っている。

俺の希望としては
「整数型と浮動小数点型とで処理が別」だけど「整数型はshort,int,long,unsigned〜で処理が共通」で「浮動小数点型はfloat,double,long doubleで処理が共通」
がテンプレートで実現できれば、実装は(整数型と浮動小数点型の)2カ所で済むじゃん。
という発想なんだよねぇ。

C++のテンプレートでは無理なのだろうか。。。

154 :デフォルトの名無しさん:2009/02/22(日) 18:30:09
boost の enable_if がそううことするためのものじゃないっけ?

155 :150:2009/02/22(日) 18:45:02
>>154
enable_if: 関数テンプレートオーバロードの選択的インクルード. Jaakko Jarvi, Jeremiah Willcock, and Andrew Lumsdaine. これはSFINAE(substitution-failure-is-not-an-error:置換失敗はエラーではない)原理を利用した新しい重要な技術である.
これか。
boostは好きだが、現在取り組んでいる対象はいわば自作のライブラリなのでboostが無いと使えないライブラリにするわけには行かないんだよねぇ。。。
とりあえず
本の虫: Boostのenable_ifについて
http://cpplover.blogspot.com/2008/01/boostenableif.html
こことか読んでる。
もしenable_ifの技術を流用して「boostのenable_ifライブラリのインクルードなし」で出来るようだったらこれで解決しそうだが、
まあわざわざライブラリになっているくらいだからたぶん相当めんどくさい事になるのかなぁ。



156 :デフォルトの名無しさん:2009/02/22(日) 19:04:14
enable_ifの実装は比較的簡単。
よく使われるからライブラリになってるだけ。
boostのやつをぱくって自分用enable_ifを作ればいいじゃん。
>>151ならこんな感じでいけるっぽい:
class Hoge {
public:
  template<typename U>
  Hoge(U v, typename boost::enable_if< boost::is_integral<U> >::type* = 0);
  template<typename U>
  Hoge(U v, typename boost::enable_if< boost::is_floating_point<U> >::type* = 0);
};
template<typename U>
Hoge::Hoge(U v, typename boost::enable_if< boost::is_integral<U> >::type*) {
  std::cout << "整数" << std::endl;
}
template<typename U>
Hoge::Hoge(U v, typename boost::enable_if< boost::is_floating_point<U> >::type*) {
  std::cout << "小数" << std::endl;
}
template Hoge::Hoge(int, void*);
template Hoge::Hoge(long, void*);
template Hoge::Hoge(double, void*);

ちなみにis_integralやis_floating_pointは
template<typename> struct is_integral { static const bool value = false; };
template<> struct is_integral<int> { static const bool value = true; };
template<> struct is_integral<long> { static const bool value = true; };
みたいな感じで。

157 :デフォルトの名無しさん:2009/02/22(日) 20:37:40
>>156
サンクス
ちょっと出先なので
家に帰ったら熟読させてください。


158 :デフォルトの名無しさん:2009/02/23(月) 22:43:47
前スレでfinallyについて質問した者ですが、遅ればせながらBoost.ScopeExitと
いうものを発見しました。まさに我が意を得たり。

> Nowadays, every C++ developer is familiar with RAII technique.
> It binds resource acquisition and release to initialization and destruction
> of a variable that holds the resource. But there are times when writing a
> special class for such variable is not worth the effort.
> This is when ScopeExit macro comes into play.

やはり必要だと思ってる人はいたんだと安心すると同時に、現行C++の範囲でも
ここまでできることに少し感動です。
自分で変なテクニックを使うのは気が進まなくても、boostが正式採用するのなら
使ってみようかという気にもなりますよね。

159 :デフォルトの名無しさん:2009/02/25(水) 14:50:11
constは非常に良く使う。特に参照と組み合わせて。
しかし、俺はvolatileは使ったことないんだよねぇ。
みんな使うものなん?


160 :デフォルトの名無しさん:2009/02/25(水) 15:13:27
ベンチマーク用に最適化を抑制したいときくらいかな。
マルチスレッドなどで簡易的に使う場合もたまにあるけど。

161 :デフォルトの名無しさん:2009/02/25(水) 15:25:07
>>160
ほほ〜。そうなんか。

162 :デフォルトの名無しさん:2009/02/25(水) 15:43:53
ポインタの指す先がI/Oポートでもない限り volatile なんか出番なし。

163 :159(=161):2009/02/25(水) 15:47:01
いやさ、俺はC++ってよく知らない機能は使わないですごしちゃうんだよね。
だからvolatileを俺が使わないのは俺の知識不足なのか、それともみんなvolatileの出番はそんなにないものなのかが聞きたかったのだ。


164 :デフォルトの名無しさん:2009/02/25(水) 16:56:44
普段は無くても困らないが、必要なときには必須

volatile int *n = HARDWARE_DEVICE_ADDR;
*n = 1;
*n = 1; // 確かに2回代入

こういうのを最適化されないためにはvolatileが要る

165 :デフォルトの名無しさん:2009/02/25(水) 18:17:35
intとかに使うことはあるけど、クラスに使うことはないな。

166 :163:2009/02/25(水) 18:38:09
volatileが付いていると、constの有無と同じでなんか変にコンパイルエラーになるんだが。
signatureが違うからオーバーロードの時に困っているだけだが、いちいち うっとうしくない?

167 :デフォルトの名無しさん:2009/02/25(水) 18:48:17
>>159
マルチスレッドでも使うけど。
ハードのアクセスなしでシングルスレッドだったら使う必要は無いね。


168 :デフォルトの名無しさん:2009/02/25(水) 18:50:06
>>166
修飾した以上違う型なのだから仕方が無い。

169 :デフォルトの名無しさん:2009/02/25(水) 19:00:09
>>166
volatile で怒られるような使い方は発想が間違っている

170 :デフォルトの名無しさん:2009/02/25(水) 19:02:03
マルチスレッドでもハードウェアアクセスでも使ったことあるが、
引数にvolatileつけたことはないな。

InterlockedIncrementみたいに、既存の関数を使うことならあるけど。

171 :166:2009/02/25(水) 19:29:44
ふーむ。そうか。
やっぱり俺の不勉強がいろいろ原因クサイな。


172 :デフォルトの名無しさん:2009/02/25(水) 20:35:06
>>166
volatileはvolatileとして扱う必要がある。
コンパイルエラーが出てるうちが華。

173 :デフォルトの名無しさん:2009/02/25(水) 20:45:52
do-while文とwhile文、どっちがコンパイラが最適化しやすいとかありますか?
(処理の都合上明らかにどっちかのが自然に書けるという場合でなく、同じくらいだとしてです。)


174 :デフォルトの名無しさん:2009/02/25(水) 20:56:35
>>150
boost使わない場合、ひねくらずにtypeidで型区別して関数に渡せばいいんじゃね?
あんまり美しくないけど、コードはシンプルになるはず

template <typename T> Sample_Class(T value)
{
std::string valueTypeName = typeid(value).name();
if( valueTypeName == typeid(int).name() ||
valueTypeName == typeid(long).name() ...) // unsigned などもチェック
{
funcInteger(); // 整数用関数
}
else if( valueTypeName == typeid(float).name() ...) // double もチェック
{
funcDecimal(); // 小数用関数
}
else
{
assert(!"invalid type");
}
}


175 :150:2009/02/25(水) 21:01:26
>>174
あ〜typeidね。
なるほど。
ただ、俺としてはコンパイルエラーないしリンクエラーで検出したいってのもあったんだよね。


176 :デフォルトの名無しさん:2009/02/25(水) 21:13:20
クラスの命名基準ってなんかあったっけ?

177 :デフォルトの名無しさん:2009/02/25(水) 22:09:47
短すぎず長すぎず、名前で何をするクラスなのかが一目瞭然である事
人の名前を使わない事
誤解や差別を意識させるような単語は使わない事
唯一無二の名詞形であり、スペルミスを引き起こすような単語は避ける事
自分の子供に名前をつけるときと同じくらい悩んで命名する事

178 :デフォルトの名無しさん:2009/02/25(水) 22:14:15
hage

179 :デフォルトの名無しさん:2009/02/25(水) 22:16:50
使い捨てRAIIクラスの命名には困る
HogeManagerとかHogeRAIIとかHogeAutoとかHogeUserとかHogeScopeとかHogeSafeとかHogeFinalとかHoge_とか
いろいろ試したがどれも気持ち悪い
今はとりあえずHogeHolderに落ち着いてるが、やっぱりしっくり来ない

180 :デフォルトの名無しさん:2009/02/25(水) 22:23:18
命名って難しいよなぁ プロジェクトによって変わったりもするし
うちはメンバ変数は variableMember_ みたいにしてるけどほかはどうなんだろう

181 :デフォルトの名無しさん:2009/02/25(水) 22:31:30
>>167
マルチスレッドではvolatileにしないで排他をかけるべき
たとえread、writeの関係であっても

排他をかけることでほとんどの処理系では
その辺の最適化の抑制をしてくれる

つーわけで普通のアプリでvolatileを使うことはまずない


182 :デフォルトの名無しさん:2009/02/25(水) 22:37:11
・ volatile オブジェクトは volatile メンバ関数か const volatile メンバ関数しか呼べない
・ volatile コピーコンストラクタ、volatile 代入演算子は暗黙に作成されない

クラスオブジェクトを volatile にする際の注意点な。
まああんまクラスオブジェクト自体を volatile にすることはないが、
構造体くらいならあるかもしれないな。たまには。

183 :デフォルトの名無しさん:2009/02/25(水) 22:40:14
void Foo::bar() volatile{/*...*/}
って一瞬ギョッとするよな
見慣れないから

184 :デフォルトの名無しさん:2009/02/25(水) 23:04:24
class Foo {
public:
 Foo() : m_n(0) { }
 explicit Foo(int n) : m_n(n) { }
 Foo(const volatile Foo& foo) : m_n(foo.m_n) { }
 void operator=(const volatile Foo& foo) volatile { m_n = foo.m_n; }
 volatile int* Get() volatile { return &m_n; }
 const volatile int* Get() const volatile { return &m_n; }
private:
 int m_n;
};

ああ面倒くせえ。
operator= の戻り値の型を volatile Foo& にしたら、
foo2 = foo1; と書いただけで volatile Foo& を誰も参照してねーよと警告出しやがるし。

185 :デフォルトの名無しさん:2009/02/26(木) 01:53:25
>174
type_info::nameは、クラスの比較用としては使い物にならないので止めたほうが良いよ。



186 :デフォルトの名無しさん:2009/02/26(木) 02:02:33
g++にて
std::string str;
long num=std::string::npos;
if(num>0){str="num>0";}//@
if(num<0){str="num<0";}//A
if(num==0){str="num==0";}//B
こうすると確かにAが実行されるんだが、numをlong型からlong long型へ変更して
std::string str;
long long num=std::string::npos;
if(num>0){str="num>0";}//@
if(num<0){str="num<0";}//A
if(num==0){str="num==0";}//B
とするとなんとAが実行されてしまう。
どうにかならない??

187 :デフォルトの名無しさん:2009/02/26(木) 04:01:03
何を言っているのかわからないことだけはわかった。

188 :デフォルトの名無しさん:2009/02/26(木) 04:30:39
どうにかしたらどうなってほしいんだ?

189 :デフォルトの名無しさん:2009/02/26(木) 04:49:40
>>173
通常は、do-whileの方が初回の比較がない分だけ無駄の少ないコードになることが多い。
しかし、iccのようにforの最適化を重視しているコンパイラの場合、forで書く方がいいかも知れない。
詳しくは最適化スレで。

190 :デフォルトの名無しさん:2009/02/26(木) 05:06:47
>>187
要約

「(charがsignedな環境で) charに代入した0xFFは0より小さいのに
intに代入した0xFFが0より大きいと判定されるんだけどどうにかならない?」
と言ってるのと同等。


どうなって欲しいのかは不明。

191 :デフォルトの名無しさん:2009/02/26(木) 06:37:45
staticメンバ関数を利用するメリットってあるんでしょうか?

192 :191:2009/02/26(木) 06:43:25
すいません
スレ移動します

193 :186:2009/02/26(木) 12:21:36
みんなホントごめん。
書き間違えた・・・。

g++にて
std::string str;
long num=std::string::npos;
if(num>0){str="num>0";}//@
if(num<0){str="num<0";}//A
if(num==0){str="num==0";}//B
こうすると確かにAが実行されるんだが、numをlong型からlong long型へ変更して
std::string str;
long long num=std::string::npos;
if(num>0){str="num>0";}//
if(num<0){str="num<0";}//A
if(num==0){str="num==0";}//B
とすると@が実行されてしまう。
どうにかならない??

だった。

194 :186:2009/02/26(木) 12:30:48
つまりnumが
short型→num<0
int型→num<0
long型→num<0
longlong型→num>0
となるんだか、どうして??


195 :デフォルトの名無しさん:2009/02/26(木) 12:38:09
npos == 0xffffffffUL だと仮定すればすべて納得がいく

196 :デフォルトの名無しさん:2009/02/26(木) 12:40:58
>>193-194
>>190 を100回嫁。

197 :デフォルトの名無しさん:2009/02/26(木) 12:41:19
ttp://d.hatena.ne.jp/odz/20070227/1172601610

ぬんぽすは -1 とは限らない

198 :デフォルトの名無しさん:2009/02/26(木) 12:42:55
ありがとう!
読んでくる。


199 :デフォルトの名無しさん:2009/02/26(木) 12:50:21
一般的な実装だと、std::string::nposはsize_typeだな。
で、size_typeはsize_tだからunsigned(long)だと。

200 :デフォルトの名無しさん:2009/02/26(木) 12:54:30
なるほど、gccのnposの定義はこうなっているな。
--
// Data Members (public):
// NB: This is an unsigned type, and thus represents the maximum
// size that the allocator can hold.
/// @var
/// Value returned by various member functions when they fail.
static const size_type npos = static_cast<size_type>(-1);

201 :=186(=198):2009/02/26(木) 13:45:28
すると、つまりは
std::size_tがunsigned longでありunsigned long longでないことから
ビット表現の都合上std::string::nposをlong longにキャストしても-1にはならなかったということか。

もしもstd::size_tが(というかnposが)unsigned long longで定義されていたらlong longにキャストすると-1に等しくなったであろうと考えて正しい?

202 :デフォルトの名無しさん:2009/02/26(木) 13:49:07
>>201
正しいかどうかに関わらず、nposを汎整数型に代入しちゃダメだろ。

203 :デフォルトの名無しさん:2009/02/26(木) 13:57:21
C++の鉄則、表現方法ではなく型を信じろって奴ですね。

204 :デフォルトの名無しさん:2009/02/26(木) 14:42:37
21.3にbasic_string<charT, traits, Allocator>::nposはAllocator::size_type型で-1とあり
20.1.6でAllocatorのsize_typeはunsigned integral typeとある。

205 :デフォルトの名無しさん:2009/02/26(木) 15:21:48
だったら Allocator::size_type 型で受け渡しするべき。
勝手にキャストしちゃらめぇ。

206 :デフォルトの名無しさん:2009/02/26(木) 15:38:48
どうやって unsigned が -1 になりえるんだろうな
妙な話だ

207 :201:2009/02/26(木) 15:41:03
じゃあ
関数foo()の戻り値の型が、諸処の周辺の事情によりどうしても
long long
にせざるを得ない状況でstd::string::nposをreturnしたい場合は戻値側でどうすりゃ良いと思う?
単に-1をリターンするか。。。

208 :デフォルトの名無しさん:2009/02/26(木) 15:43:50
>>207
戻値側って何だw
まあとにかく-1が返る状況がそれしかないならそれでいんじゃね?


209 :デフォルトの名無しさん:2009/02/26(木) 15:46:19
それでいいんじゃない?
っていうか、標準を無視するなら何をやっても一緒。
関数の仕様のところに明示しておいて
後は呼び出し側の責任ってことで。

ま、そのうちそんな関数は無視されて
個々の開発者が独自の関数を書くようになる。

210 :デフォルトの名無しさん:2009/02/26(木) 17:51:36
>>206
unsignedがsignedで表現できない場合, 変換は処理系に依存するらしい

211 :デフォルトの名無しさん:2009/02/26(木) 18:08:02
あるcppファイルから別のcppファイルの変数を使いたいんですけどexternしかありませんか?
同じ変数名を使ってるcppファイルが他にもあるので、そちらも影響してしまいますよね?変数名を変えてexternしかないですか?

212 :デフォルトの名無しさん:2009/02/26(木) 18:42:08
namespaceで括れば?

213 :デフォルトの名無しさん:2009/02/26(木) 18:44:20
つか「cppファイルの変数」て。
グローバルか?グローバルなのか?

214 :デフォルトの名無しさん:2009/02/26(木) 18:45:06
>>211
ポインタか参照を返す関数を作ったら?

215 :デフォルトの名無しさん:2009/02/26(木) 18:48:50
namespace・・・難しそうですね
というかexternの使い方もよくわかっていません
内容はmain.cpp do.cpp main.h do.hとあり、
do で処理をしている変数でbool型、これをmain.cppでifの条件にしたいのですが、さっきからやっているのですがうまく動きません
externはどのファイルで宣言、初期化するべきなのでしょうか?

216 :デフォルトの名無しさん:2009/02/26(木) 19:11:21
>>215
>>あるcppファイルから別のcppファイルの変数を使いたいんですけどexternしかありませんか?
初心者がグローバル変数を使う状況って、大抵は設計からおかしいろくでもない状況になっている事が多いけど大丈夫?
>>同じ変数名を使ってるcppファイルが他にもあるので…変数名を変えてexternしかないですか?
>>namespace・・・難しそうですね
いや、名前空間ぐらいは知らないとC++はまともに使えない
ロベールのC++教室 - 第50章 異姓同名 -
http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02050.html


217 :デフォルトの名無しさん:2009/02/26(木) 19:35:00
C++は、名前空間では3倍にパワーアップできるのだ

218 :デフォルトの名無しさん:2009/02/26(木) 19:38:09
俺も最初C++を学んだとき(つってもそんな昔ではないが)
名前空間
という名称を見てさぞかし難しいんだろうなと思っていた時があった。
…今思うとテンプレートの方が圧倒的に難しい。

219 :デフォルトの名無しさん:2009/02/26(木) 19:54:52
構文エラー : ';' が、識別子 'Name1' の前に必要です。
型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
'Name1' : 関数定義のようですが、パラメータ リストがありません。外見上の本体をスキップします。
'Name1' : この名前を指定された名前空間は存在しません。
なんで?

220 :デフォルトの名無しさん:2009/02/26(木) 19:57:50
>>219
それが再現するソースを見せろ
話はそれからだ

221 :デフォルトの名無しさん:2009/02/26(木) 20:03:55
ソースを見せるのだ、ルーク!

いっぱいエラーが出るときは大体1行目がその本体。
そして「 ; が識別子の前に」というエラーが出るときは
どこかでステートメント末尾の ; を付け忘れている。
一番多いのがクラス定義の末尾の ; 。
class hoge { }; を class hoge { } と書くとそんなエラー。
C++ のエラーはわかりにくい。

222 :デフォルトの名無しさん:2009/02/26(木) 20:07:02
まんまVC++っぽいなぁ
文字コードが混ざったりしてるんじゃね?

223 :デフォルトの名無しさん:2009/02/26(木) 20:07:05
てかtrueが入った時に反応してないっぽい
条件をfalseにしたら動く
その変数はdo.cppのクラスのプロテクト関数のifの中でtrueが入るようになってるし、そのtrueを使って動くdo.cpp内の箇所も正常に動く
その箇所が動いたらfalseが入るようになってる
なにかおかしい?

224 :デフォルトの名無しさん:2009/02/26(木) 20:10:17
namesapce Name1
{
void Func()
{

}
}
普通にこんな感じで囲っただけだが
ヘッダファイルでやったらエラーが100個ぐらい出た
ちなみにmainではNamea::でなくて::変数にしてた

225 :デフォルトの名無しさん:2009/02/26(木) 20:18:52
>>210
それ逆。
signed→unsignedは定義されている。
その定義で、-1を符号無し型に変換すると、変換先の符号無し型の最大値になる。

226 :201:2009/02/26(木) 20:28:46
>>225
その言葉を聞きたかったよ

227 :デフォルトの名無しさん:2009/02/26(木) 20:31:53
>>224
>namesapce Name1
馬鹿?


228 :デフォルトの名無しさん:2009/02/26(木) 20:33:23
>>227
なんで?

229 :デフォルトの名無しさん:2009/02/26(木) 20:36:41
>224の6文字目をよく見ろ、間抜け。

230 :デフォルトの名無しさん:2009/02/26(木) 20:41:14
なんでこの阿呆は断片しか張らないんだ?
つーか、なんでこの戯けは初心者スレに行かないんだ?

231 :デフォルトの名無しさん:2009/02/26(木) 20:42:23
じゃあ、以降は放置ってことで^^

232 :デフォルトの名無しさん:2009/02/26(木) 20:43:02
>>223
>なにかおかしい?
頭。

233 :デフォルトの名無しさん:2009/02/26(木) 20:44:24
おお、本当だ、でも
'Name1' : この名前を指定された名前空間は存在しません
シンボルは名前空間 'Name1' 内で定義できません
は残った、何も使ってないけど

234 :デフォルトの名無しさん:2009/02/26(木) 20:47:15
>>228
>なんで?
エラーメッセージすらはらずに何で?って聞くなヴォケ
人に聞く場合は、問題が再現する最低限のソースをはって
エラーメッセージも添えて出す物だ。


235 :デフォルトの名無しさん:2009/02/26(木) 20:52:45
てかnamespace使ったらうまくいくことは高確率で確定してるのか?
externで呼び出すことはできてるんだが同じことじゃないの?

236 :デフォルトの名無しさん:2009/02/26(木) 21:08:03
違う変数作って同じようにextern作ったらできた
予想では呼び出すのが多すぎたり同時なので一方で使えなかった
どう?

237 :デフォルトの名無しさん:2009/02/26(木) 22:49:34
>>236
もうみんな呆れてレスが付かねぇなw
>予想では呼び出すのが多すぎたり同時なので一方で使えなかった
君はマルチスレッドで処理しているとでも言うんですかな?
>>234
が言ってるように、再現するソースを見せろ。


238 :デフォルトの名無しさん:2009/02/26(木) 23:33:06
標準のC/C++においては、どんなに長い関数名でもおkですか?
もっと一般的に、トークンに文字数制限はありますか?


239 :デフォルトの名無しさん:2009/02/26(木) 23:43:45
規格上、識別子とマクロ名の長さは1024文字までは保証されてる。

240 :デフォルトの名無しさん:2009/02/26(木) 23:46:56
>>239
ありがとう。
長い。心配要らなかったな。

241 :デフォルトの名無しさん:2009/02/26(木) 23:52:43
たった1024文字〜

242 :デフォルトの名無しさん:2009/02/27(金) 00:01:45
1025文字以上の識別子やマクロを定義するバカはプログラミングの世界から即刻足を洗った方が良いから大丈夫だ。

243 :デフォルトの名無しさん:2009/02/27(金) 00:06:44
1024文字の識別子なんてコピペするのも大変だろう

244 :デフォルトの名無しさん:2009/02/27(金) 00:22:26
カオスなテンプレートだと実体化したらそれくらい行っちゃうんじゃないの

245 :デフォルトの名無しさん:2009/02/27(金) 00:26:15
えー
C++はともかく、C89においては、
内部リンケージで32文字
外部リンケージは8文字
しか保証されてなかった記憶があるけど。

246 :デフォルトの名無しさん:2009/02/27(金) 00:27:15
それは、テンプレートというかプリプロセッサのほうでは
テンプレートの場合は、コンパイラの再帰の段数制限がボトルネック

247 :デフォルトの名無しさん:2009/02/27(金) 00:31:01
>>246
>>コンパイラの再帰の段数制限がボトルネック
そんなんあるの?初耳です。

248 :238:2009/02/27(金) 00:32:37
>>245
私もC言語はなんか短そうで不安だったので、
まあC++しか使わないんでC++に限った質問にしました。


249 :デフォルトの名無しさん:2009/02/27(金) 00:34:26
あるよ。VCなら
#pragma inline_depth(255)
#pragma inline_recursion(on)
g++なら
-ftemplate-depth
BOOSTだと、使うライブラリによっては必須

250 :247:2009/02/27(金) 00:40:55
>>249
探してみました。

GNU コンパイラ集(GCC) の使い方と移植について
http://www.sra.co.jp/wingnut/gcc/gcc-j.html
-ftemplate-depth-n
テンプレートクラスの実体化の最大の深さを n にする。テンプレート実体化の深さは、テンプレートクラス実体化の際に無限に再帰が起こるのを検出するのに必要である。ANSI/ISO C++ に適合するプログラムは、17 より大きい最大の深さに頼ってはならない。

17って…なんでまたそういう現実的に問題になりそうなところで手を打っちゃうんですかねぇ。


251 :デフォルトの名無しさん:2009/02/27(金) 01:05:57
>>248
なにが「C++に限った」だ。
てめーが「標準C/C++」と書いてるから、
(ここがC++のスレにもかかわらず)「Cでは云々」って突っ込みが入ってるんじゃねーか。
てめーでどんな質問を書いたか、もう一遍読み直せボケ。

252 :デフォルトの名無しさん:2009/02/27(金) 04:25:04
>>225
signed->unsignedは書くまでもないことだし

253 :デフォルトの名無しさん:2009/02/27(金) 04:59:16
質問者は質問文もまともに書けないことが多いので回答者は
質問文を修正したうえで、質問者の意図する内容を正しく回答してください。

254 :デフォルトの名無しさん:2009/02/27(金) 10:14:06
後のエスパー誕生である

255 :デフォルトの名無しさん:2009/02/27(金) 10:34:24
質問用のテンプレでも作ったほうがいいんじゃないかなあ
相談はフリースタイルで問題ないけど

256 :デフォルトの名無しさん:2009/02/27(金) 13:05:05
class PointContainer{
public:
  virtual int getPointX(unsigned int index) = 0;
  virtual int getPointY(unsigned int index) = 0;
  virtual unsigned int pointsNum() = 0;
};
この構造体に仮想デストラクタは必要ですか?

257 :デフォルトの名無しさん:2009/02/27(金) 13:23:17
使い方による

258 :デフォルトの名無しさん:2009/02/27(金) 13:38:28
使い方
void hoge(){
  struct local:public PointContainer{
    double *x,*y;
  };
}

259 :デフォルトの名無しさん:2009/02/27(金) 13:41:12
Shift Enter押しちゃう癖が・・・

使い方
void hoge(){
  struct local:public PointContainer{
    double *x,*y;
    local(double *x,double *y):x(x),y(y){}
    関数をオーバーライド
  };
  vector<double> x,y;
  piyo(local(&x[0],&y[0]));
}

void piyo(PointContainer& pc){
  点情報を読み取る
}


こんな感じです


260 :デフォルトの名無しさん:2009/02/27(金) 18:01:44
その使い方なら必要

261 :デフォルトの名無しさん:2009/02/27(金) 18:32:07
そうですか、ありがとうございました。
ところで、何故必要なのでしょう?

262 :デフォルトの名無しさん:2009/02/27(金) 19:45:43
必要ないよ。
あと一時オブジェクトは非const参照引数に渡せないと思った。
VCでは渡せちゃうけど。

263 :デフォルトの名無しさん:2009/02/27(金) 20:40:55
std::string()という式は、空の文字列が返ることが仕様により保証されている…よね?


264 :デフォルトの名無しさん:2009/02/27(金) 20:50:53
>>262んん?どっちなんでしょう・・・。自分的には要らないかなと思ってたんですが・・・
ちなみにBCCで一時オブジェクト渡せました。そういえば、いつもならエラーになるはずなんだけど、何でだろ・・?

265 :デフォルトの名無しさん:2009/02/27(金) 21:05:31
どんなときに仮想デストラクタじゃないと問題なのか理解してれば分かるだろ。
理解があやふやならちゃんと調べた方がいい。

266 :デフォルトの名無しさん:2009/02/27(金) 21:16:43
理由はともかく、結論だけ言えば、
継承させるつもりがある: publicで仮想かprotectedで非仮想
継承させるつもりがない: 非仮想、公開は好きにしろ

267 :デフォルトの名無しさん:2009/02/27(金) 21:59:34
>>263
されていたような気がする。…気がするだけ。
>>264
この機会にデストラクタを学んでおくといいかも。いつか役に立つ時が来る。

268 :デフォルトの名無しさん:2009/02/28(土) 00:28:37
デストラクタって言うか、仮想関数の話ですよね?
基底でvirtualにしてないと、仮想関数テーブルが派生クラスの関数に上書きされちゃって
実行時にテーブルを辿れない。実行できない
だから、デストラクタでやること無いなら(メンバもPODなら)仮想デストラクタにする必要無いかなと
思ったけどこれで合ってます?

269 :デフォルトの名無しさん:2009/02/28(土) 00:42:47
特別なデストラクタが必要なのは、メモリ開放とかの後処理を要するクラスの場合。
仮想関数が必要なのは仮想の振る舞いが必要なクラスの場合。

local を PointContainer のポインタを介して削除する可能性がないなら
「仮想の」デストラクタはいらない。protected 非仮想で十分。
そうでないなら public 仮想にする必要がある。

問題は、デストラクタの中身。
PointContainer が後処理を必要としないクラスの場合、
動作内容はデフォルトのデストラクタと同じ「空」で十分だが、
デフォルトのデストラクタは public 非仮想なので
基底クラスのポインタを介した削除を許しながら、
動作は未定義というすばらしいことに。

結論:基本クラスのデストラクタは「必ず」記述しましょう。
(ハブサタ本の50項)

270 :デフォルトの名無しさん:2009/02/28(土) 01:07:31
>>268
間違ってます。

271 :デフォルトの名無しさん:2009/02/28(土) 01:15:28
> local を PointContainer のポインタを介して削除する可能性がないなら
> 基底クラスのポインタを介した削除を許しながら、

矛盾してるやん

272 :デフォルトの名無しさん:2009/02/28(土) 01:19:42
そうだよ。
デフォルトデストラクタを使うと矛盾するから「必ず」記述しましょうって話になるわけで。
詳しくはハブサタ本50項。

273 :デフォルトの名無しさん:2009/02/28(土) 01:25:11
基底クラスのポインタを介して削除する可能性がないなら非仮想public(つまりデフォルトのまま放置)でも問題ないだろ
つーか、ここまで言わないとわかんねえ?

274 :デフォルトの名無しさん:2009/02/28(土) 01:25:58
ハブサタ本っていっぱいあるんだが…

275 :デフォルトの名無しさん:2009/02/28(土) 01:30:06
>>273
だから、だめなんだって。
だめな理由はハブサタ本、C++ Coding Standards の 第50項にびっしり書いてあるよ。

っていうか、読んだこと無いのか?
Effective C++にも書いてあるだろ・・・


276 :デフォルトの名無しさん:2009/02/28(土) 01:30:57
それは可能性が無いのではなくて、
基底クラスのポインタを介して削除しないで下さいというお願いしているに過ぎない。
しかも、無視される可能性はある。
安全性という観点から言えば厳密には問題があるが、
実際問題それで大丈夫な場合もあるし、
パフォーマンス上致し方ない場合もある。

277 :デフォルトの名無しさん:2009/02/28(土) 01:35:16
>>276
そういう例外についてもハブサタ本の50項にびっしり・・・

だから何度も「ハブサタ本」と書いたんだが、
この程度の本も読んでない人いるのか?w

278 :デフォルトの名無しさん:2009/02/28(土) 01:36:30
分かりました。今までどおり仮想にします。ありがとうございました。

279 :デフォルトの名無しさん:2009/02/28(土) 01:40:36
> だから、だめなんだって。

説明になってねえぞ
自分の言葉では表現できないと見なしていいんだな?

280 :デフォルトの名無しさん:2009/02/28(土) 01:40:53
protected 非仮想にすれば基底クラスのポインタを介して削除することは不可能だよ。

281 :デフォルトの名無しさん:2009/02/28(土) 01:41:39
>>279
いいよそれでもうw
ともかくC++ Coding Standardsの50項読んでくれw

つか、その程度も読んでなくてここで回答している奴いないよな?w

282 :デフォルトの名無しさん:2009/02/28(土) 01:42:06
不可能ではない

283 :デフォルトの名無しさん:2009/02/28(土) 01:42:27
C++ Coding Standardsをハブサタ本って言われると死ぬほど違和感があるんだが

284 :デフォルトの名無しさん:2009/02/28(土) 01:43:38
いつもboost::shared_ptrを使うのなら常にpublic非仮想で問題ない

285 :デフォルトの名無しさん:2009/02/28(土) 01:44:09
> 不可能ではない

説明になってねえぞ
自分の言葉では表現できないと見なしていいんだな?

286 :デフォルトの名無しさん:2009/02/28(土) 01:44:23
共著者のテンプレート厨さんも忘れないであげてください

287 :デフォルトの名無しさん:2009/02/28(土) 01:45:38
>>285
不可能ではないと言ってるだけだ
privateデストラクタのポインタを外から合法的に取るトリックがあるだろ

288 :デフォルトの名無しさん:2009/02/28(土) 01:46:17
>>287
説明になってねえぞ
自分の言葉では表現できないと見なしていいんだな?

289 :デフォルトの名無しさん:2009/02/28(土) 01:47:43
> いいよそれでもうw

あっそう
いるんだよねー、これからって時に議論を放棄する奴って
相手するの馬鹿らしいから死んで欲しいぜ

290 :デフォルトの名無しさん:2009/02/28(土) 01:47:49
ハーブサッターといわれれば、普通Exceptionalだよなぁ
Coding Standardsを代表作のように言われるのはちょっと…

291 :デフォルトの名無しさん:2009/02/28(土) 01:49:22
消去済のベースにアクセスされる可能性がまったくないprivate以外ならvirtualってことかなるほろなるほろ

292 :デフォルトの名無しさん:2009/02/28(土) 01:51:48
スコットメイヤーズがEffective STLで
信用なら無い場所に出入りしていると
信用ならない人に出くわすと書いてるけど
まったくそのとおりだな。
こんなところの書き込みを信じるより
ちゃんと本読んで解決したほうがいい。

293 :デフォルトの名無しさん:2009/02/28(土) 01:53:37
C言語で使われる構造体と互換性と保ちつつクラス化したい場合には
非仮想デストラクタをもちつつ派生する必要があったりするんだよ。
かなりな例外的な状況だが、MFC の CPoint とかまさにそういう例だな。

294 :デフォルトの名無しさん:2009/02/28(土) 01:53:47
そう思うなら来なきゃ良いのにw

295 :デフォルトの名無しさん:2009/02/28(土) 01:57:10
CPointがあれで大丈夫なのはPODだからだし
あんまり今の話とは関係ない

296 :デフォルトの名無しさん:2009/02/28(土) 01:58:35
とりあえず、Effective C++はみんな読んだよな?

297 :デフォルトの名無しさん:2009/02/28(土) 02:00:18
生半可な知識で解答する人たちの巣窟です^^

298 :デフォルトの名無しさん:2009/02/28(土) 02:01:54
まあ、別にメイヤーズやサッターは神じゃないので
彼らも間違えることはあるし、正しいとしてもあらゆる場面で当てはまるとは限らないし

299 :デフォルトの名無しさん:2009/02/28(土) 02:02:39
>>295
POD だから大丈夫とか、頭大丈夫か?

300 :デフォルトの名無しさん:2009/02/28(土) 02:02:57
少なくとも俺よりは賢いので信じてる

301 :デフォルトの名無しさん:2009/02/28(土) 02:06:24
C++ Coding Standardsの冒頭にも盲目的に受け入れるのはやめろと書いてあるしね
でもまぁほとんど正しい ケースバイケースだが例外はやはり例外だ

302 :デフォルトの名無しさん:2009/02/28(土) 02:08:02
例外0だ! と言ってるようなのはアレだがね

303 :デフォルトの名無しさん:2009/02/28(土) 02:08:36
>>295
PODなら自分と全基底クラスのデストラクタがデフォルトなんだから
どれが呼ばれてもどうせ何もしないので問題ない
そしてPODだからsizeof(tagPOINT)とsizeof(CPoint)さえ同じなら平気

なんか間違ってるか?
非PODなら後の方の条件は成り立たないだろ

304 :デフォルトの名無しさん:2009/02/28(土) 02:09:52
Coding Standardsは読んでないな
ぱっとみ内容がつまらなかったよ
Exceptionalやらを読んだ方がよほどためになると思うが

305 :デフォルトの名無しさん:2009/02/28(土) 02:15:29
読んでない人の感想はどうでもいいです。

306 :デフォルトの名無しさん:2009/02/28(土) 02:18:16
まあEffective,MoreEffectiveとExceptional三部作を全部読んでれば
必要ない本ではある>Coding Standards
ほぼ全部この5冊のどっかに書いてることだから

307 :デフォルトの名無しさん:2009/02/28(土) 02:18:54
Coding Standardsはインデックス集で各書籍への参照が書かれているから
「Coding Standardsは読んでないが xx は読んだ」というと
「その本の nn ページを読め」と返されるぞ? 恐ろしい武器だ。

308 :デフォルトの名無しさん:2009/02/28(土) 02:19:58
Cording Standardsはガイドラインだよ。ざっと眺めるのがよろし。



309 :デフォルトの名無しさん:2009/02/28(土) 02:21:02
ほんとにEffective C++とかよんだんかい、もまいら。

310 :デフォルトの名無しさん:2009/02/28(土) 02:21:28
>>1-1000 全俺の自作自演

311 :デフォルトの名無しさん:2009/02/28(土) 02:22:49
Effective C++読まずにC++使ってる奴なんかいるわけないだろ
自殺志願者でもなけりゃ

312 :デフォルトの名無しさん:2009/02/28(土) 02:24:08
第14項(第2版だけど)を大声で読み上げてみてw

313 :デフォルトの名無しさん:2009/02/28(土) 02:25:05
あんな本に4000円も出せるかよ

…2版持ってるから3版買いづらいよ。目次見る限り常識的なことしかなさそうだし
周りの誰かに借りようと思っていたが、周りの人間もそう思っているのか誰も買っていない
皆で牽制しあっている

314 :デフォルトの名無しさん:2009/02/28(土) 02:26:19
リソース管理クラスのコピーの振る舞いはよく考えて決めよう

(第3版)

315 :デフォルトの名無しさん:2009/02/28(土) 02:30:02
基底クラスには仮想デストラクタを持たせよう

これを"墨守"する奴は馬鹿だろ

316 :デフォルトの名無しさん:2009/02/28(土) 02:41:14
3版は「ポリモーフィズムのための基底クラスには」になってて
仮想デストラクタにすべきでないケースについても書いてるけど

2版持ってないけど、ひょっとして書いてないの?

317 :デフォルトの名無しさん:2009/02/28(土) 03:59:39
おまえらの言うことよりメイヤーズの言うことを信じるわw

318 :デフォルトの名無しさん:2009/02/28(土) 04:17:13
カスプログラマほど自尊心が大きなものだということがわかりますネ^^

319 :デフォルトの名無しさん:2009/02/28(土) 04:22:45
>>316
書いてあるよ。

320 :デフォルトの名無しさん:2009/02/28(土) 04:32:17
なぜこう荒れるかね・・・

321 :デフォルトの名無しさん:2009/02/28(土) 05:45:16
カスタネットって同じ事しかできないんだな

322 :デフォルトの名無しさん:2009/02/28(土) 05:50:47
業者が自分トコの本を必死に宣伝するスレはここですか

323 :デフォルトの名無しさん:2009/02/28(土) 08:38:56
>>303
tagPOINT は POD だが CPoint は POD じゃないから、
デストラクタは空っぽだけど、規格上動作は未定義じゃね。

324 :デフォルトの名無しさん:2009/02/28(土) 10:42:56
デストラクタの動作をきちんと正しく言える人は居ないのかな。それがあればもう解決しそうだけど

325 :デフォルトの名無しさん:2009/02/28(土) 10:50:51
「正しく」って何か難しいことでもあるの?

326 :デフォルトの名無しさん:2009/02/28(土) 11:49:32
>>316
Effective C++の改訂第2版には
C++ Coding Standardsにあるような例外の記述はないよ。
もう10年も前の本だからね。
いくつかの項目は役に立たなくなってる。

アンドリューハントの達人プログラマーじゃないけど
第2版の内容しか知らない人は時代遅れのカスプログラマと見ていい。

327 :デフォルトの名無しさん:2009/02/28(土) 13:41:55
例外オブジェクトのないthrow;をcatchできますか?

328 :デフォルトの名無しさん:2009/02/28(土) 13:59:53
できます。

329 :デフォルトの名無しさん:2009/02/28(土) 15:30:21
例外オブジェクトがないthrow ?
そんなのありません。
あるとしたら、何をcatchをするんですか?
ないものをどうやってcatchするんですか?

330 :デフォルトの名無しさん:2009/02/28(土) 15:34:36
例外の再スローをキャッチするって事じゃないの?

331 :デフォルトの名無しさん:2009/02/28(土) 15:52:31
try
{
throw;
}
catch(/* ここなんて書くの? */)
{
std::cout << "catch";
}

このプログラムは落ちます。

332 :デフォルトの名無しさん:2009/02/28(土) 15:56:40
catch(...)

333 :デフォルトの名無しさん:2009/02/28(土) 16:01:41
どっちにしても落ちる

334 :デフォルトの名無しさん:2009/02/28(土) 16:04:23
throw; はアクティブな例外を再スローするんだから
アクティブな例外がないところで呼んだらそりゃ落ちるわな

335 :デフォルトの名無しさん:2009/02/28(土) 16:19:08
>>334
それが、再スローでないのにthrow;使っているコードを見てorz
それを何事もなく処理するVCが恨めしい。

336 :デフォルトの名無しさん:2009/02/28(土) 16:35:10
別に文法に違反してないでしょ
terminated()が呼ばれる事になっているし
なぜVCのせいにするのか訳わからん

337 :デフォルトの名無しさん:2009/02/28(土) 16:35:23
確かにgcc 4.1 は catch(...) で捕捉できないね
これは言語仕様の不備なのかgccのバグなのか

いずれにしても素のまま実装しているgccは、よろしくないと思われるが

338 :デフォルトの名無しさん:2009/02/28(土) 16:35:51
terminate()だった

339 :337:2009/02/28(土) 16:42:10
ごめん terminateが呼ばれるって、言語仕様で決まってるらしいね

340 :名無しさん:2009/02/28(土) 17:02:40
SQLサーバーに問合せし、結果をフェッチする場合など、返ってくるデータ数が分かりませんが、
SQLFetchをwhilede一度回して行数を確認して、もう一度Fetchしなおすならnewで
エリアを確保できるでしょうが、このエリアは関数内しかスコープがないので
クラス化して、メンバー関数としたい場合は、vectorを使うしか方法は無いんでしょうか?


341 :デフォルトの名無しさん:2009/02/28(土) 18:16:53
ダメだここの連中。

342 :デフォルトの名無しさん:2009/02/28(土) 18:37:20
・濃度が未知の集合を低コストでスコープ間で持ちまわりたい
・ただし濃度はある程度低いコストで既知にすることができる

そういう要件ならvectorでいいだろうね


343 :デフォルトの名無しさん:2009/03/01(日) 01:15:14
音楽再生プレイヤーを作りたいのですが、
「L−R」みたいに左右の音の位相を打ち消すソフトってC++で作れませんでしょうか。

344 :デフォルトの名無しさん:2009/03/01(日) 01:16:55
>>343
作れますよ

345 :デフォルトの名無しさん:2009/03/01(日) 01:18:15
そういう波形作ればいけるんじゃない?
ハードレベルが対応できるかは知らん

346 :デフォルトの名無しさん:2009/03/01(日) 01:25:36
>>343
リニアPCMに直してサンプリング単位にL-Rするだけだろ?

347 :デフォルトの名無しさん:2009/03/01(日) 07:30:57
そもそもC++で作れないソフトなんてほっとんどないだろ。
作れないのはプログラマ(俺含め)の方であって。

…強いて言うなら早さを極限まで追求するタイプのソフトくらいか。

348 :デフォルトの名無しさん:2009/03/01(日) 09:00:08
__asm

349 :デフォルトの名無しさん:2009/03/01(日) 10:07:31
楽しい人が現れたみたいなんですが、相手してくれる人居ませんかね。
http://pc11.2ch.net/test/read.cgi/unix/1127388574/389-

350 :デフォルトの名無しさん:2009/03/01(日) 10:44:08
>>349
ディフォルト・コンストラクタの呼び出しの表記上の問題:
 H h(); // ← H h = H(); のつもりなのに関数の宣言だとみなされてしまう
は、C++0x的には
 H h{};
と書けば解決するのかな。


351 :デフォルトの名無しさん:2009/03/01(日) 10:54:05
おまいは
defaultをいつも「ディフォルト」と言ってるが
desktopも「ディスクトップ」と呼ぶのか?

352 :デフォルトの名無しさん:2009/03/01(日) 11:02:46
>>351

353 :デフォルトの名無しさん:2009/03/01(日) 11:04:40
残念ながら、deskとdefaultでは発音が違うのだよ。
Pronunciation: \ˈdesk\
ttp://www.merriam-webster.com/cgi-bin/audio.pl?desk0001.wav=desk
Pronunciation: \di-ˈfȯlt, dē-; ˈdē-ˌfȯlt\
ttp://www.merriam-webster.com/cgi-bin/audio.pl?defaul01.wav=default


354 :デフォルトの名無しさん:2009/03/01(日) 11:05:05
>>350
H h;

355 :デフォルトの名無しさん:2009/03/01(日) 11:09:16
あとは351が後出しの釣り宣言で自己のダメージ広げるのを待つばかり。

356 :デフォルトの名無しさん:2009/03/01(日) 11:18:03
えー、もしかしてディフォルトという読み方を標準的な日本語(外来語)とするために
そんなに頻繁にディフォルトディフォルトディフォルトと繰り返してるんですか?

まずこの板の名無しから変えるよう努力したほうが
コミュニケーション能力を磨くより有用かもしれませんよ。

357 :デフォルトの名無しさん:2009/03/01(日) 11:19:54
釣りを封じられたので論点そらすほうに走ったようですね。

358 :デフォルトの名無しさん:2009/03/01(日) 11:22:27
>>351
descriptionは?

359 :デフォルトの名無しさん:2009/03/01(日) 11:33:22
>>357
論点なんかずらしてないよ。
日本語では「デフォルト」を使うべき、という主張は全然変わらないから。
普通の日本人はcameraをキャメラなんて言わないし。
心の中でそう思っていても、他人とコミュニケーションを取るために必要だから。

そういう「共通用語として使えることの重要性」が認識されているから
デザインパターンなんてものが生まれたわけだけど、聞いたこと無かったら調べてみるといいよ。

360 :デフォルトの名無しさん:2009/03/01(日) 11:37:17
ディザインパトゥン

361 :デフォルトの名無しさん:2009/03/01(日) 11:38:10
>>359
要約すると、デザインパターンなのかディザインパターンなのかが問題ってこと?

362 :デフォルトの名無しさん:2009/03/01(日) 11:41:51
いや、日本にはC++をbetterCとして使う奴しかいないんだから、クラスや継承なんて使うなってこと。

363 :デフォルトの名無しさん:2009/03/01(日) 12:10:17
>>359
desktopはディスクトップとは読まないからね。
そもそもディという発音自体、無いからね。
これ覚えておこうね。恥かかずに済むから。

「desktopも「ディスクトップ」と呼ぶのか?」とか、あり得ないからね、質問として。

364 :デフォルトの名無しさん:2009/03/01(日) 12:22:50
いまいち流れがわかりづらいな。

1) >>351は最初、defaultをディフォルトと読むのは、desktopをディスクトップと読むのと同様の
「間違い」だと指摘していたが、そうではないことが>>353のレスで理解できたので、
慌てて路線変更して「共通性から離れて本格的な発音にこだわることの問題点」を指摘していることにし始めた。

2) >>351は、初めから「共通性から離れて本格的な発音にこだわることの問題点」を指摘していたのだけど、
desktopをディスクトップと読むのもその仲間(「本格的な発音」を追求した書き方)だと勘違いしていたので、
そういう意図で発言しているとは誰にも思って貰えなかった。

3) >>351は初めから「共通性から離れて本格的な発音にこだわることの問題点」を指摘していたし、
desktopをディスクトップと言うのは、それとは次元の異なる「単なる間違い」であることもわかっていたが、
どういうわけか、まったく関係の無いタイミングでdesktopを引き合いに出すという電波質問をしてしまった。

どれなんだろう。

365 :デフォルトの名無しさん:2009/03/01(日) 12:23:08
> そもそもディという発音自体、無いからね。
ディフォルトもだめなん?

366 :デフォルトの名無しさん:2009/03/01(日) 12:24:48
>>365
desktopという単語の中に、そんな音は無いという意味だろ。

367 :デフォルトの名無しさん:2009/03/01(日) 12:30:07
>>353のwavでは
defaultはデフォート
deskはデャースクって聞こえる

368 :デフォルトの名無しさん:2009/03/01(日) 12:32:27
むしろ、わざわざディフォルトと書く理由を知りたい

369 :デフォルトの名無しさん:2009/03/01(日) 12:34:49
もうkatakana語排除して直接alphabet綴りで書くようにしようぜ

370 :デフォルトの名無しさん:2009/03/01(日) 12:38:39
C++の予約語はアルファベットで書くけど、デ(ィ)ストラクタには予約語が無い。object pascalだったら良かったのにね。

371 :デフォルトの名無しさん:2009/03/01(日) 12:43:02
>>368
たまたま手についちゃった書き癖じゃないの?
>>356が興奮気味に書いてるキャラ設定みたいな理由は無いだろう、たぶん。

そういえば、C++3rdの翻訳、detailをディティールって書いてて、違和感あったな。
そうは発音しないと思うんだけど・・・俺が知らないだけ?
でも、あれだって少なくとも「標準的な日本語(外来語)とするために」活動してるわけではないだろうw

372 :デフォルトの名無しさん:2009/03/01(日) 12:45:23
警告するのワーンだけは、自分の中で許せないと思っている
コミュニケーション大事だがら状況に合わせるけどね

373 :デフォルトの名無しさん:2009/03/01(日) 12:47:57
iknowで知らべたらディーテォって聞こえた
覚える為にはスペルと対応が取れてるディ(de)テイル(tail)って読みが都合が良いんだけどさ

374 :デフォルトの名無しさん:2009/03/01(日) 12:49:11
>大事だがら

さては道産子だな?(いや、道産子言葉俺は知らんけど)

375 :デフォルトの名無しさん:2009/03/01(日) 12:55:38
>>373
辞書引いて発音記号見たら
2種類の発音があることがわかった。
ただし共にtailの部分はテイルだった。

376 :デフォルトの名無しさん:2009/03/01(日) 12:59:51
template <typename T>
class Myclass
{
public:
template<char ch> T foo() const;
};

template<typename T>template<char ch>
T Myclass<T>::foo() const
{std::cout << "T and char " << std::endl;return 'c';}

として、
int main()
{
Myclass<char> hoge;
hoge.foo<5>();//27行目
return 0;
}
としてみました。
すると
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
エラー E2235 〜.cpp 27: メンバー関数は呼び出すかそのアドレスをとらなければならない(関数 main() )
エラー E2188 〜.cpp 27: 式の構文エラー(関数 main() )
*** 2 errors in Compile ***
と言われてしまいます。しかしg++でコンパイルすると問題無くコンパイルできました。
私のどのあたりの記述が悪いのでしょうか?


377 :デフォルトの名無しさん:2009/03/01(日) 13:03:56
同じ要領で \di-ˈtāl, ˈdē-ˌtāl\だから、
敢えて書くなら「ディテイル」か「ディーテイル」ってことになりそうだ。
# 前者はテイにアクセント、後者はディーにアクセント。
でもまぁ、「ディテール」は許容でいいんじゃない?
「ディティール」は許容したくないけど。

378 :デフォルトの名無しさん:2009/03/01(日) 13:06:58
>>376
コピーライトを見ると2000年だから、bccは腐ってるんじゃないの? もっと新しいバージョンはないのかな?

379 :デフォルトの名無しさん:2009/03/01(日) 13:10:53
メンバテンプレート関数の特殊化ができない有名なバグだな
その時期のBCCはマジ糞だからC++ならVC2008とか使った方がいいよ

380 :デフォルトの名無しさん:2009/03/01(日) 13:16:52
>>378-379
ありがとうございます。
私は職業プログラマではないので単なる趣味のレベルなのですが、初めてコンパイラのバグに出会ってちょっとうれしいです。


381 :デフォルトの名無しさん:2009/03/01(日) 13:24:09
char str[20];
void setStr(char *test){
str = test;
}
みたいなことってできないんでしょうか?
20文字以内の文字列をstrに突っ込みたいと思ったんですが・・・。

382 :デフォルトの名無しさん:2009/03/01(日) 13:26:37
>>381
アドレスとポインタを理解してから考えてみれば分かると思うが、それはできない。
C言語レベルで相当理解が足りないので、何か本を一冊買って通読したほうがいい。


383 :デフォルトの名無しさん:2009/03/01(日) 13:28:02
>>382
何故できないのか説明してみろよ?
偉そうに嫁とかいってるなら。

384 :デフォルトの名無しさん:2009/03/01(日) 13:29:03
>>383
お前はアドレスにアドレスが代入できると思うのか?

385 :デフォルトの名無しさん:2009/03/01(日) 13:30:04
型が違っていて暗黙の型変換が定義されていないから(←そのまま)

386 :デフォルトの名無しさん:2009/03/01(日) 13:32:07
>>383
それよりお前が説明してみれば?
教えて欲しければそう言え

387 :デフォルトの名無しさん:2009/03/01(日) 13:32:48
ちょwwwいやwww
>>381は俺だけど>>383はしらんがな・・・

388 :デフォルトの名無しさん:2009/03/01(日) 13:34:36
>>387
そうか。悪い。人違いだ。
そして俺もちょっと言い方がきつかったな。すまない

389 :380:2009/03/01(日) 13:36:49
>>378-379
bccの最新版をDLしてきました。
…が、古い版と全くおなじでした。バイナリレベルで同じ物が手に入りました(笑)
bccは諦めてg++を使います。
VC2008も挑戦してみます。

390 :デフォルトの名無しさん:2009/03/01(日) 13:37:42
冷静に考えてみると=でコピーができるなら
strcpyとかなんて関数ありませんよねー・・・C++なので素直にstring型使ってきます

391 :388:2009/03/01(日) 13:43:30
>>390
配列の名前はその先頭アドレスを指す。
よってstrはアドレスであり、それを左辺に持ってきて代入しようとしても
極論すれば100=〜としているようなものだから不可。
てなところか。
まあstd::stringが使えるならそれでいいな。


392 :デフォルトの名無しさん:2009/03/01(日) 13:44:41
宣言した時点ではstrにはNULLが入ってるっけ?

393 :392:2009/03/01(日) 13:45:50
strじゃないtestのほう

394 :デフォルトの名無しさん:2009/03/01(日) 13:51:02
>>392
入ってないよ。
C/C++はそういう余計な遅延になりそうなことはデフォルトでしたがらないからね。
char str[20];
void setStr(char *test){
std::cout << reinterpret_cast<unsigned long>(test) << std::endl;
}
としてみるとわかる。

395 :デフォルトの名無しさん:2009/03/01(日) 13:54:12
時々悩む事
void *test;

*をvoid側につけようかtest側につけようか・・・

396 :デフォルトの名無しさん:2009/03/01(日) 14:01:09
>>395
あるあるw
人によって好き嫌いあるよね。
voidの場合はともかくintだとすれば
int *a,b,c;
の様に宣言するとaだけがポインタだとわかりやすい。
しかし型という観点からはint *型なんだから、int*とくっつけるべきと言う考えもあるよね。
折衷案の
int * hoge;
はやだな。

397 :デフォルトの名無しさん:2009/03/01(日) 14:04:11
>>381
char str[20];
void setStr(char *test){
 for(int i = 0; i < sizeof(str); i++)
  str[i] = test[i];
}


398 :デフォルトの名無しさん:2009/03/01(日) 14:07:15
>>381
std::string str;
void setStr(const std::string& test){
 str = test;
}

399 :デフォルトの名無しさん:2009/03/01(日) 14:11:00
>>397
恐ろしいバグ持ちコードだな・・・
testのサイズがstrのサイズ未満だったらどうなるよ?

400 :デフォルトの名無しさん:2009/03/01(日) 14:15:11
>>399
char str[20];
void setnStr(char *test, int n){
 int size = sizeof(str) < n ? sizeof(str) : n;
 for(int i = 0; i < size; i++)
  str[i] = test[i];
}

401 :394:2009/03/01(日) 14:15:22
>>399
俺もそう思った。
…が、
「20文字以内の文字列をstrに突っ込みたいと思ったんですが・・・。」
という仮定があるようだ。ちゃんと文字数チェックしていればバグでも脆弱性でもない。


402 :デフォルトの名無しさん:2009/03/01(日) 14:17:59
>>399
char str[20];
void setStr(char *test){
 for(int i = 0; i < sizeof(str) && test[i]; i++)
  str[i] = test[i];
 str[i-1] = '\0';
}


403 :デフォルトの名無しさん:2009/03/01(日) 14:26:39
char str[20] = {'\0'};
char *pStr = str;
void setStr(char *test){
std::size_t size = 0;
static const std::size_t limitSize = 18; // ラストのヌル文字考慮
while( *pStr++ = *test++ ){
if( size++ >= limitSize )
break;
}
}

404 :デフォルトの名無しさん:2009/03/01(日) 14:27:10
>>394
ありがとう

405 :デフォルトの名無しさん:2009/03/01(日) 14:28:00
char str[20];
void setStr(char *test){
if(test == NULL) return;
 for(int i = 0; i < strlen(str); i++)
  str[i] = test[i];
test[i]='\0';
}


406 :デフォルトの名無しさん:2009/03/01(日) 14:29:46
sizeofを使うのが間違ってる

407 :デフォルトの名無しさん:2009/03/01(日) 14:32:31
#include <cstring>
char str[20];
void setStr(const char *test){
strncpy(str, test, sizeof(str));
}

408 :デフォルトの名無しさん:2009/03/01(日) 14:34:29
配列データを宣言時に初期化しないのはバグの温床
>>405のように最初のチェックでtest==NULLの時、str[20]はゴミだらけなんだぜ?
char str[20] = { '\0' };
このたったわずかな宣言だけで、安全性を高める事が出来る

まぁC++じゃ配列なんて使う方が間違っている 普通はコンテナ。

409 :デフォルトの名無しさん:2009/03/01(日) 14:37:24
>>408
速さを求めないなら配列よりコンテナだよなやっぱ。

410 :デフォルトの名無しさん:2009/03/01(日) 14:38:28
配列データを宣言時に初期化するような軟弱なコードでいいなら、C++なんて使わずにC#を使えばいい。

411 :デフォルトの名無しさん:2009/03/01(日) 14:40:49
>>401
まてまてw
「20文字以内の文字列を〜」は、*testの事を言ってるんだろう?
渡された*testがtest[3]だとしたら
 for(int i = 0; i < sizeof(str); i++)
  str[i] = test[i];
このコードでiが2以上の場合どうなるかはわかるよな?

412 :デフォルトの名無しさん:2009/03/01(日) 14:42:17
簡単なネタには喰いつきがいいなw

413 :401:2009/03/01(日) 14:42:42
>>411
素で間違えた俺がいる
不正なアクセスだ
しまった

414 :デフォルトの名無しさん:2009/03/01(日) 14:44:15
コンテナが遅いとか言ってる池沼がいるスレはこちらでしょうか?

415 :デフォルトの名無しさん:2009/03/01(日) 14:46:56
素直に自分のミスを認められるプログラマは成長する。>>413には期待してる

416 :デフォルトの名無しさん:2009/03/01(日) 14:54:49
関数外で宣言されたグローバル変数って中身0で初期化されてなかったっけ?

417 :デフォルトの名無しさん:2009/03/01(日) 15:05:12
>>416
される

418 :デフォルトの名無しさん:2009/03/01(日) 15:05:37
>>416
されるよ

419 :デフォルトの名無しさん:2009/03/01(日) 15:24:49
char str[20];
void setStr(char *test){
str = test;
}
関数外っぽいから= { '\0' };いらなくね?

420 :デフォルトの名無しさん:2009/03/01(日) 15:28:02
あーゆー手合いは、それでも = { '\0' }; を書くだろ

421 :デフォルトの名無しさん:2009/03/01(日) 15:40:07
空の文字列作るなら="";でいいんじゃないの?

422 :デフォルトの名無しさん:2009/03/01(日) 19:31:06
""で充分だろ
\0とか書くと、逆に紛らわしい

423 :デフォルトの名無しさん:2009/03/01(日) 19:32:32
絶対間違えて'0'と書く奴が出てくるしな

424 :デフォルトの名無しさん:2009/03/01(日) 19:35:29
="\0"

425 :デフォルトの名無しさん:2009/03/01(日) 19:59:34
>>423
それわかる

426 :デフォルトの名無しさん:2009/03/01(日) 21:26:11
C++の中から、monutなどのshellコマンドを呼び出すことはできますか?


427 :デフォルトの名無しさん:2009/03/01(日) 21:30:42
ID:XrL2djEm0のくだらない意見のせいで前スレ>>1000がつまらない内容になったな。
>>1も読めない自称中学生は大人になるまでロムっててね

428 :デフォルトの名無しさん:2009/03/01(日) 21:35:16
>>426
man 2 mount
もしくは
man 2 system

あとスレ違い

429 :デフォルトの名無しさん:2009/03/01(日) 21:36:26
>>370
dtorでいいじゃない。

430 :デフォルトの名無しさん:2009/03/01(日) 21:36:36
あ、system(3)だた・・・

431 :デフォルトの名無しさん:2009/03/01(日) 21:53:41
>>426
Manpage of EXEC
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/exec.3.html

432 :デフォルトの名無しさん:2009/03/01(日) 22:22:21
>>402>>405だけどさ、iはforを抜けた時点で破棄されるんじゃないの?
VC6++なら破棄されないんだろうけど。

433 :デフォルトの名無しさん:2009/03/01(日) 22:46:37
破棄されるね。

434 :デフォルトの名無しさん:2009/03/01(日) 23:13:33
破棄というかコンパイル通らないんじゃ?
VC6だとしても>>402はtestが空の場合やばそうだし、
>>405はstr[20]に代入するような気がするんだが

435 :デフォルトの名無しさん:2009/03/01(日) 23:30:07
ある関数がinline展開できるための条件(再帰でないなど)があったと思うのだが、
なんか検索してもいまいち引っかからん。
誰かinline展開できるための条件(ないしそれが分かるいいサイト)教えてくれない?


436 :デフォルトの名無しさん:2009/03/01(日) 23:34:14
コンパイラ次第。一般的な条件なんてない。

437 :デフォルトの名無しさん:2009/03/01(日) 23:50:57
>>436
そうなんか。
そして俺みたいにinlineについて詳しくない人は
無駄にinlineとか書かずにコンパイラの最適化能力に任せる様にした方がいいの?

438 :デフォルトの名無しさん:2009/03/01(日) 23:52:11
using namespace std;
ってやるのってどう思う?
俺は意地でも名前空間、stdは全部std::って付けてusingは一度も使わない様にしているんだが。


439 :デフォルトの名無しさん:2009/03/01(日) 23:59:18
俺は関数スコープでならたまに使う
あとswapする時とか、隠蔽されたメンバ関数を引っ張り出す時とか、
boostとtr1のshared_ptrを楽に切り替えたい時とか

440 :デフォルトの名無しさん:2009/03/02(月) 00:02:47
>>439
なるほど!
using嫌いだったのだが、ちょっとusing見直した。
サンクス。


441 :デフォルトの名無しさん:2009/03/02(月) 00:04:18
>>439
2行目はusingであって、using namespaceの出番ではないな。

442 :440 :2009/03/02(月) 00:06:56
>>441
まあ2行目は俺もusing使っていた。
using namespaceとしては、3行目は気がつかなかったよ。


443 :デフォルトの名無しさん:2009/03/02(月) 00:30:33
>>437
ハーブサッターの・・・

と思ったけど、またキモい人が噛み付いてくるかもしれないからヤメた。

444 :デフォルトの名無しさん:2009/03/02(月) 00:32:26
ヘッダに定義を書きたいかどうかをinline付けるかどうかの判断基準にしている。

445 :437:2009/03/02(月) 00:42:21
>>444
なるへそ。いろいろいるな。

446 :437:2009/03/02(月) 00:43:08
>>443
ハーブサッターって誰ですか?

447 :デフォルトの名無しさん:2009/03/02(月) 00:44:15
J.K.ローリングの小説の主人公

448 :デフォルトの名無しさん:2009/03/02(月) 01:00:39
沖縄人。ハブと戦わせるとやたらと強い。

449 :デフォルトの名無しさん:2009/03/02(月) 01:06:45
渡辺竜王より強いかもな。

450 :デフォルトの名無しさん:2009/03/02(月) 01:09:40
ハブ殺ったーか

451 :デフォルトの名無しさん:2009/03/02(月) 01:28:50
勉強すればわかるという回答を延々繰り返す価値があるかどうかの議論もそろそろ必要じゃねw

452 :デフォルトの名無しさん:2009/03/02(月) 03:50:42
そういうメタ議論がしたいなら他でどうぞ。

453 :デフォルトの名無しさん:2009/03/02(月) 20:46:56
g++で
error: `wcout' is not a member of `std';
と言われてしまいます。
#include <iostream>
#include <string>
#include <fstream>
#include <locale>
#include <conio.h>

std::wcout.imbue(std::locale(""));

std::wcout << 〜〜;
のところで言われます。
ヘッダのインクルードが足りないとかでしょうか?



454 :デフォルトの名無しさん:2009/03/02(月) 20:51:52
>453
多分 Cygwin 上の gcc じゃないかと推察するが、Cygwin (少なくとも 1.5) は locale 実装が腐っていることもあり wchar_t 関連は使えない。

455 :デフォルトの名無しさん:2009/03/02(月) 20:52:48
g++というよりlibstdc++の話だろうが、
ワイド文字対応が駄目すぎる環境では、wcoutなどはそもそも用意されないようになっている。
例えばCygwinとか。

456 :デフォルトの名無しさん:2009/03/02(月) 20:54:55
エスパーワラタ

457 :453:2009/03/02(月) 21:29:05
gcc 4.4.3 ubuntu です

458 :453:2009/03/02(月) 21:46:46
>>454-455
g++ (GCC) 3.4.5 (mingw special)
でした。
最新版にして来ます。
あと>>457はかわいそうな人です。

459 :デフォルトの名無しさん:2009/03/02(月) 21:52:40
>>458
>>453は最初から環境すら書けないかわいそうな脳の持ち主ですね
人のことをかわいそうと言う前に自分のかわいそうな脳をなんとかしたら

460 :デフォルトの名無しさん:2009/03/02(月) 22:16:22
>>459
あなたにオススメ。
http://www.amazon.co.jp/%E8%B2%A0%E3%81%91%E7%8A%AC%E3%81%AE%E9%81%A0%E5%90%A0%E3%81%88-%E9%85%92%E4%BA%95-%E9%A0%86%E5%AD%90/dp/4062121182


461 :デフォルトの名無しさん:2009/03/02(月) 22:34:41
ubuntu8.10
gcc_g++4.3.2

すみません、教えてください。

今、listをreturnすることはできるのでしょうか?
(func()がlistを継承せずに)
下のようなイメージです。

list<int> func() {
return list<int>
}

int main () {
list<int> is;
is = func();
}



462 :デフォルトの名無しさん:2009/03/02(月) 22:36:49
できますよ

463 :デフォルトの名無しさん:2009/03/02(月) 22:37:16
できるけど、コストが高くなりがちなんで普通はしないかなぁ

464 :デフォルトの名無しさん:2009/03/02(月) 22:47:34
できるということですね?
すみません、もう少し教えてください。

私は今、mainから、func1()を呼んでいます。func1では、答えを多数発生(場合の数、すべての
組み合わせを発生させるようなもの。例えばclass Xのリスト、list<X> Xsを作る)します。
この多数発生させたXsをreturnさせたい。

さらに言えば、さらにそのlistを作成したい。(Xss.push_back(func1())のようなことをしたいのです。)

プロはどうしているのですか?このまま単にコードを書くだけでしょうか?
それとも何か別の方法があるのですか?

私としては、mainの見通しが悪くなるので、mainにはあまり2重ループを作りたくないためにこのような
設計を考えています。


465 :デフォルトの名無しさん:2009/03/02(月) 22:58:22
プロじゃないけど、list<X>isを参照渡しかポインタ渡しするかな
実体をreturnするのはあり得ないと思う

466 :461=464:2009/03/02(月) 23:01:14
ありがとうございました。

とりあえず、ポインタ渡ししてフツーに書くしかないみたいですね。

467 :デフォルトの名無しさん:2009/03/02(月) 23:04:00
ああ、だからムーブセマンティクスよ早く来い。

468 :デフォルトの名無しさん:2009/03/02(月) 23:17:37
ムーブセ。マン。ティック。

469 :デフォルトの名無しさん:2009/03/02(月) 23:34:13
list内包したテンプレートクラス定義してコンストラクタ引数から答えを持ったオブジェクトを普通に作る
じゃだめなの?

470 :デフォルトの名無しさん:2009/03/02(月) 23:35:53
ムーブ不可の場合はコピーされて、
ムーブ可の時はムーブされんの? >STL

471 :デフォルトの名無しさん:2009/03/02(月) 23:40:52
>>470
そうなるみたい。少々無理のあるやり方と考える向きもあるようで。

472 :z102.219-103-238.ppp.wakwak.ne.jp :2009/03/03(火) 00:15:09
>>461
まず、mainは代入ではなく初期化にした方が良い。

int main(){
list<int> is = func();
}

そして、このコードがどうコンパイルされるかを確認する。
場合によっては効率の良いコードが生成されているかもよ。


473 :デフォルトの名無しさん:2009/03/03(火) 11:30:55
インライン展開してくれるかもね。

474 :デフォルトの名無しさん:2009/03/03(火) 13:48:16
初期化を = で書くなよ ぼけ

475 :デフォルトの名無しさん:2009/03/03(火) 13:49:05
いーじゃん別に

476 :デフォルトの名無しさん:2009/03/03(火) 14:02:49
>>474
口ではそういっていてもカラダはfor(int i = 0; i < N; ++i)とか書いちゃうんだろう?

477 :デフォルトの名無しさん:2009/03/03(火) 14:13:58
>>476
いーや、書かない

478 :デフォルトの名無しさん:2009/03/03(火) 14:18:44
何で初期化を=で書いたらダメなの?

479 :デフォルトの名無しさん:2009/03/03(火) 14:30:52
fusianasan の言ってることをひっくり返してみれ

480 :デフォルトの名無しさん:2009/03/03(火) 14:45:07
駄目な理由がさっぱりわからん

481 :デフォルトの名無しさん:2009/03/03(火) 16:25:15
>>479
>。よもかるいてれさ成生がドーコい良の率効はてっよに合場
先生!読みにくいし、意味わかんないです!

>>478 >>480
>>474 は多分、>>472 の例で
コンストラクタと代入演算子が呼び出されると思ってる。

482 :デフォルトの名無しさん:2009/03/03(火) 16:48:40
違うだろ
explicitが付けられるとコンパイルが通らないよ、という意味では?

483 :デフォルトの名無しさん:2009/03/03(火) 16:50:44
で?

484 :デフォルトの名無しさん:2009/03/03(火) 17:16:03
> コンストラクタと代入演算子が呼び出されると思ってる。
( ゚д゚)ポカーン

いや、いくらなんでもそんなアホは居ないだろう
474先生の詳しい解説まだー?

485 :デフォルトの名無しさん:2009/03/03(火) 17:27:15
無理矢理導入したクラスが構造化プログラミングの流れに偏っていた無残りを
間違った方向に交通整理しようとして提唱された中括弧書式優先の書法を
信奉し愛しちゃってるのが >>474 先生

486 :デフォルトの名無しさん:2009/03/03(火) 17:46:28
ここはカスみたいな回答者ばかりなので詳しいことは不明です。

487 :デフォルトの名無しさん:2009/03/03(火) 17:48:17
>>481>>482 は中らずと雖も遠からず

488 :デフォルトの名無しさん:2009/03/03(火) 17:50:14
=初期化が嫌な人は黙ってexplicitをつければ済むんじゃね?
そしてhoge a();で悩むんだな。


489 :デフォルトの名無しさん:2009/03/03(火) 17:54:07
std::string() で悩んでる香具師いたな

490 :デフォルトの名無しさん:2009/03/03(火) 18:29:54
char & c[] = "this is a pen.";
c[ 0] = 'T';

491 :デフォルトの名無しさん:2009/03/03(火) 19:21:57
474はおそらくlist<int> is = func();がlist<int> is = list<int>(func());と解釈され、
一旦余計な一時オブジェクトの生成が起こるから、非効率だと考えていたのではないかと思う。

けど、それはfunc()がlist<int>型(またはその派生クラス型)以外の場合だけ。
461のfuncはlist<int>を返すから、=で初期化しても、l
ist<int> is(func());と同じように直接初期化される。
(8.5 14節 2)にそういう規定があった)

492 :デフォルトの名無しさん:2009/03/03(火) 20:44:50
それってコピーコンストラクタを全く理解していないじゃないか

493 :デフォルトの名無しさん:2009/03/04(水) 04:05:31
これで見やすい=での初期化が安心してできるわ

494 :デフォルトの名無しさん:2009/03/04(水) 04:14:38
>>493
バカ

495 :デフォルトの名無しさん:2009/03/05(木) 08:47:15
(N)RVO


496 :デフォルトの名無しさん:2009/03/05(木) 11:33:24
標準C++の環境で
std::size_tは必ず何らかの非負整数型(それがunsignedなんなのかは不問として)のtypedefであることは保証されてる?
それとも独立した組み込み型であるようなことがありえる?

497 :デフォルトの名無しさん:2009/03/05(木) 11:39:32
>>496
サフィックス_tはtypedefの証

498 :デフォルトの名無しさん:2009/03/05(木) 11:40:52
>>496
そーなんか。
typeだと思ったんだぜ。
どうも。

499 :デフォルトの名無しさん:2009/03/05(木) 14:29:18
加算代入演算子
って英語でなんて言う?
additional substitution operator
こんな風にC++でいろいろと名前を付けるときに英語が分からなくて困る事がしばしばあるんだが、みんなそんな時どうしてる?


500 :499:2009/03/05(木) 14:31:15
ああ、ちなみに>>499
additional substitution operator
は適当に俺が直感で訳した物。

501 :デフォルトの名無しさん:2009/03/05(木) 14:34:37
>>499
まず JIS を見て、それに対応する位置を ISO で見る

502 :499:2009/03/05(木) 14:35:27
>>501
なるほど。
あ り が と う !

503 :デフォルトの名無しさん:2009/03/05(木) 14:50:58
addition and assignment operators
だな

504 :499:2009/03/05(木) 14:58:29
>>503
答えまで教えてくれるなんて助かる(> <)

505 :デフォルトの名無しさん:2009/03/05(木) 15:11:26
>>504
人の言うことを鵜呑みにしない様に。

506 :デフォルトの名無しさん:2009/03/05(木) 15:30:10
うっうー

507 :デフォルトの名無しさん:2009/03/05(木) 15:33:38
あぅあうあー

508 :デフォルトの名無しさん:2009/03/05(木) 16:17:04
しーねwwwしーねwwwww

509 :デフォルトの名無しさん:2009/03/05(木) 16:28:11
class Derived;

class Base
{
public:
Base& foo(Derived x);
};

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

という状況で、
Base& Base::foo(Derived x)
{
this->foo(static_cast<Derived>(x));//@
return *this;//A
}
と定義した。
・・・この最後の@Aを1行にまとめることはできない?


510 :デフォルトの名無しさん:2009/03/05(木) 16:31:34
基底クラスが派生クラスを知っているのはクソ設計。

511 :デフォルトの名無しさん:2009/03/05(木) 16:36:58
>>510
それもそうだな。
なんか問題の部分を抽出したらこうなってしまった。
しかもfooがfooを呼び出す定義になってるし。

てことで修正。
class Base
{
public:
Base& foo(Base x);
Base& bar(Base& x){/*適当な処理*/return x;}
};

Base& Base::foo(Base x)
{
this->bar(static_cast<Base>(x));//@
return *this;//A
}
と定義した。
・・・この最後の@Aを1行にまとめることはできない?


512 :デフォルトの名無しさん:2009/03/05(木) 16:58:38
return this->bar(static_cast<Base>(x)), *this;

513 :デフォルトの名無しさん:2009/03/05(木) 17:00:55
おやめください。

514 :511:2009/03/05(木) 17:08:35
>>512
・・・た、確かに一行だw
まあ俺の問いも意味不明かも。
すまんな

515 :デフォルトの名無しさん:2009/03/05(木) 17:18:05
/*適当な処理*/を private 関数にする。

516 :デフォルトの名無しさん:2009/03/05(木) 18:06:18
ねぇねぇ。素人質問で申し訳ないんだけど
this->bar(static_cast<Base>(x));
は単に
bar( dynamic_cast< Base >( x ) );
じゃだめなんかいのぅ?
this-> をつけないと競合する名前があるってこと?

517 :デフォルトの名無しさん:2009/03/05(木) 18:08:10
std::wstring wstr;
wstr=L"sample";
std::cout << "test1\t" << ((std::wstring(L"sample")==wstr)?"true":"false") << std::endl;
std::cout << "test2\t" << ((std::wstring(L"sample")!=wstr)?"true":"false") << std::endl;
wstr=L"あいうえお";
std::cout << "test3\t" << ((std::wstring(L"あいうえお")==wstr)?"true":"false") << std::endl;
std::cout << "test4\t" << ((std::wstring(L"あいうえお")!=wstr)?"true":"false") << std::endl;
こうするとVC2008では
test1 true
test2 false
test3 true
test4 false
となる。これは正しい。しかしこれをbccでやると
test1 true
test2 false
test3 false
test4 true
となる。
…これはbccがクソなせいか?
g++に至ってはコンパイルすらできないが。

518 :514:2009/03/05(木) 18:10:46
>>516
ああ、単にそれでおk。
ただ俺の取り組んでいる本家のソースの方(2ch投稿用に切り出した物ではなく)はテンプレートの関係でthis->をしないわけには行かなかったんで付けてたら、
つい間違って2ch投稿用に切り出した物にまで付けちゃったんだ。
惑わしてすまん。

519 :デフォルトの名無しさん:2009/03/05(木) 18:15:51
>>511
なんでキャストしてるの?

520 :デフォルトの名無しさん:2009/03/05(木) 18:20:59
>>517
g++通ったけどなぁ
バージョンは4.3.3
文字コードがsjisだったりする?

521 :514:2009/03/05(木) 18:21:20
>>519
それも無駄キャスト。
本家のソースの方(2ch投稿用に切り出した物ではなく)は他のクラスの引数も受け取れる仕様になってたから
キャストしてた。

…要するに消し忘れ。


522 :デフォルトの名無しさん:2009/03/05(木) 18:24:15
>>520
>文字コードがsjisだったりする?
文字コード…g++についてはその辺がhitかも。
とりあえずbccがクソであることは確定して良い?


523 :520:2009/03/05(木) 18:27:28
どうでもいいんだろうけど結果はちゃんと
test1 true
test2 false
test3 true
test4 false
でした

524 :522:2009/03/05(木) 18:31:09
>>523
いやそんなことない。
ありがとう!

525 :デフォルトの名無しさん:2009/03/05(木) 18:54:26
>>518
なるほど。わざわざサンクスです。

526 :517:2009/03/05(木) 20:03:21
>>520
g++を現在の最新の
g++ (GCC) 4.3.3
にして
std::wstring wstr;
wstr=L"sample";
std::cout << "test1\t" << ((std::wstring(L"sample")==wstr)?"true":"false") << std::endl;
std::cout << "test2\t" << ((std::wstring(L"sample")!=wstr)?"true":"false") << std::endl;
wstr=L"あいうえお";//17行目
std::cout << "test3\t" << ((std::wstring(L"あいうえお")==wstr)?"true":"false") << std::endl;//18行目
std::cout << "test4\t" << ((std::wstring(L"あいうえお")!=wstr)?"true":"false") << std::endl;//19行目
をコンパイルするも
〜.cpp:17: error: converting to execution character set: Illegal byte sequence
〜.cpp:18: error: converting to execution character set: Illegal byte sequence
〜.cpp:19: error: converting to execution character set: Illegal byte sequence
というエラーになる。
>>520さんの言う文字コードってのはソースファイルの文字コードのこと?
それなら[Shift-JIS]で [CR+LF]になってる。


527 :デフォルトの名無しさん:2009/03/05(木) 20:04:36
>>526
--input-charset指定していないだろ。

528 :デフォルトの名無しさん:2009/03/05(木) 20:10:27
>>526
コンパイラオプション?
やってみる。

529 :デフォルトの名無しさん:2009/03/05(木) 20:41:36
>>497
wchar_t は組み込み型だから typedef の証ではない

530 :デフォルトの名無しさん:2009/03/05(木) 20:42:07
>>529
wchar_tだけは_tだけど特別なんだろ。
C言語との兼ね合いで。

531 :デフォルトの名無しさん:2009/03/05(木) 20:42:29
だめです。

532 :デフォルトの名無しさん:2009/03/05(木) 20:43:58
>>531
何が?

533 :デフォルトの名無しさん:2009/03/05(木) 20:55:56
>>517
BCC6.10(最新版)を使うと

true
false
true
false

となった。

534 :デフォルトの名無しさん:2009/03/05(木) 20:57:20
>>530
所詮は強制力のない口約束

535 :497:2009/03/05(木) 21:35:01
>>529
互換性のために組み込みにするか否かを決める
コンパイラオプションがあったりするよ。

536 :デフォルトの名無しさん:2009/03/05(木) 22:03:31
C.2.2.1
wchar_t is a keyword in this International Standard (2.11).
It does not appear as a type name defined in any of <cstddef>, <cstdlib>, or <cwchar> (21.4).

537 :517:2009/03/05(木) 22:05:59
>>533
久々にボーランドに行ったら
Download a Trial for C++Builder
https://downloads.embarcadero.com/free/c_builder
ここからだと
C++ Compiler 5.5
しかDLできねぇ。
どこから6.10をゲットした?

538 :デフォルトの名無しさん:2009/03/05(木) 22:06:50
>>535
そういう話をしている場合でないくらいわかるだろ。

539 :デフォルトの名無しさん:2009/03/05(木) 22:07:29
>>537
売り物のBCBの最新版では?

540 :デフォルトの名無しさん:2009/03/05(木) 22:10:55
>>539
売り物かぁ。
売り物はもってないんだよねぇ。

541 :デフォルトの名無しさん:2009/03/06(金) 01:28:47
BCB買ったはいいけど一度も使ってない
ゴメンね

542 :517:2009/03/06(金) 01:39:15
みんなありがとう。
俺は最終的には
#if defined(__BORLANDC__)

#endif
という(最低のw)手段で乗り切る予定。
この辺で寝ないと明日死ぬから寝るけど。


543 :デフォルトの名無しさん:2009/03/06(金) 01:51:32
Effective C++第3版のP249に
template<typename IterT, typename DistT>
void doAdvancd(IterT& iter, DistT d, std::random_access_iterator_tag){ ... }
ってあるけど、この第3パラメータって何なの?C++て型情報をパラメータに取れるの?

これの呼び出しが
doAdvance(iter, d, typename std::iterator_traits<IterT>::iterator_category());
になってて、この第3パラメータは何なの?typenameをつけると型情報が出力されるの?

544 :デフォルトの名無しさん:2009/03/06(金) 01:53:28
>>526
ロケールを適切に設定してるか?

545 :デフォルトの名無しさん:2009/03/06(金) 02:19:32
>>543
オーバーロードの仕組みを使って適切な関数が呼び出されるようにしているだけ
std::random_access_iterator_tag はただの型で、引数名を省略している

呼び出しの方も一時変数を作って渡しているだけで特に変なことをしているわけではない
IterT がテンプレート引数じゃなくて実際の型だったら、そこにある typename は要らない
例えば、以下はOK
  doAdvance(iter, d, std::iterator_traits<std::vector<int>::iterator>::iterator_category());
IterT がテンプレート引数なせいでそこに typename をつける必要が出てくるわけだが
そこはC++の仕様だから適当に調べてくれ
説明はめんどい

546 :デフォルトの名無しさん:2009/03/06(金) 02:25:48
>>543
それ、イテレータタグといってイテレータの種類がわかる
iterator_category()によってそのイテレータの種類を表す空の構造体を返してる
その空構造体で関数をオーバーロードしてる
たとえばdistanceとかでランダムアクセス可能なのにいちいち辿っていくのは効率悪いでしょ


547 :デフォルトの名無しさん:2009/03/06(金) 02:45:31
なるほど、すごいテクニックだ。

548 :デフォルトの名無しさん:2009/03/06(金) 03:01:26
こんな時間に初心者な質問してすまないんだが…

ぐぐってもドキュメント見てもわからなかったんで
助言頂けると非常に助かります。
VC++2008ExpressEditionを使用しているので、どこかを変更しなければいけないのか…


質問の内容は…
猫でもわかるプログラミングSDK第123章
ttp://www.kumei.ne.jp/c_lang/sdk2/sdk_123.htm

これと同じプログラムを組んでも、WndProc内でcase IDM_READの
hMapFile2 = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "Kumei's Object");
のOpenFileMappingがNULLを返してくるんだけど
原因がまったくわかりませんorz

549 :デフォルトの名無しさん:2009/03/06(金) 03:07:05
>548 環境依存だから、叩かれる前にVCスレ行った方が良いよ。

550 :デフォルトの名無しさん:2009/03/06(金) 03:09:18
やっぱ環境依存なんですか…
教えてくれてサンクス

VCスレで聞いてくることにします

551 :543:2009/03/06(金) 08:18:57
つまり関数のパラメーターを受け取る変数は省略可能ってこと?
それってC++の仕様?Cでも可能?

552 :デフォルトの名無しさん:2009/03/06(金) 08:43:55
>>537>>539>>540

そうですC++Builder2009の付属品です
boostのかなりの部分にも対応しましたし昔に比べればだいぶ
良くなったと思います(昔に比べればね。VCに比べれば糞だけど)

553 :デフォルトの名無しさん:2009/03/06(金) 11:43:25
>>551
釣りか本気なのかわからんが…
distance(Iter, Iter)を例であげると実装は、distance内部で
return _distance2_(iter1, iter2, iterator_tag)
みたいなのが呼び出されて最適な関数がオーバーロードで呼び出されてる
使っている分にはiterator_tagを意識する必要はなく、distance(Iter1, Iter2)で呼び出せば良い
省略可能か、と言われると省略可能だな

本来iterator_tagはいらないんだろうけど、オーバーロードに失敗するコンパイラとかもあるから
こういう仕様になっている

554 :517:2009/03/06(金) 14:35:08
std::wstring wstr;
wstr=L"sample";
std::cout << "test1\t" << ((std::wstring(L"sample")==wstr)?"true":"false") << std::endl;
std::cout << "test2\t" << ((std::wstring(L"sample")!=wstr)?"true":"false") << std::endl;
wstr=L"あいうえお";
std::cout << "test3\t" << ((std::wstring(L"あいうえお")==wstr)?"true":"false") << std::endl;
std::cout << "test4\t" << ((std::wstring(L"あいうえお")!=wstr)?"true":"false") << std::endl;
これで正しくは
test1 true
test2 false
test3 true
test4 false
となるはずがBCC 5.5.1では
test1 true
test2 false
test3 false
test4 true
となってしまうことについて聞いた者だけど、
その後いろいろいじってみたら次のことが分かった。

555 :517:2009/03/06(金) 14:36:12
>>554続き
@〜が半角文字なら
std::wstring(L"〜")==wstr

wstr==std::wstring(L"〜")
も正しく動作する。
A〜が全角文字なら
std::wstring(L"〜")==wstr
は誤判定するが
wstr==std::wstring(L"〜")
は正しく動作する。
Bcompareメンバ関数は
std::wstring(L"〜").compare(wstr)
wstr.compare(std::wstring(L"〜"))
共に正しく動作する(等しい時に0を返す)。
…………………………
そこで、前に
bool operator==(const std::basic_string<wchar_t> &left_str,const std::basic_string<wchar_t> &right_str)
{return left_str.compare(right_str)?false:true;}
bool operator!=(const std::basic_string<wchar_t> &left_str,const std::basic_string<wchar_t> &right_str)
{return left_str.compare(right_str)?true:false;}
と記述してみたのだけれど、相変わらず
test1 true
test2 false
test3 false
test4 true
のままなのだ。これじゃだめなのだろうか?


556 :デフォルトの名無しさん:2009/03/06(金) 14:40:15
>>553
釣りではない。

質問は単純で
void func(int){printf("int\n")};
void func(float){printf("float\n");}

というのがC++では可能なのか?ということ。
また関数名を変えて多態でなくすればCでも可能なのか?と尋ねてる。

引数を受け取る変数は必ず必要だと思い込んでいたので。
(iterator_tagに関してはあまり興味はない。)

557 :デフォルトの名無しさん:2009/03/06(金) 14:56:16
>>555
大人しくBCB2009買え

558 :デフォルトの名無しさん:2009/03/06(金) 14:59:09
>>556
Effective C++読むより先に入門書読め

559 :デフォルトの名無しさん:2009/03/06(金) 15:00:23
>>555
BCC は全然知らないけど、UTF-8で書くと幸せになれるかもしれない

560 :デフォルトの名無しさん:2009/03/06(金) 15:01:38
>>556
関数のオーバーロードって知ってる?

561 :デフォルトの名無しさん:2009/03/06(金) 15:10:19
>>556
やってみればわかるだろw

562 :517:2009/03/06(金) 15:20:18
>>559
UTF-8に文字コード変換してみたけど
幸せになりきれなかった。
いろいろとコンパイルエラーになる。
〜.cpp 32: 文字列または文字定数が閉じていない(関数 main() )
〜.cpp 33: ステートメントにセミコロン(;)がない(関数 main() )
〜.cpp 33: 文字列または文字定数が閉じていない(関数 main() )
〜.cpp 34: 文字列または文字定数が閉じていない(関数 main() )
*** 4 errors in Compile ***
う〜む。
Aのstd::wstring(L"〜")==wstrが誤判定でwstr==std::wstring(L"〜")は正しく動作する
のが不可解でならないんだよねぇ。
bcc5.5.1のこの不具合に対して誰か手を打った例を示した人(やソース)はどっかに公開されてないのだろうか?

563 :デフォルトの名無しさん:2009/03/06(金) 15:48:16
1+2;
とかけるんだから
int hoge ( int ){ /**/ }
のようなものも可能だな。
引数を受け取って単に捨てる。

564 :デフォルトの名無しさん:2009/03/06(金) 15:59:03
前者と後者のつながりが良く分からない

565 :デフォルトの名無しさん:2009/03/06(金) 17:49:09
>>560
知ってるよ。>>556に例示してるでしょ。

566 :デフォルトの名無しさん:2009/03/06(金) 17:50:59
>>561
個々のコンパイラでできるかどうかではなく、C++あるいはCの規格にあるのかを知りたい。

567 :デフォルトの名無しさん:2009/03/06(金) 17:54:36
>>558
入門書では
引数をとる関数の定義には必ず引数を受ける変数が書かれているよ。

関数の引数を受け取る受ける変数を省略している例が書いてある入門書ってある?
あるなら教えて。

568 :デフォルトの名無しさん:2009/03/06(金) 17:56:00
C++を少しでも知っていれば556みたいな質問しないだろう
なぜ入門書すら読まずにここで聞くのか

569 :デフォルトの名無しさん:2009/03/06(金) 17:57:58
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
) {}

でやってる時、「nCmdShowは使用されていません」みたいな警告が出て、
そこで変数名を消すと、警告が消える、みたいなことを味わうWin開発者。

570 :デフォルトの名無しさん:2009/03/06(金) 17:58:25
>>568
なぜ?理由を具体的に。

571 :デフォルトの名無しさん:2009/03/06(金) 18:02:33
>>567
C++プライマー

572 :デフォルトの名無しさん:2009/03/06(金) 18:02:59
>>568
あ、君の疑問がわかったよね。
>>556はfuncが2つあることを疑問に思っているのではないよ。確かにそれならC++の入門書に書いてある。

でも疑問はそうじゃなくて
funcの引数が型だけで変数が無いことを疑問に思っているのだよ。

573 :デフォルトの名無しさん:2009/03/06(金) 18:34:12
>>566
だったら規格票くらい買えよ
仮にここで「保証されてる」と答えても嘘かも知れないだろ

574 :517:2009/03/06(金) 18:43:14
なんか分かってきた。
BCC 5.5.1で
bool operator==(const std::basic_string<wchar_t> &left_str,const std::basic_string<wchar_t> &right_str)
{std::wcout << left_str << L"\t" << right_str << L"\t";return left_str.compare(right_str)?false:true;}
と定義してみた。
std::wstring wstr=L"piyoあいうえお";
この時
std::wstring(L"piyoあいうえお")==wstr
とすると左オペランドleft_strが「piyo」に、右オペランドright_strが「piyoあいうえお」になっている事が分かる。これが誤動作の原因だ。
wstr==std::wstring(L"piyoあいうえお")
としたときは正しく左オペランド、右オペランド共に「piyoあいうえお」になる。
…さーて、BCC 5.5.1は見限るしか しようがないのかな。
どうにかして(つぎはぎ的にで良いから)動作させたかったのだが。


575 :デフォルトの名無しさん:2009/03/06(金) 18:48:44
556の人は後置operator++の引数とかにいちいちしょうもない名前付けてるのかな

576 :デフォルトの名無しさん:2009/03/06(金) 19:11:58
>>569
それよりもhPrevInstanceを省略するほうが先だろう。

577 :デフォルトの名無しさん:2009/03/06(金) 19:12:55
>>574
よくわからんが<string>のバグ?を自分で修正すれば良いだけじゃね?

578 :デフォルトの名無しさん:2009/03/06(金) 19:17:09
>>577
いや、他人の環境でも通用させたいライブラリ的な用途のつもりだから、
手元の修正じゃだめなんだ。
…ライブラリって言っても本気で公開したりとか言うつもりことはないんだけど、
経験のためにたまたま出会ったbcc5.5.1の不具合に対する対処を考えているところなのだ。

579 :デフォルトの名無しさん:2009/03/06(金) 19:17:15
おせっかいかもしれないけどどうせ5.5.1じゃテンプレート周りもアレなんだから見限ったほうがいいよ

580 :デフォルトの名無しさん:2009/03/06(金) 19:18:12
556は何をキレているのだ。
トム・デマルコがグルは口が悪いし意地悪だから
辛抱強く質問しろといってたじゃないかw

で、結論から言うと、それはできる。
無名のオブジェクトで所有権の移譲が行われなければ
それは単に捨てられる。パラメータに変数がない場合、
値渡しにせよ、参照にせよ、ポインタにせよ、
メモリのどこかにそれらが作られた後、単純に捨て去られる。

もちろん、オーバーロードは正常に機能する。

581 :517:2009/03/06(金) 19:32:10
>>579
やっぱそうだよねー
このスレの>>376もテンプレート周りがクソな事を示しているし。
一応bccの時のみコンパイル時に警告を表示させたいと思っているのだが
「bccの時のみ」は
#if defined(__BORLANDC__)

#endif
で出来るがbccの
# pragma
で警告だせる?指定したメッセージの。


582 :デフォルトの名無しさん:2009/03/06(金) 19:53:27
>>581
Turbo C++ Explorer 使っとけ。
この辺はまともになっている。

583 :517:2009/03/06(金) 19:58:07
>>582
どうもありがとう。
エラーメッセージは
#pragma message "気をつけてね〜"
でいいな。文面は適当に直すとして。

584 :デフォルトの名無しさん:2009/03/06(金) 21:09:23
2年前にC++を学び始めた者です。
プロになるわけでもなく(別の職業があるので)単に趣味なのですが、
そろそろまた勉強になるC++の本を買いたいと思って探しております。
何か良い本はありませんか?
Effective C++という本が人気が高そうだと思っているのですがどうでしょうか。


585 :デフォルトの名無しさん:2009/03/06(金) 21:10:28
>>584
ナイスチョイスです

586 :584:2009/03/06(金) 21:20:31
>>585
Amazon的には
Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES): スコット・メイヤーズ, 小林 健一郎: 本
http://www.amazon.co.jp/Effective-%E5%8E%9F%E8%91%97%E7%AC%AC3%E7%89%88-ADDISON-WESLEY-PROFESSIONAL-COMPUTING/dp/4894714515/ref=sr_1_1?ie=UTF8&s=books&qid=1236341768&sr=1-1
ここで多少 日本語訳に文句が付いているのですが、それでもやっぱりオススメでしょうか?


587 :デフォルトの名無しさん:2009/03/06(金) 21:27:31
訳に問題があるなら英語で読めば?

588 :デフォルトの名無しさん:2009/03/06(金) 21:28:10
>>586
名著だが邦訳は糞。

原著で読めるならそれの方がいい。

589 :デフォルトの名無しさん:2009/03/06(金) 21:32:29
>>566
C99+TC3では6.9.1でidentifierがなくてはいけないとなってます

590 :デフォルトの名無しさん:2009/03/06(金) 21:49:43
訳本をボロカス言う者は2種類いる
・それを全否定しうる誤訳・悪訳を挙げられる人(正誤表が作れる)
・洋書を自慢したいだけなナンチャッテおじさん(ソースが2ch)

591 :デフォルトの名無しさん:2009/03/06(金) 21:51:32
>>580
別にキレてないよ。どうしてそう思ったの?

それはともかくありがとう。
省略可能なのね。

592 :デフォルトの名無しさん:2009/03/06(金) 21:53:47
>>573
それを言ったらこのスレの存在意義がないでしょ。

593 :デフォルトの名無しさん:2009/03/06(金) 21:58:55
>>592
存在意義?
少なくとも「確認」に使う価値なんざねえぜ
所詮、便所の落書きだ

594 :584:2009/03/06(金) 22:01:20
>>587
>>588
私は英語にそこまで問題はないつもりですが、肝心のC++の知識の程度を加味しますと
結局「私のC++の知識で脳内で翻訳する原著」と、「C++の知識がある方が翻訳した訳本」とでは果たしてどちらがいいものでしょうか。

…と言ったことも加味して考えてみます。
ありがとうございました。

595 :584:2009/03/06(金) 22:02:14
>>590
先程アンカし忘れました。
ありがとうございました。

596 :デフォルトの名無しさん:2009/03/06(金) 22:04:00
>>593
まあ、そうだね。

597 :(!=566):2009/03/06(金) 22:05:13
>>589
関数定義ではそうなのか。
プロトタイプ宣言ではどう?

定義では
void foo(int hoge){〜〜
になっていてもヘッダーで
void foo(int);
って書く人もいるじゃん。これはどう?

598 :デフォルトの名無しさん:2009/03/06(金) 22:05:42
>>590
>それを全否定しうる誤訳・悪訳を挙げられる人(正誤表が作れる)
つまり、原書を読み、日本語訳も読んだってことだよな
原書を読んでいるのに、何でわざわざ日本語訳を購入して読むんだ

599 :デフォルトの名無しさん:2009/03/06(金) 22:11:41
>>598
少なそうだね

600 :デフォルトの名無しさん:2009/03/06(金) 22:13:04
>>589
読み飛ばしてた。ゴメン。

つまり、C99では関数定義の引数の変数(識別子?)を省略出来ないってこと?

601 :デフォルトの名無しさん:2009/03/06(金) 22:19:02
STL listでstringを追加していき、listから削除したらstringのメモリは解放されますか。
str.swap(string())のような開放しないといけませんか?

602 :デフォルトの名無しさん:2009/03/06(金) 22:25:59
自己解決しました。 listの削除で開放しました。
list<string> L;
string tmp(5*1024*1024,'a');
for(int n=0;n<1000;n++){ L.push_back(tmp);L.pop_back(); }

603 :デフォルトの名無しさん:2009/03/06(金) 22:27:27
>>589
そんなバカな
それじゃvoid foo(void)は定義できないじゃないか

604 :デフォルトの名無しさん:2009/03/06(金) 22:42:32
>>603
voidのときは例外。

605 :デフォルトの名無しさん:2009/03/06(金) 22:44:37
voidって型名なの?
void a;
って宣言できないよね。

606 :デフォルトの名無しさん:2009/03/06(金) 22:52:42
ということにしたいんですね。

607 :デフォルトの名無しさん:2009/03/06(金) 22:59:34
>>605
void a();
なら宣言できるけど、
型でなければ何だと思っていたわけ?

608 :デフォルトの名無しさん:2009/03/06(金) 23:05:46
>>598
自分の場合は

・検索がしやすい
・読むときに辞書がいらない(移動中でも読める)
・他人と話をあわせやすい

なんかの理由で買ってる
効率考えたら日本語の方が良いしね
More Effective C++のようなゴミだとそうもいかないが

609 :デフォルトの名無しさん:2009/03/06(金) 23:10:56
vector の配列って作れますか?
vectorのvectorを作れば良いのかな?

610 :デフォルトの名無しさん:2009/03/06(金) 23:11:45
作ろうと思えば作れるよ、vectorの配列
全くもってお勧めしないけどな

611 :デフォルトの名無しさん:2009/03/06(金) 23:12:02
> ・検索がしやすい

え??

612 :デフォルトの名無しさん:2009/03/06(金) 23:29:18
まとめ。

C99 では(プロトタイプ)宣言では識別子は省略可能、関数定義では識別子が必要(void の場合を除く)。

> 9899:1999
> 6.7.5.3/6
> A parameter type list specifies the types of, and may declare identifiers for,
> the parameters of the function.
>
> 6.9.1/5
> If the declarator includes a parameter type list, the declaration of
> each parameter shall include an identifier, except for the special case
> of a parameter list consisting of a single parameter of type void,
> in which case there shall not be an identifier. No declaration list
> shall follow.

C++ では識別子は省略可能。

> 14882:2003 8.3.5/8
> An identifier can optionally be provided as a parameter name; if present
> in a function definition (8.4), it names a parameter (sometimes called
> “formal argument”). [Note: in particular, parameter names are also
> optional in function definitions and names used for a parameter in
> different declarations and the definition of a function need not be
> the same. If a parameter name is present in a function declaration that
> is not a definition, it cannot be used outside of the
> parameter-declaration-clause since it goes out of scope at the end of
> the function declarator (3.3). ]

613 :デフォルトの名無しさん:2009/03/07(土) 00:02:08
>>611
たぶん「他人と話を合わせやすい」と似たような理由なんじゃないかな
日本語での表現を知りたいって理由もあるしね

もっとも、そこにそう書いてあるからってそれが一般的な表現とも限らないけどね
例えばJISの「返却値」とか

614 :デフォルトの名無しさん:2009/03/07(土) 00:10:15
随伴とかなw

615 :551:2009/03/07(土) 00:22:03
>>612
わかりやすい。ありがとう。
C++では関数定義でパラメータの識別子を省略できて、
Cでは省略できないんだね。

616 :デフォルトの名無しさん:2009/03/07(土) 00:56:08
>>615
>>612の外国語が何を言っているのか分るのか。すごいな。

617 :551:2009/03/07(土) 01:05:05
>>616
別に難しいこと書いてないけど。

618 :デフォルトの名無しさん:2009/03/07(土) 01:25:24
>>610
そうなんですか。
変数の個数のメンバーがあってそれに対応するvectorを作ろうとすると
vectorの配列が必要となるのですが、お勧めしないのであれば
どのような実装にすればいいか教えて下さい。

619 :デフォルトの名無しさん:2009/03/07(土) 01:27:17
>>618
そういう時は、要求されるデータ構造を提示してしまうのがいいと思うよ。
vectorのvectorでよさそうな気がするけど。

620 :デフォルトの名無しさん:2009/03/07(土) 01:29:44
vector<vector<?> > やっぱり、これですよね

621 :デフォルトの名無しさん:2009/03/07(土) 07:43:05
vector<vector<?>> って書けないのが悔しい

622 :デフォルトの名無しさん:2009/03/07(土) 07:48:29
nが関数fooの中で変更されない仕様になっていることが確実なとき、
void foo(int n)
よりも
void foo(const int &n)
のが望ましいよね?後者は前者の完全上位互換だと思って良いかな?


623 :デフォルトの名無しさん:2009/03/07(土) 07:52:02
>>622
いや、効率は悪化する可能性がある
すくなくとも前者より後者がよなる可能性はない

参照はポインタによって実装されているから後者は遅くなる可能性がある

624 :デフォルトの名無しさん:2009/03/07(土) 07:53:01
>>623
初めて知りました。
クラスだったら話は別かな?


625 :デフォルトの名無しさん:2009/03/07(土) 08:24:15
>>624
クラスでも、メンバ変数がint一個だったりしたら効率を落とす可能性はある。

626 :デフォルトの名無しさん:2009/03/07(土) 08:27:21
>>625
なるほど。
std::stringぐらいだとどうかな?さすがに処理が重いか。

627 :デフォルトの名無しさん:2009/03/07(土) 08:40:48
>>620
vectorのコピーが発生しまくりになるんじゃないかな
std::list<std::vector<?>>とかstd::vector<boost::shared_ptr<std::vector<?>>>のほうが軽くなるんじゃないかな

628 :デフォルトの名無しさん:2009/03/07(土) 10:47:21
nが関数fooの中で変更されない仕様になっていることが確実なとき、
コンパイラ的には
void foo(int n)
よりも
void foo(const int n)
のが最適化しやすいから望ましいよね?
今度は後者は前者の完全上位互換だと思って良いかな?

629 :デフォルトの名無しさん:2009/03/07(土) 10:50:56
プロトタイプ宣言につけず、
定義部分にだけconstつけるんならべつにいいんじゃね、ってなんかの本に書いてたで

630 :デフォルトの名無しさん:2009/03/07(土) 11:01:22
そこにconst付けても何の意味もないだろう
最適化にも全く関係しないような

631 :デフォルトの名無しさん:2009/03/07(土) 11:05:10
グローバルでもstaticでもない変数にconstつけても最適化には全く影響しないだろう

632 :デフォルトの名無しさん:2009/03/07(土) 11:21:27
>>629-631
そっか。
そんなもんなのか。

どうも。

633 :デフォルトの名無しさん:2009/03/07(土) 14:04:08
>>632
その代わりといってはなんだが、エラーチェックだけはしてくれるようになるぞ。
例えばそのfoo()で++nとするとエラーになるわけだ。

634 :632:2009/03/07(土) 14:08:50
>>633
変更するつもりが無いオブジェクトに付けておくと便利ってことね。

635 :デフォルトの名無しさん:2009/03/07(土) 15:32:27
class hoge{
std::string test
void setTest(char *str);
void setTest2(std::string str);
};
便宜上setTestとsetTest2と名前を変えましたがオーバーロードとして残しておくか悩んでいるんですが
どちらかを削るか残しておくかどちらのほうがいいんでしょうか?

636 :デフォルトの名無しさん:2009/03/07(土) 15:37:14
setTest2(std::string str);

って大変なことになるんじゃね?
stringのインスタンスって、48バイトくらいあったような。

詳しい人説明よろしく。

637 :デフォルトの名無しさん:2009/03/07(土) 15:52:23
高々48バイトだ、キニスンナ
4.8Mバイトなら、ちょっとだけ気になるがな

638 :デフォルトの名無しさん:2009/03/07(土) 15:53:01
>>635
void setTest(const char *str);
void setTest2(const std::string& str);

setTestを削れば、setTest2は一時オブジェクトを作ってsetTestの代わりをすることも可能だね

639 :デフォルトの名無しさん:2009/03/07(土) 15:58:35
testに値を代入するなら同じ名前でオーバーロードしておいた方が良い
ま、それにしてもstringの方はconst string& strにした方が良いよ

640 :デフォルトの名無しさん:2009/03/07(土) 16:19:38
>>625
寝言。

641 :622:2009/03/07(土) 17:02:13
>>640
すみません
もし>>625さんが寝言だとするなら何が正しいの?

642 :デフォルトの名無しさん:2009/03/07(土) 17:14:09
>>641
おそらく640は、int も int一個のクラスもコストは同じといいたいんだろう。実際VC++2005は同じコードが出ているね。
intやint一個のクラスで参照渡しだと間接参照になるのでオブジェクトをアクセスするときに余計なコストがかかるようになる。



643 :デフォルトの名無しさん:2009/03/07(土) 17:14:56
測定して速いほうが正しい

だいたいは、オブジェクトサイズが16バイトをこえたりする辺りが境界になるようだ
ソースは俺の寝言

644 :デフォルトの名無しさん:2009/03/07(土) 17:57:48
オブジェクトを複製するコストと、オブジェクトを間接参照するコストの比較で値渡しと参照渡しを選択する。

645 :デフォルトの名無しさん:2009/03/07(土) 18:07:15
すごいあほなこと聞いてる気がするんですが
void chkStr(char *hoge);
void chkStr(char &hoge);
って何が違うんでしょう?

646 :デフォルトの名無しさん:2009/03/07(土) 18:12:45
上がアドレスを渡していて下が実体を渡してる
指している物は一緒

647 :デフォルトの名無しさん:2009/03/07(土) 18:13:38
なるほど、ようするに*の場合はクラスであれば->を。
&の場合は.でいいってことですね、ありがとうございました

648 :デフォルトの名無しさん:2009/03/07(土) 18:15:42
適当だな。納得してるならいいが

649 :デフォルトの名無しさん:2009/03/07(土) 18:15:46
>>639>>635をよくよんだほうがいいとおもう

650 :デフォルトの名無しさん:2009/03/07(土) 18:27:58
fgetsする時に第一引数がchar*になっていますがstring型を使うことはできないんでしょうか?

651 :デフォルトの名無しさん:2009/03/07(土) 18:29:06
>>647
そしてクラスの場合[ ]の意味も変わってしまう。

652 :デフォルトの名無しさん:2009/03/07(土) 18:30:19
string::c_str()使えば?

653 :デフォルトの名無しさん:2009/03/07(土) 18:32:04
c_str()ってstringの内容をcharの文字列として出すもので入れるものじゃなくね?

654 :デフォルトの名無しさん:2009/03/07(土) 18:32:34
>>652
危険だ

655 :デフォルトの名無しさん:2009/03/07(土) 18:33:57
ああ、そうかC++のstring型なのにcのファイル取得を使うからだめなのか・・・
filestream使えばいけるのかな?というわけで試してきます

656 :デフォルトの名無しさん:2009/03/07(土) 18:35:21
ん。仕様では書き込みも保存も禁止だからやっちゃらめ。

657 :デフォルトの名無しさん:2009/03/07(土) 18:53:45
stringへ読み込ませるならifstream+std::getline(グローバル関数のほう)だろう。

658 :デフォルトの名無しさん:2009/03/07(土) 22:02:46
streamはゴミ

659 :デフォルトの名無しさん:2009/03/09(月) 04:27:23
>>624
遅レスだが、暗黙にコンストラクタが呼ばれる可能性があるので、そのコストにもよる。

660 :624:2009/03/09(月) 13:25:54
>>659
どうも。
なるほどねぇ。

661 :デフォルトの名無しさん:2009/03/09(月) 21:08:30
int i=42;
double d;
この時
d=i;//@
d=static_cast<double>(i);//A
この@の方は単純に代入しているだけで、Aはわざわざキャストであることをはっきり書いてるわけだが、その程度の認識しか俺はしていない。
Aで書く意義はあるの?

662 :デフォルトの名無しさん:2009/03/09(月) 21:31:48
書かなくていいよ。
そういう安全なキャストをいちいち明示するのは可読性を下げるだけ。

663 :デフォルトの名無しさん:2009/03/09(月) 21:48:23
>>662
俺もそう思っているのだが、みんなはどう考えているのか是非聞きたい。

664 :デフォルトの名無しさん:2009/03/09(月) 21:52:35
static_castはテンプレート用だす。

665 :デフォルトの名無しさん:2009/03/09(月) 22:03:50
>>663
>>662同意だな。
boost::numeric_castという便利なものもあるぞ

666 :デフォルトの名無しさん:2009/03/09(月) 22:18:52
>>665
boost::numeric_castは便利そうだな。
どうやって実装してるんだろうね。

667 :デフォルトの名無しさん:2009/03/09(月) 22:58:55
オーバーフローの可能性がある組み合わせだけ特殊化してチェック処理入れるんだろ

668 :デフォルトの名無しさん:2009/03/09(月) 23:27:12
>>667
ああ そういうことか。


669 :661:2009/03/09(月) 23:59:21
あと、
d=i;//@
d=static_cast<double>(i);//A
この2つで実行時のコードの速さは理論的には差はないんだよね?
例えクラスAとB(Aを継承)で
A a;
B b;
a=b;//@
a=static_cast<A>(b);//A
だったとしても、同じだよねぇ?


670 :デフォルトの名無しさん:2009/03/10(火) 00:03:03
>>669
同じ

671 :デフォルトの名無しさん:2009/03/10(火) 00:03:54
>>670
ありがと!

672 :デフォルトの名無しさん:2009/03/10(火) 00:04:51
std::string hoge="I am hoge.";
std::cout << hoge+"test" << std::endl;
std::cout << hoge+="test" << std::endl;//問題の行
こうすると、
問題の行: このコンテキストではオーバーロード 'endl' が曖昧(関数 main() )




673 :672:2009/03/10(火) 00:05:25
>>672
っていわれるんだが、どのへんが曖昧なのか分かる??

674 :デフォルトの名無しさん:2009/03/10(火) 00:08:54
+=の優先順位が低いんじゃないの?
(hoge+="test")としてみるとか

675 :デフォルトの名無しさん:2009/03/10(火) 00:09:50
>>672
std::cout << ( hoge+="test" ) << std::endl;//問題の行

あと、cout の中で演算をしてはいけない。

676 :デフォルトの名無しさん:2009/03/10(火) 00:10:36
かぶった。あと、「してはいけない」じゃなくて「しないほうがいい」にしておいて^^オマンコ

677 :672:2009/03/10(火) 00:16:48
なるほど。
()付ければいけるな。
あとcoutの中で演算しない方が良いのは何で?

678 :デフォルトの名無しさん:2009/03/10(火) 00:19:22
たとえば以下のようなコードを実行するとわかる。

int i = 0;
cout << ++i << ++i << ++i << ++i << ++i << endl;

予想される結果は「12345」だけど、実際にはめちゃくちゃになる。
<< の評価順は規定されていない。どこから評価されるか不明。
ステートメントの終わりに i が 5 になるのは確かだけど。

679 :672:2009/03/10(火) 00:24:37
>>678
俺の環境では54321になった。
なるほど、そんなんあったなぁ。
foo()==bar()
でどっちが先に評価されるか未定義なのと同じかい?

680 :デフォルトの名無しさん:2009/03/10(火) 00:25:09
ここで颯爽とインクリメント不要論が登場

681 :デフォルトの名無しさん:2009/03/10(火) 00:33:55
>>679
×未定義
○不定

682 :デフォルトの名無しさん:2009/03/10(火) 00:37:45
>>678
それは未定義。隣接する副作用完了点の間で、同じオブジェクトを二度以上変化させてはならない。

683 :672:2009/03/10(火) 00:39:08
cout << ++i << endl;
だとどうなる?
これは未定義の動作になる?それとも不定?

684 :デフォルトの名無しさん:2009/03/10(火) 00:44:46
>>683
評価される順序は:
(1) cout, ++i, endl
(2) 左側の<<
(3) 右側の<<

(1)の3式の順序は不定。

>>675も同様。

685 :682:2009/03/10(火) 00:46:31
厳密にはオブジェクトではなく、スカラオブジェクトだったか。

686 :672:2009/03/10(火) 00:52:01
>>684
んんん???
なんかクソ難しいな。
int i=-1;

if(++i){〜}
は良いんだよね?
(++i)+(++i)
はダメなの?
++iが意味不明に思えてきた。
俺のドタマで理解できる日は来るのだろうか?

687 :デフォルトの名無しさん:2009/03/10(火) 00:56:06
わかっててヤル分にはいいんじゃないかな
a += (++i)++;
とか

688 :デフォルトの名無しさん:2009/03/10(火) 00:58:43
>>686
ごく簡単に言うと、一文の中で変数を書き換えられるのは高々一回。

int i;
j = i++; // OK
j = i++ + i++; // NG

689 :687:2009/03/10(火) 01:11:42
>>686
いや俺 分かってない
>>688
>ごく簡単に言うと、一文の中で変数を書き換えられるのは高々一回。
むっちゃくちゃ分かりやすいな。

みんなから習ったことを俺なりの言葉で述べてみると、
int i=-1;において、
@if(++i){〜}は良い。
動作は、iがインクリメントされてその値が式の値となりifでの評価に使われる。
A(++i)+(++i)はダメ。
なぜなら、+の前後のどちらが先に評価されるかは不定であり、また(++i)という副作用が生じる式が一つの式の中で2回行われているというところは未定義の動作になる。
Bstd::cout << ++i << ++i << ++i << ++i << ++i << std::endl;もダメ。
なぜなら、<<の前後のどちらが先に評価されるかは不定であり、また++iという副作用が生じる式が一つの式の中で5回行われているというところは未定義の動作になる。
Cstd::cout << ++i << std::endl;は良い。
動作は、まずstd::coutと++iとstd::endlの3者が順不同で評価される(順番に関しては不定な動作)。
しかし副作用が生じる式が++iの1つしか含まれていないため未定義にはならない。その後std::cout << ++iが評価され、「std::cout << ++iの戻値」と << std::endl;とで評価が行われる。


690 :デフォルトの名無しさん:2009/03/10(火) 01:15:57
それは「副作用」とは言わない。

691 :687:2009/03/10(火) 01:19:05
>>690
ある式を評価したら何らかの変数やオブジェクトの値が変わる場合、その式は副作用を生じると称する。

…んだと思っているんだが、間違い?

692 :デフォルトの名無しさん:2009/03/10(火) 01:39:33
正解

693 :687:2009/03/10(火) 01:48:06

ええと、違う変数なら良いんだよね?
つまりn=(++i)*(++j)は正しいんでしょ?
一方 n=(++i)*(i)はダメだよね?*の前後の評価順序に関して不定。さらに++iとiがある点が未定義になるんだよね?

…なんとなくつかめてきた感がある。
要は、
「++iってインクリメントしたらその文中でiを他に参照しているところがあってはならない」
って言う風にまとめられるのかな。

694 :デフォルトの名無しさん:2009/03/10(火) 01:50:02
とりあえず評価順に依存するプログラムは書かない方が良いよ

695 :デフォルトの名無しさん:2009/03/10(火) 01:51:55
手続き型言語全否定

696 :デフォルトの名無しさん:2009/03/10(火) 01:57:42
>>693
>つまりn=(++i)*(++j)は正しいんでしょ?
そのとおり。かまわない。

>一方 n=(++i)*(i)はダメだよね?
そのとおり。

697 :687:2009/03/10(火) 02:01:42
>>696
ありがとう。
なんとなくつかめてきたよ。

698 :デフォルトの名無しさん:2009/03/10(火) 02:43:04
C++文字列
http://www.cppll.jp/cppreference/cppstring_details.html
ここ見て思ったのだが、メンバ関数の引数としてイテレータを受け入れられる用に用意されているのと用意されていないのがあるね。
どういったコンセプトでイテレータOKにするとかダメにするとか決めているか分かる人いません?

699 :デフォルトの名無しさん:2009/03/10(火) 17:40:20
>>698
std::stringに限って言えばぶっちゃけインデックスだけで十分だと俺は思うんだが。
findがインデックスを返すし、それをイテレータに足すなんてやりたくない。
…コンテナとしてはイテレータが役立つけど。

700 :デフォルトの名無しさん:2009/03/10(火) 17:46:07
>>698
一見するとconstでないメンバ関数(コンストラクタ含む)の時のみイテレータが実装されているみたいじゃね?
…何でだろうね。

701 :デフォルトの名無しさん:2009/03/10(火) 18:24:28
STLが標準に取り入れられる前からstringはあったんじゃなかったっけ。
それの関係じゃないの。

702 :デフォルトの名無しさん:2009/03/10(火) 18:55:13
誰も提案しなかったので採択もされませんでした…という話か。

703 :デフォルトの名無しさん:2009/03/10(火) 18:55:43
あるいは他のSTLとの整合性とか。


704 :デフォルトの名無しさん:2009/03/10(火) 19:10:53
おいらの彼女がC++ほどマーケティングに汚染されてないストイックな言語はない…濡れる・・って毎晩求めてくる。おいらは下からの侵入とかいって毎晩楽しんでるけどいいよね??

705 :デフォルトの名無しさん:2009/03/10(火) 19:12:39
良いんじゃないのかなまぁ

706 :デフォルトの名無しさん:2009/03/10(火) 23:30:34
setlocale(LC_ALL, "ja"); /* ロケールを日本語に設定 */
このLC_ALLって正式な標準C++仕様ですか?

707 :デフォルトの名無しさん:2009/03/10(火) 23:45:06
>>706
そうだけど、"ja"はC++標準ではない。""ですむならそのほうがいいはず。
さらに言えば、C++ならstd::locale::global(std::locale(""))使うべき。

708 :デフォルトの名無しさん:2009/03/10(火) 23:47:54
LC_ALLについて聞いてるのに、なんで"ja"について答えてるんだよ

709 :706:2009/03/10(火) 23:50:12
>>707
>>708
ありがとうございます。
std::locale::global(std::locale(""));
std::wcout.imbue(std::locale(""));
これが正解ですか?

710 :デフォルトの名無しさん:2009/03/10(火) 23:55:49
>>709
あってるんじゃね。

711 :デフォルトの名無しさん:2009/03/11(水) 08:25:45
Effective C++によれば、仮想デストラクタを持たないBaseクラスを継承させたDerivedクラスは危険であると言います。
その例としてSTLのコンテナが挙げられていました。

しかし例えば
class MyStringClass : public std::string
{〜}
とし、MyStringClassのデストラクタとして特にすることが「全くない」場合、MyStringClassを今後継承することはないものとして、それでもなお危険なのでしょうか?
std::string * p =new MyStringClass;
delete p;
とした場合はMyStringClassのデストラクタは呼ばれませんが、std::stringのデストラクタは絶対呼ばれますよね?


712 :デフォルトの名無しさん:2009/03/11(水) 08:34:02
>>711
いや、未定義動作になるのでそうとは限らない。

713 :デフォルトの名無しさん:2009/03/11(水) 08:49:54
コンテナは継承しないのが鉄則だろう
包含、非メンバ関数で処理するのは駄目なのかい?

714 :デフォルトの名無しさん:2009/03/11(水) 08:52:50
未定義だったの?
ポインタの型に合わせて呼ばれるだけなのかと思ってた

715 :デフォルトの名無しさん:2009/03/11(水) 09:16:55
ポインタの型に合わせて呼ばれ、未定義の結果を生じる

716 :デフォルトの名無しさん:2009/03/11(水) 09:30:14
>>715
どっちだよw

717 :デフォルトの名無しさん:2009/03/11(水) 11:15:45
ポインタの型std::stringに合わせて呼ばれ
MyStringClassのデストラクタが呼ばれず未定義の結果を生じる。

718 :デフォルトの名無しさん:2009/03/11(水) 11:28:08
>未定義の結果を生じる

719 :711:2009/03/11(水) 12:52:55
みなさんありがとうございます。
std::string * p =new MyStringClass;
delete p;//1
この1では未定義の動作になるのですね。
では
MyStringClass * q =new MyStringClass;
delete q;//2

MyStringClass x;//3
はどうでしょうか。1の使い方をしないで必ず2ないし3の使い方をするならばその限りにおいては未定義にはなりませんよね?
…もっとも、他者に1の使い方を明確に禁じる方法はありませんけど。

720 :711:2009/03/11(水) 12:55:06
>包含、非メンバ関数で処理するのは駄目なのかい?
私の状況に限れば大丈夫なんですけれど、まあ言語仕様上の疑問でして。。。

721 :デフォルトの名無しさん:2009/03/11(水) 13:01:59
>>719
1も2も3も何れも動作は定義されている。全て安全。
未定義とか言ってる奴はど素人だから信じなくていい。

722 :デフォルトの名無しさん:2009/03/11(水) 13:10:39
>>721
いや1は未定義だろ。
std::string(=基底クラス)のデストラクタだけが呼ばれることが[多い]ってだけで、仕様上は未定義だろ?


723 :デフォルトの名無しさん:2009/03/11(水) 13:17:23
*p->~string がどうやって「あ!オレMyStringClassだったわ」と気づくのかね?

724 :デフォルトの名無しさん:2009/03/11(水) 13:17:28
三つとも未定義
沈黙のエラー、メモリリーク、メモリ破壊、ポーティングになる
コンパイラもアロケータもエラーにしないだけ

725 :デフォルトの名無しさん:2009/03/11(水) 13:20:48
基底クラスのデストラクタが呼ばれるのが未定義なら
virtualにしてても呼ばれない可能性があるってことか?

726 :724:2009/03/11(水) 13:25:58
すまん よく見てなかった
ポインタ、参照を使用してない三番は未定義じゃないわ

727 :デフォルトの名無しさん:2009/03/11(水) 13:35:24
>>726
2は?

728 :デフォルトの名無しさん:2009/03/11(水) 13:35:33
>>722
規定されているよ

729 :デフォルトの名無しさん:2009/03/11(水) 13:40:20
>>728
未定義だよ

5.3.5
if the static type of the operand is different from its dynamic type, the static type
shall be a base class of the operand’s dynamic type and the static type shall have a virtual destructor or the behavior is undefined.

730 :デフォルトの名無しさん:2009/03/11(水) 13:49:21
1は未定義 2、3は動作する
でもコンテナとか継承を想定してないクラスを規定クラスにすんなハゲ が結論

731 :デフォルトの名無しさん:2009/03/11(水) 13:52:59
>>725
deleteは静的な型を元にデストラクタを呼ぶ。
>>719の1の例だと
実際の型はMyStringClassだけどdeleteに渡されるのはstd::string型なので
std::stringのデストラクタが呼ばれる。
しかしstd::stringのデストラクタは非仮想なので、>>729の通り未定義動作。

仮にstd::stringのデストラクタが仮想なら、実際の型MyStringClassのデストラクタが呼ばれ
正常に解体できる。

732 :デフォルトの名無しさん:2009/03/11(水) 18:23:36
わかんねえならデストラクタは必ずvirtualにしろっての
大した考えなしに非virtualデストラクタを作るのはテポドンをでたらめに撃ちまくるのと同じだ

733 :デフォルトの名無しさん:2009/03/11(水) 20:09:59
C++で参照(リファレンス)型の変数にポインタを代入する際に
キャストは必要ないですか?

たとえば
Hoge *foo = new Hoge();  //1行目
Hoge &bar1 = *foo;    //2
Hoge &bar2 = foo;     //3
bar1.func();       //4
bar2.func();       //5

は正しい?

734 :デフォルトの名無しさん:2009/03/11(水) 20:12:41
>>733
正しくありません。

735 :733:2009/03/11(水) 20:15:23
2行目は正しくて3行目はおかしいということであってますか?

736 :デフォルトの名無しさん:2009/03/11(水) 20:16:33
キャストがどうのって問題じゃない

737 :733:2009/03/11(水) 20:30:18
ああ、キャスト云々がおかしいのですね
最初の質問の「キャストは必要ないですか?」の部分は削除します
その場合どうでしょうか?

738 :デフォルトの名無しさん:2009/03/11(水) 20:41:23
>>735
どちらも正しくない

739 :デフォルトの名無しさん:2009/03/11(水) 20:45:05
>>735
コンパイル通るかどうかくらい実験しているんだろうな?

2行目は代入していないし、ポインタでもない
代入と初期化の意味が大きく異なる典型例

740 :デフォルトの名無しさん:2009/03/11(水) 22:52:41
>>739
2行目は1行目の結果で初期化するだけだから何も問題ないだろ。
寧ろあんたこそ実験してみたら?

>>733
そういうわけで、2行目は大丈夫。必然的に、4行目も大丈夫。
但し、参照先の寿命に要注意。余りお勧めはできない。

741 :711:2009/03/11(水) 22:55:05
レスが遅れてすみません。

5.3.5のくだり
if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual destructor or the behavior is undefined.
を訳すと
 もしオペランド(演算対象)の静的な型と動的な型が異なる場合、静的な型は「オペランドの動的な型の基底クラス」になる。
 そしてその静的な型は仮想デストラクタを持つべきであり、さもなければ挙動は未定義である。
となります。

そして
std::string * p =new MyStringClass;
delete p;//1
この場合、
 pの静的な型はstd::string*
 pの動的な型はMyStringClass*
よって5.3.5のくだりにより未定義の動作になるのですね。ここは理解しました。
そして
MyStringClass x;//3
が未定義でない事も明らかです。Non-copyable Mixinとかのイディオムがあるくらいですし。ここも理解しました。

では
MyStringClass * q =new MyStringClass;
delete q;//2
はどちらでしょうか?
 qの静的な型はMyStringClass*
 qの動的な型はMyStringClass*
だとしますと問題無く動作することが仕様上保証されているのではないかと思うのですが。


742 :739:2009/03/11(水) 23:00:08
>>740
俺に振ってる理由がさっぱりわからん
気でも狂ったか?

743 :デフォルトの名無しさん:2009/03/11(水) 23:02:02
>>741
何ら問題ない。
そうじゃないと非仮想デストラクタのクラスはnewできない事になってしまう。

744 :デフォルトの名無しさん:2009/03/11(水) 23:06:01
元々ポインタで扱ってる変数を
参照に入れる意味が分からん

745 :デフォルトの名無しさん:2009/03/11(水) 23:10:04
>>740
>>733 は初期化とは言っていない
寧ろあんたこそ初期化と代入を混同してるだろ

つーか、死ねば?

746 :711:2009/03/11(水) 23:10:20
>>743
ありがとうございます。


747 :デフォルトの名無しさん:2009/03/11(水) 23:11:51
>>744
俺の勝手な予想だが、「元々ポインタで扱ってる変数」を「引数として参照を取る関数」に渡す時とかじゃないか?
独立参照にする意味は分からんけどさ。

748 :デフォルトの名無しさん:2009/03/11(水) 23:19:47
名前の付け替えくらい普通にやるだろ。

749 :デフォルトの名無しさん:2009/03/12(木) 00:15:24
名前の付け替え....イクナイこと企んでいるな

750 :デフォルトの名無しさん:2009/03/12(木) 00:16:56
>>748-749
どんなときに名前の付け替えをするの?

751 :デフォルトの名無しさん:2009/03/12(木) 00:21:07
VC++2008でいろいろ試してみた結果
初期化はできたけど代入は無理だった。
ロベールにも参照先の変更は_って書いてあるから_ってことでF/A?

752 :デフォルトの名無しさん:2009/03/12(木) 00:31:31
>>750
みやすくする

753 :デフォルトの名無しさん:2009/03/12(木) 00:41:29
>>750
typedef int(*neko)(int)

neko tama = &nyao;
neko pochi = &wan;
neko giko = &shine;

754 :デフォルトの名無しさん:2009/03/12(木) 07:03:46
>>753
みたいなことは普通にやるけど、
>>733
の3が合法なのか。
そりゃ内部表現は同じだろうけど、2しか使ったことがないよ。
驚いたと言うより、気持ち悪いな。

755 :デフォルトの名無しさん:2009/03/12(木) 07:22:15
>>753
リファレンスぜんぜん関係ないじゃん

756 :デフォルトの名無しさん:2009/03/12(木) 10:38:05
>>754
そんなわけない。もちろん3番はコンパイルエラーだよ。

757 :デフォルトの名無しさん:2009/03/12(木) 14:10:19
>>754
まてまてまて
>>733の3が合法
なわけないでしょ。もちつけ。

758 :デフォルトの名無しさん:2009/03/12(木) 14:12:22
C++の標準仕様を学ぶための場所(英語可)を教えてくれ

759 :デフォルトの名無しさん:2009/03/12(木) 14:23:10
ttp://www.jisc.go.jp/
JIS検索から「X3014」を検索すれば規格書を閲覧できる

760 :!=758:2009/03/12(木) 14:36:42
>>759
いつも思うのだが、あれってどうにかしてダウンロードできないのかね?
不便で仕方ない。

761 :デフォルトの名無しさん:2009/03/12(木) 14:41:39
キャッシュ使うなりパケットをキャプチャするなり何なりと…

762 :デフォルトの名無しさん:2009/03/12(木) 14:41:54
ブラウザのpdfリーダープラグインを切れよ

763 :762:2009/03/12(木) 14:43:54
オーノー
保護されてるのか
すまんかった

764 :デフォルトの名無しさん:2009/03/12(木) 14:58:46
>>763
昔は761のような方法でダウンロードできた代わりに全ページ画像だった。
今でもそれを持っているけど、やっぱり手元に保持できるのは便利だと思う。

765 :デフォルトの名無しさん:2009/03/12(木) 14:59:57
>>758
C++相談室 part63 まで置いてあったテンプレから。
規格の話で英語可なら [JTC1/SC22/WG21 - C++] からダウンロードできるドラフトがおすすめ。

http://pc11.2ch.net/test/read.cgi/tech/1217008269/2
> 2 名前:デフォルトの名無しさん[sage] 投稿日:2008/07/26(土) 02:51:39
> ■基本■
> [C++ FAQ]
>  http://www.parashift.com/c++-faq-lite/
>  http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
>   Cとその仕様を比較しながらの解説なので分かりやすい。
>   ***** 質問の前に必ずこの二つに目を通してください *****
> [C/C++ リファレンス]
>  http://www.cppreference.com/ (英語)
>  http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
> [禿 Stroustrup]
>  http://public.research.att.com/~bs/
> [C++ International Standard]
>  http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
> [JTC1/SC22/WG21 - C++]
>  http://www.open-std.org/jtc1/sc22/wg21/
>   ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
> [JIS X3014]
>  http://www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014
>   ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。

・・・やっぱりテンプレ要るよな。次スレで復活させたい。

766 :758:2009/03/12(木) 15:19:58
>>759-765
レスありがとう。
さっそくいろいろ漁ってみるわ。

767 :デフォルトの名無しさん:2009/03/12(木) 15:29:42
>>765
そのX3014はリンク切れだった。
ググってみたら、今はこれで通じるみたい。
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014

768 :デフォルトの名無しさん:2009/03/12(木) 16:44:39
>>767
おお、いけるね。
ありがとう!

769 :デフォルトの名無しさん:2009/03/12(木) 22:27:51
演算式文字列を計算するクラスや関数ってどこかに落ちてませんか?

"4 * (3 + 2) / 2"
"1 + (1 <= -1 ? 100 : 200) * 2"

のような文字列を数値にしたいのですが。

770 :デフォルトの名無しさん:2009/03/12(木) 22:29:15
>>769
それぐらいの言語プロセッサ自分で設計しろ

771 :デフォルトの名無しさん:2009/03/12(木) 22:34:14
>>769
その規模ならboost::spiritで割と簡単にできる。

772 :デフォルトの名無しさん:2009/03/12(木) 23:21:25
std::string hoge="sample_string";
この時、hogeのインデックス3で表される部分から3文字分の文字を削除した文字列を出力したい時は
hoge.erase(2,3);
std::cout << hoge << std::endl;
とすればよい。だがコレではhogeの内容が改変されてしまうし、何よりhogeがconstだったら通用しない。
そこで
std::cout << std::string(hoge).erase(2,3) << std::endl;
std::cout << hoge << std::endl;
という代案を考えて見たのだが、このように
「テンポラリオブジェクトに対する破壊的なメンバ関数の呼び出し」
は問題無く動作することが仕様上保証されている?

773 :772:2009/03/12(木) 23:22:14
>>772
>hogeのインデックス3で表される部分から3文字分
じゃなくてhogeのインデックス2で表される部分から3文字分だったか。まあ主旨には関係ないけど。

774 :デフォルトの名無しさん:2009/03/12(木) 23:40:16
>>772
大丈夫だったはず。
でなけりゃ std::vector<T>(v).swap(v); ができなくなってしまう。

775 :デフォルトの名無しさん:2009/03/12(木) 23:47:35

     /V\   |
    /◎;;;,;,,,,ヽ,  |
 _ ム::::(,,゚д゚):|  J
ヽツ.(ノ:::::::::.:::::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'

776 :デフォルトの名無しさん:2009/03/12(木) 23:53:35
>>774
その式の動作はわかるが目的がわからない

777 :デフォルトの名無しさん:2009/03/13(金) 00:04:53
>>776
capacity()とsize()を一致させる為の常套手段

778 :デフォルトの名無しさん:2009/03/13(金) 00:06:21
例外安全を確保するときにもつかうよね

779 :デフォルトの名無しさん:2009/03/13(金) 00:10:51
std::vectorでcapacityを0にする、つまり確保したメモリを開放する方法は提供されていますか?

780 :デフォルトの名無しさん:2009/03/13(金) 00:14:08
とりあえずそのスコープから脱出する

781 :デフォルトの名無しさん:2009/03/13(金) 00:21:41
>>779
>>774を応用して std::vector<T>().swap(v)

782 :772:2009/03/13(金) 00:26:09
やっぱ使うよね。
どうも!

783 :デフォルトの名無しさん:2009/03/13(金) 01:35:47
記述の簡便さに比べCPU時間はエライ事に。

784 :デフォルトの名無しさん:2009/03/13(金) 09:33:09
エライこととは定量的には?

785 :デフォルトの名無しさん:2009/03/13(金) 09:47:55
C++の標準ライブラリでファイルストリームから
改行文字までの1行を取り出す関数なんかってありますかね?

786 :デフォルトの名無しさん:2009/03/13(金) 10:06:03
>>785 std::getline()

787 :デフォルトの名無しさん:2009/03/13(金) 10:11:26
>>786
すいません改行文字も取り込みたいのですがどうしたら可能ですか?

788 :デフォルトの名無しさん:2009/03/13(金) 10:12:41
>>786
できました、ありがとうございます。
>>787>>785の私ではありません

789 :デフォルトの名無しさん:2009/03/13(金) 10:15:53
>>787
なんのために?

どうしてもと言うなら std::getline() の後に結果の string の
末尾に '\n' を付け足せば同じことだと思うんだけど。

790 :デフォルトの名無しさん:2009/03/13(金) 10:40:46
見直せばそりゃ語りっぽいよなぁと思いつつ、質問は本当です
>>789
ファイルを読み込むとき末尾が改行で終わってるのか、改行なしで終わってるのか分からなくなるんです。


791 :デフォルトの名無しさん:2009/03/13(金) 12:31:10
C++暦5分の俺が質問
ttp://www.stat.phys.kyushu-u.ac.jp/~ryokawa/cbegin2_3/html4/cbegin_c1_s5.html#ss_triangle
ここ見てHalloWorldとか作りながらなんとなく理解してるつもりで進んできたんだ・・・
だけど、三角形の面積を求めるプログラムを作るところでエラーが出てデバッグできないんだ。
とりあえず、エラー

792 :デフォルトの名無しさん:2009/03/13(金) 12:32:58
------ ビルド開始: プロジェクト: null, 構成: Debug Win32 ------
コンパイルしています...
null.cpp
c:\program files\microsoft visual studio 9.0\vc\include\math.h(29) : error C2059: 構文エラー : 'extern '
c:\program files\microsoft visual studio 9.0\vc\include\math.h(29) : error C2143: 構文エラー : ';' が '{' の前にありません。
c:\program files\microsoft visual studio 9.0\vc\include\math.h(29) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
c:\program files\microsoft visual studio 9.0\vc\include\math.h(488) : error C3861: 'fabs': 識別子が見つかりませんでした
同じようなC3861エラーいっぱいだから省略
c:\documents and settings\dareka\my documents\visual studio 2008\projects\null\null\null.cpp(206) : error C2668: 'sin' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
c:\program files\microsoft visual studio 9.0\vc\include\math.h(577): 'long double sin(long double)' の可能性があります。
c:\program files\microsoft visual studio 9.0\vc\include\math.h(529): または 'float sin(float)'
引数リスト '(double)' を一致させようとしているとき
c:\documents and settings\dareka\my documents\visual studio 2008\projects\null\null\null.cpp(209) : error C2065: 'cout' : 定義されていない識別子です。
c:\documents and settings\dareka\my documents\visual studio 2008\projects\null\null\null.cpp(214) : error C2065: 'endl' : 定義されていない識別子です。
場所が違うだけの同じエラーいっぱいだから省略
null - エラー 58、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

そういえば上に書いたHP見ながら作ったHelloworldもusing namespaceがなくて困ったな・・・
もしかして情報ふるいのか?

793 :デフォルトの名無しさん:2009/03/13(金) 12:45:53
>>792
VC2008だよね?
C++以外の言語がどのくらいの経験者か分からないけど、コンパイルエラーは最初のものを見るのが基本。
構文エラー : 'extern '
これが最初だから最も怪しい。
どうせ
'extern 〜で;が抜けてるとか?


794 :デフォルトの名無しさん:2009/03/13(金) 12:55:46
標準ヘッダでエラーがでるのが変だな
#inclue <math.h>
の前の行に何か変な文字が入ってるとかないか?
あるいは直前のヘッダにエラーがある(最後のセミコロンが抜けてる)とか

795 :デフォルトの名無しさん:2009/03/13(金) 13:21:26
>>791
よくわからんが、ファイル名変えてみたら?

796 :デフォルトの名無しさん:2009/03/13(金) 13:23:27
ソースコードをそのまま写してるのか自分で理解しながら書き直してるのかどっち?

797 :791 + 792:2009/03/13(金) 13:28:02
みんな教えてくれるのに肝心なことを書かずにすまない。
VC++2008をつかってて、ソースはいちおう写し書き
#include "stdafx.h"
#include <iostream>
using namespace
#include <math.h>

void main()
{
double deg,a, b;
// a, bは三角形の2辺の長さ(m)。degはその間の角度(度)
a = 1.6, b = 1.6, deg = 90;

double rad;
rad = deg * 3.1415927 / 180;
// sin()の引数の単位はラジアンなので180度で割ってπを掛ける

double s;
s = a * b * sin(deg * 3.1415927 / 180;) / 2;
// ここで面積を計算している。

cout << "2辺の長さが";
cout << a << "(m)と";
cout << b << "(m)で、" << endl;
cout << "その間の角度が" << deg
<< "(度)の三角形の面積は";
cout << s << "(平方m)" << endl;
}
VC++入れなおせば直ったりするのかな・・・

798 :デフォルトの名無しさん:2009/03/13(金) 13:30:46
VC2005で試したけど確かにmath.hでエラーはいてるw

799 :デフォルトの名無しさん:2009/03/13(金) 13:31:18
3行目

800 :デフォルトの名無しさん:2009/03/13(金) 13:32:48
using namespace std;
にして
s = a * b * sin(deg * 3.1415927 / 180;) / 2
この行180の後にセミコロンになってる

名前空間指定してるんだけどどの名前空間使うか指定してないっていう;

801 :791 + 792:2009/03/13(金) 13:58:42
おぉ、すんなりと出来てしまった。
エラーログだけじゃなくて、ソースも出さないと駄目なんだな・・・
みんなありがとう、嬉しくてニヤニヤしたよ。
これからバイトだけど、帰ってきたらusing namespaceについて調べてみる。

ちなみに、引数と関数ってどういう意味なんだろうか。
>引数(ひきすう)とは関数に与える値のことです。当然ですが引数の数は関数によって違います。関数は実行されると値を返します。この値を戻り値といい、関数が示す値になります。例えば
>
> double y;
> y = log(1.0);
>
>と書いた場合、1.0が引数で、yに戻り値(多分0だろう。)が代入されます。

791のアドレスに上の説明がされてるけどさっぱり・・・
引数と関数はどういう奴なのか詳しく解説してるところはない?

802 :デフォルトの名無しさん:2009/03/13(金) 14:10:47
>>801
つーか、初心者スレを覗いてみたらどうだ? もっとましな入門サイトを教えてくれるかもしれないぞ。

803 :デフォルトの名無しさん:2009/03/13(金) 14:12:21
>>801
中学の数学の教科書に書いてある。

804 :793:2009/03/13(金) 14:20:39
>>801
>ちなみに、引数と関数ってどういう意味なんだろうか。
>#include <math.h>
この質問から察するに、C++以外の言語の経験もあまり無いのか?
サイトを見るより書籍を買う方がオススメだよ。
安い書籍でも中古でもいいから入門書を買って来て通読した方が良いかと。

805 :793:2009/03/13(金) 14:22:58
>>801
>引数と関数はどういう奴なのか詳しく解説してるところはない?
引数には仮引数と実引数がある。
引数 - Wikipedia
http://ja.wikipedia.org/wiki/%E5%BC%95%E6%95%B0
ここで良いんじゃん。分かりやすい。
関数は…まあC言語の入門書買っておいで。


806 :793:2009/03/13(金) 14:30:08
>>803
数学の関数とプログラミングの関数は、似ている様で全く意味が違うだろ。

数学では変数の値は絶対に変わることはない。
x=1な世界でしばらくしてx=2になっていることはない。
同様に関数は写像であり、それ以上でもそれ以下でもない。

807 :デフォルトの名無しさん:2009/03/13(金) 14:39:08
環境っていう隠された引数があると考えれば関数と見なせないこともない

808 :デフォルトの名無しさん:2009/03/13(金) 15:12:24
値が変わらないものは変数といいません。定数といいます。

809 :デフォルトの名無しさん:2009/03/13(金) 15:17:42
いいえ束縛です

810 :デフォルトの名無しさん:2009/03/13(金) 16:17:13
違うものだとしても数学の関数を知っていればCの関数も想像し易いだろ。

全く別のものに同じ名前はつけないからね。
同じ名前である以上なんらかの共通点がある。

811 :デフォルトの名無しさん:2009/03/13(金) 16:17:13
あの頃のアタイとは違うんだよ!

812 :デフォルトの名無しさん:2009/03/13(金) 16:23:01
>>806
つ定積分

813 :デフォルトの名無しさん:2009/03/13(金) 17:20:03
>>812
定積分でもxの値は変わってないよ。
高校数学でx=aからbまで変わっている「かのように」思えるのは、仕方なしにそう説明しているだけで。
(歴史的経緯もあるし、変わっているように考えた方が分かりやすいんだろうがね。)
リーマン積分でもルベーグ積分でもそれ以外の気持ち悪い積分でも変わっているわけではない。


814 :デフォルトの名無しさん:2009/03/13(金) 17:48:02
じゃ「変数種類 x を動かす」以外の実装方法ってあるの?

815 :デフォルトの名無しさん:2009/03/13(金) 17:51:15
また明後日の方向に逸れる…

816 :813:2009/03/13(金) 18:04:05
>>814
数学に実装なんて用語はない(定義や公理のことかい?)。
変数種類 x なんて用語は数学にもプログラミングにもない。
…まあいいよ、知りたきゃルベーグ積分でググれ。それか数学スレいって質問すればよか。
俺は単に引数と関数が中学の数学の教科書に書いてあるって言った>>803に反対したまでで、これ以上汚す気になれない。


817 :791 + 792:2009/03/13(金) 21:13:12
>>802
初心者スレって★初心者にVisual C++を教えるスレ★ Part33で合ってるかな?
そこを覗いたら猫でも分かるプログラミングってサイトが紹介されてた。
ちょっくら漁ってみるよ。ありがとう。
>>806
親切にどうもありがとう。
Wikipediaの奴は、引数を見る前に関数を見たら少し分かった気がするよ。

『引数 意味』で調べたときに仮引数と実引数が出てきて困ったけど
ちょっと理解できたから良かった。

書籍はもう少ししてから買ってみるよ。
黒い画面とにらめっこしなくなるくらいまでは、その辺のサイトで覚えたいと思ってる。

とりあえず、みんなありがとう。

818 :デフォルトの名無しさん:2009/03/13(金) 22:46:58
>>816
変数の値が変わらないなんてマヌケなこと言ってるのは、関数型言語を最近触りだけ覚えたど素人だろ?

数学的にもプログラミング的にも頭悪すぎる。
知ったかぶる前にちゃんと勉強しろ。

819 :デフォルトの名無しさん:2009/03/13(金) 22:53:28
しょせん数学にしろ算数にしろ正しいであろうって実装して枠組み決めていっただけだから実装ってあるんじゃね?
1+1は1+1であるっていう定義とともに+は足し算である。って実装があるって考え方も・・・定義ともいえるが

820 :デフォルトの名無しさん:2009/03/13(金) 23:01:12
変数は、決まらないから、変数っていうんですよ

821 :デフォルトの名無しさん:2009/03/13(金) 23:40:22
数学にはメモリがないから「変わる」という表現はおかしいな
数学の(自由)変数というのは定義域内のどの値でもよいという存在
特定の値を持っていてそれが動くというより、ある範囲そのものというイメージの方が合ってる

822 :デフォルトの名無しさん:2009/03/13(金) 23:44:03
範囲は集合、変数は元。
変数が範囲そのものというイメージは捨てた方がいい。明らかに間違い。

823 :デフォルトの名無しさん:2009/03/13(金) 23:48:14
イメージの話だってば
変数は元だけど、変数である限りはどの元でもいいんだから、
変数を使って何かを表現したときはその定義域全体に対しての表現になるわけだろ
その意味では範囲と思って間違いじゃないと思うんだけど

824 :813:2009/03/14(土) 00:08:58
>>818
>>変数の値が変わらないなんてマヌケなこと言ってるのは、関数型言語を最近触りだけ覚えたど素人だろ?
なんか激しい誤解をしている様だが、とりあえず、この話題を頭から一語一句もう一度読んでくれ。
C/C+の変数は確かに内容が変わりうる。俺の書き込みの中でそれに反対した場所は1箇所もないよ。

>>819
>>1+1は1+1であるっていう定義とともに+は足し算である。って実装があるって考え方も・・・定義ともいえるが
「公理系」の事を言いたいのかな?。
例えば、かの選択公理を容認する公理系(ZFC)と認めない公理系とか、有名どころではユークリッドの平行線の公理を認める公理系と認めない公理系とか。
その意味では確かにプログラミングの実装に似ているとも言えるな。

>>820
方程式2x=aでもxが変数でaが定数という言い方をするとおり、x=a/2が同値。決まる。
要は変数xとは「着目している」数ないし数に類する集合の元ってことだな。


825 :デフォルトの名無しさん:2009/03/14(土) 00:15:45
いい加減スレ違いうざいよ

826 :デフォルトの名無しさん:2009/03/14(土) 00:53:59
>>824
帰れ。ど素人。

>>806がお前の書き込みかどうかは知らんが、>>806

「数学では変数の値は絶対に変わることはない。」

と言ってる大バカ者。この下らん議論はそこから始まってる。

少なくとも>>806はバカ。以上。

827 :デフォルトの名無しさん:2009/03/14(土) 01:14:32
>>826
だからスレ違いは子ねってつってんだろ!
顔を真っ赤にしてそんなに書きこんでんじゃねぇよ

828 :デフォルトの名無しさん:2009/03/14(土) 01:45:04
>>790
eof() 見ればいいんじゃないの?

829 :デフォルトの名無しさん:2009/03/14(土) 01:47:56
ファイルの末尾の話なの?行末の話だと思ってた。

830 :デフォルトの名無しさん:2009/03/14(土) 01:50:44
はあああ?

831 :デフォルトの名無しさん:2009/03/14(土) 03:12:41
函数?

832 :デフォルトの名無しさん:2009/03/14(土) 10:26:56
C++を全世界で禁止するために有効な方法を
教えてください。

833 :デフォルトの名無しさん:2009/03/14(土) 10:31:54
コンピューターを破壊せよ

834 :デフォルトの名無しさん:2009/03/14(土) 10:47:34
C++の本を大量に購入してから、25人殺して、捕まって、
取り調べで「俺はデストラクタになりたかった」って言えばいいよ。

835 :デフォルトの名無しさん:2009/03/14(土) 11:37:19
あと、テンプレート殺人とかですね

836 :デフォルトの名無しさん:2009/03/14(土) 15:23:04
危険思想を多重継承していくと良い。


837 :デフォルトの名無しさん:2009/03/14(土) 15:26:45
梁にロープひっかけてダングリングポインタ。

838 :デフォルトの名無しさん:2009/03/14(土) 15:33:04
>>834-837
クソフイタw

つい…かっとなって…gotoしてしまった。
…気がついたら… 怖くなって逃げました。

839 :デフォルトの名無しさん:2009/03/14(土) 16:00:40
馬名二文字で延々代を重ねていくと結構シュール

840 :デフォルトの名無しさん:2009/03/15(日) 10:07:40
C++でstd::cinのdelimiterを追加・変更したいんですが、どうすればいいですか?
Javaでいうjava.util.Scanner.useDelimiter(**)みたいな使い方ってできない?

841 :デフォルトの名無しさん:2009/03/15(日) 19:10:20
thisって付けられる箇所はすべてにthisをつけるべきなんでしょうか。面倒区サインですが

842 :デフォルトの名無しさん:2009/03/15(日) 19:13:55
つけなくていい

843 :デフォルトの名無しさん:2009/03/15(日) 19:20:04
thisはりよう禁止

844 :デフォルトの名無しさん:2009/03/15(日) 19:23:11
いや、this は必要だろw

845 :デフォルトの名無しさん:2009/03/15(日) 19:27:55
引数名とクラスメンバ名が被ったときだけthisをつけるでOK?

846 :デフォルトの名無しさん:2009/03/15(日) 19:30:25
そもそも被らせないようにすべき

847 :デフォルトの名無しさん:2009/03/15(日) 19:34:10
c++だと初期化リストを使いたいときに、
Foo() : _bar(bar) {}
こうしてしまう。

848 :デフォルトの名無しさん:2009/03/15(日) 19:50:02
アンダースコアを識別子の先頭に書くのは(ry
メンバ変数はグローバルスコープではないけど、
あるバージョンの処理系から急にキーワードとして使われた場合に問題になる

849 :デフォルトの名無しさん:2009/03/15(日) 19:55:56
>>848
先頭アンダースコアのメンバ変数ならその心配は無いよ。
まぎらわしいから使うべきじゃないのは確かなんだけどね。

850 :デフォルトの名無しさん:2009/03/15(日) 19:56:26
別にbar(bar)でも問題ない…ないと思う。間違ってたらスマネ

俺は
public constなデータメンバは先頭大文字、
privateなデータメンバは末尾にアンダースコア、
引数とかは先頭小文字で末尾アンダースコアなし
って決めてるからかぶることはないけどね

851 :デフォルトの名無しさん:2009/03/15(日) 19:57:26
>>849
だから _bar というキーワードが追加された時に
コンパイルが通らなくなると言っとるに

852 :デフォルトの名無しさん:2009/03/15(日) 19:58:51
>>850
問題ないよ

853 :デフォルトの名無しさん:2009/03/15(日) 20:05:50
>>850
> 別にbar(bar)でも問題ない

試してみた、うわあああ!!!!
俺はこの数年間なにをしていたんだ!!!

ずーっともやもやしながらアンダースコアつけてたw

854 :デフォルトの名無しさん:2009/03/15(日) 20:07:44
>>851
_bar は処理系独自のキーワードには使えないよ。 __bar ならアリだけど。

855 :デフォルトの名無しさん:2009/03/15(日) 20:17:17
例えば、Visual C++の場合、__stdcallとか__asmのような下線付きの独自のキーワードは、
拡張ありだと_hoge/__hoge(下線1つと2つ)の両方を認識するが、
拡張なしだと下線2つの__hogeのしか認識しないようにきちんとなっている。

856 :デフォルトの名無しさん:2009/03/15(日) 20:18:05
bar(bar)ダメ
HP-Unixじゃ受け付けないから禁止

857 :デフォルトの名無しさん:2009/03/15(日) 20:38:40
使っていい識別子のルールはややこしいから
  - 頭にアンダースコアは一律禁止
  - 2個連続したアンダースコアは一律禁止
としてしまうのが安直で簡単だとおもう


858 :デフォルトの名無しさん:2009/03/15(日) 20:55:47
>>856
んなかたわの環境なんかどうでもいいよ。あれもこれも中途半端な実装なんだから。

859 :デフォルトの名無しさん:2009/03/15(日) 21:04:08
bar_とかやってたら別にm_barでも悪くないって気がしてくる
接頭辞ってオムニ補完使うときに便利なんだよね

860 :デフォルトの名無しさん:2009/03/15(日) 22:59:18
m_
g_
何も悪くない。

861 :デフォルトの名無しさん:2009/03/15(日) 23:01:19
int_p_
MyClass_pp_

862 :デフォルトの名無しさん:2009/03/15(日) 23:02:50
>>855
拡張ありでダメならダメだってことだろう・・・

863 :デフォルトの名無しさん:2009/03/15(日) 23:05:45
>>853
メンバ変数に印付いてないと
どれがメンバ変数なのか分かり辛いし
ローカル変数名とうっかり被ったりすることもあるので
結局メンバ変数には何らかの印を付けた方がいい。
メンバ変数に何の印も無いソース読んだ事あるけど、かなり悲惨だった。
一人で管理するなら何が何なのか把握してるんだろうけどさぁ・・・。
bar(bar) を利用するのは簡単な構造体のみにしてくれ。

864 :デフォルトの名無しさん:2009/03/15(日) 23:23:04
>>862
規格を逸脱したコンパイラベンダの独自拡張なんか気にしてたら何も安心して書けないぜ。

極端な話、 MS が将来の言語拡張で a を独自のキーワードにしない保証はあるのかい?

865 :デフォルトの名無しさん:2009/03/15(日) 23:49:49
>>864
するはずないだろ。具体例が極端すぎる

866 :デフォルトの名無しさん:2009/03/15(日) 23:52:28
>>865
_bar なら心配だけど bar なら安心だと思うんでしょ?根拠もなしに。

867 :デフォルトの名無しさん:2009/03/15(日) 23:52:36
_T はあったな

868 :デフォルトの名無しさん:2009/03/15(日) 23:53:14
>>865
保証はあるのかという問いへの答えになってないぞ

869 :デフォルトの名無しさん:2009/03/15(日) 23:55:34
>>867
アンダースコアに続いて英大文字なら規格の許す範囲内。

870 :デフォルトの名無しさん:2009/03/16(月) 00:05:18
コンパイラ拡張もnamespaceで括るの必須にして
古いソースは use namespace で逃げるようにしようや

871 :デフォルトの名無しさん:2009/03/16(月) 00:21:54
new VeryLargeClass[BIGNUM]
という式は、ヒープに確保しきれなかった場合など、問題が生じればstd::bad_alloc例外が投げられるんだよね?
mallocならNULLが返される。
…では、そうではなくて
VeryLargeClass vlc[BIGNUM];
の様に宣言した結果、コールスタックに確保しきれなかった場合などは何が起こるの?


872 :デフォルトの名無しさん:2009/03/16(月) 00:22:03
どのコンパイラでもみんな#pragma microsft::visual_cpp::onceですね
わざと混合させてみた。

873 :デフォルトの名無しさん:2009/03/16(月) 00:25:13
>>871
まあ現実的には、シグナルが飛んだり (Unix系) とか独自の例外が投げられたり (Win)とか。
基本的に、そうなることはC++例外が投げられるより想定外の事態だね。

874 :871:2009/03/16(月) 00:31:18
>>873
ほほう、すなわちそんな事は滅多に起こらないと考えて良いの?
…それとも起こらないように過度にでかい領域はnewでヒープに確保するように気を配るべき?


875 :デフォルトの名無しさん:2009/03/16(月) 00:38:21
スタックにしろヒープにしろ、領域溢れるようなサイズを取らないよう
プログラム時に考慮するのは当然

876 :デフォルトの名無しさん:2009/03/16(月) 00:39:17
すいません。以下のコードはなぜ正しく動きませんか。
#include <stdio.h>

class Test
{
private:
int value;
public:
Test(void);
void getValue(int*);
};

Test::Test(void)
{
value = 10;
}

void Test::getValue(int* value)
{
value = &(this->value);
}

int main(void)
{
Test test;
int* value;
test.getValue(value);
printf("%d\n", *value);
}


877 :デフォルトの名無しさん:2009/03/16(月) 00:47:05
>>867はローカルスコープで
「_+小文字」は使用が許されているが 「_+大文字」は不可なことを示す良い例だね
ためになる

「_+小文字」でメンバ変数名を定義するぞ!

878 :デフォルトの名無しさん:2009/03/16(月) 00:50:56
>>877
やめといたほうがいいぞ。

それやってると >848,851 みたいな人と無用な議論をする破目になる。

879 :デフォルトの名無しさん:2009/03/16(月) 00:52:17
>>876
説明するのも面倒だから、こうすりゃ動くってのだけ書いておく。
void Test::getValue(int* value)
{
*value = this->value;
}

int main(void)
{
Test test;
int value;
test.getValue(&value);
printf("%d\n", value);
}

880 :デフォルトの名無しさん:2009/03/16(月) 01:00:20
>>878
C++は、一人で完結する実験や趣味プログラムでしか使わないからOK

881 :デフォルトの名無しさん:2009/03/16(月) 01:24:56
>>879
なんで>>876のプログラムじゃダメなんすか。Cの考え方では問題ないですよね。C++特有の問題なんでしょうか。

882 :デフォルトの名無しさん:2009/03/16(月) 01:27:06
Cでもだめだ。同じこと。

883 :デフォルトの名無しさん:2009/03/16(月) 01:47:10
void Test::getValue(int** value)
{
*value = &(this->value);
}

int main(void)
{
Test test;
int* value;
test.getValue(&value);
printf("%d\n", *value);
}

884 :デフォルトの名無しさん:2009/03/16(月) 01:57:44
ああ、コピーした情報を書き換えてるだけだからダメなのか。ポインタって難しい。。

885 :デフォルトの名無しさん:2009/03/16(月) 02:08:35
仮想関数の使用方法について質問です。

class Base
{
public:
  virtual void foo()=0;
}
class Derived1 : public Base
{
  int x;
public:
  void foo();
}
class Derived2 : public Base
{
  int x;
  int y;
public:
  void bar():
}
//関数の実装やらは省略します
int main()
{
  Base *pBase = new Derived2;
  pBase->bar();//としたい
}

Baseにbarの純粋仮想関数を追加しても当然ながらDerived1に影響がでます。
この場合どうすればよいのでしょうか?そもそも純粋仮想関数を使うべきではないのでしょうか?
ご教示下さい。

886 :885:2009/03/16(月) 02:13:11
すみません、Derived2のメンバ関数に
void foo();
が抜けてました。

887 :デフォルトの名無しさん:2009/03/16(月) 02:22:49
「Derived1に影響がでます」ってことは、Derived1はbarなんて操作は知らない/要らないってことかな。
そうだとしたら、BaseとDerived2の間に純粋仮想関数barを持つ抽象クラスを挟むとか、継承関係を見直した方がいいんじゃない。

888 :885:2009/03/16(月) 02:32:16
「間に挟む」ですか!そういう手があるのですね。
大変参考になりました。ありがとうございました。

889 :デフォルトの名無しさん:2009/03/16(月) 02:33:38
継承関係をいじりたくないなら、何もしないbarをBaseに書くしか無いかな。

890 :デフォルトの名無しさん:2009/03/16(月) 02:36:03
でゅあるひえらるきー

891 :デフォルトの名無しさん:2009/03/16(月) 02:40:43
Base* 使うなら889の仮想関数が正解だと思うが

892 :デフォルトの名無しさん:2009/03/16(月) 02:45:14
Base::barでassertか例外投げとくといいかもね。

893 :885:2009/03/16(月) 02:50:05
VC使ってるんですが、pBase-> と打った時点で(´・ω・`)なりました。
そうですね、>>889さんの方法でやってみたいと思います。

894 :デフォルトの名無しさん:2009/03/16(月) 04:57:44
初心者ですがこのプログラムは動くのでしょうか?
あるHPに掲載されていたものなのですが動かないので疑問に思いました

【多分間違い】

#include <stdio.h>

int main(void)
{
printf("Hello, world");
return 0;
}

【たぶん正解】
#include <stdio.h>
int main (void)
{
printf("Hello World\n");
return 0;
}


895 :デフォルトの名無しさん:2009/03/16(月) 05:00:51
全角空白を使っている分、後者をエラーにするコンパイラのほうが多いはず。

896 :デフォルトの名無しさん:2009/03/16(月) 05:42:27
>>894
"\n"の有無の問題ではない事は確か。
エラーの内容を書いてみたら良いと思うよ。

897 :デフォルトの名無しさん:2009/03/16(月) 05:46:51
>>885 のpBase->bar()部に至るまでにBase*がDerived2である事の判断をしてるだろうから
分岐直後にポインタキャストすればいいんじゃないかな

898 :デフォルトの名無しさん:2009/03/16(月) 12:01:15
>>881
折角C++なんだからポインタ使わず参照にしろよ。

# って書くとポインタ原理主義者が怒りそうな気はするw

899 :デフォルトの名無しさん:2009/03/16(月) 13:47:48
>>881
>なんで>>876のプログラムじゃダメなんすか。Cの考え方では問題ないですよね。C++特有の問題なんでしょうか。
C言語で書かれているようにしか見えないが、まあともかくどっちでもダメだよ。
試してみれば分かる。そもそもコンパイラでコンパイル時に変数が未使用だとのwarningが出るのでは?
もう解決しているみたいだけど一応言っておくと、
void Test::getValue(int* value)
{
value = &(this->value);
}
これは「int型へのポインタ」型の変数valueがコピー渡しされている。
コピー渡しである以上、ローカル(=getValue内でスコープ限定)なポインタvalueの値がどれだけ変わろうと、
呼び出し元(main関数)から見れば何も起こっていないも同然。


…まあミスを誘発した原因の1つとして、仮引数と実引数で同じ名前を使っていることじゃない?

900 :871:2009/03/16(月) 13:48:17
>>875
遅レスすまん。ありがとう。

901 :デフォルトの名無しさん:2009/03/16(月) 15:05:26
explicitを使わないことで起りうる問題って具体的にどんなことがありますか?


902 :デフォルトの名無しさん:2009/03/16(月) 15:23:17
>>901
勝手に型変換されるのが嫌な場合じゃない?
例えば
int型を受け取るMyClassのコンストラクタMyClass::MyClass(int num)があったとして、
void foo(MyClass hoge);
という関数に間違ってfoo(42)と記述しちゃった場合にも暗黙に
foo(MyClass(42))
とキャストされるからコンパイルエラーにならない。

903 :デフォルトの名無しさん:2009/03/16(月) 15:37:30
>>902
それが出来ることがどうしてダメなのか、もっともらしい理由が知りたいんです。
ただ、そういう書き方も出来るというだけじゃ、全然問題にならないじゃないですか


904 :デフォルトの名無しさん:2009/03/16(月) 15:39:00
問題にならない、じゃなくて、問題に感じられないの間違いでした。正確には


905 :デフォルトの名無しさん:2009/03/16(月) 15:51:53
こういうのに違和感があるとか、
std::vector<std::string> v = 5; //vは5個の要素を持つと指定

まずいことが起こる可能性を少しでも排除するためとか。
void f(std::auto_ptr<int> const& p, int x);
int g();
f(new int, g());
引数並びの評価順序は決まっていないので、
例えばnew int→gの呼出→auto_ptr<int>の構築→fの呼出という順番だったとき、
gの中で例外を投げられるとnewした分が漏れてしまう。
これを少しでも防ぐためにも、explicitが使われている。スマートポインタは変数で構築しろと。
まあ、それでもf(std::auto_ptr<int>(new int), g());と書けばコンパイラは通してしまうのだけど。

906 :902:2009/03/16(月) 16:03:16
>>905
>それが出来ることがどうしてダメなのか
>問題に感じられない
別にダメじゃないよ。むしろそっちの方が分かりやすいこともある。std::string(const char *)とかはexplicitじゃないしね。
ただ前後関係というか文脈上(見た目上)コンストラクタで勝手にキャストされるととても気持ち悪い事がありえるので、
その気持ち悪い状況の時にexplicitをつける。
具体的には…
…と思ったが>>905が書いてくれているらしいな。

907 :デフォルトの名無しさん:2009/03/16(月) 19:58:38
前にDirect3Dのスレで出ていたが、こんな例もある。

float4つのベクトルを表すD3DXVECTOR4という型があるんだが、
これはfloat*を返すoperator float*()という関数と、
float*を引数に取るexplicitでないコンストラクタがある。 機能は推して知るべし。

んで、この型では、次のような式がエラーにならない。

D3DXVECTOR4 v;
v = v + 1; // ベクトルにスカラーを足しているのにエラーにならない!

何でこんなことになったかというと、まずD3DXVECTOR4には、当然intとのoperator+()は定義されていないから、
コンパイラは暗黙の型変換を探す。 そこで見つかるのがoperator float*()。
ポインタと整数の加算は合法だから、右辺はfloat*型のポインタになる。

んで、次に代入の部分が評価される。
D3DXVECTOR4にはfloat*を引数に取るoperator=()はないから、やっぱり別の暗黙変換を探しに行くんだけど、
ここでたまたまfloat*を引数に取るexplicitでないコンストラクタがあるもんだから、
右辺がD3DXVECTOR4に変換されてしまう。

結果的に上記の式は、メモリのアクセスエラーを発生させてしまうことになる(しかも検知しにくいたちの悪いエラー)。
要するに、explicitなしのコンストラクタと暗黙の型変換を行うoperatorは、併用すると思わぬところで危険な動作を引き起こすってことだ。

908 :デフォルトの名無しさん:2009/03/16(月) 21:52:30
>>907
うわー。ネタかと思って試してみたら、ホントだった。
警告レベルを最高(W4)にしても、VC++2008で警告出さずにコンパイルできちゃう。
DirectXの設計ミスじゃないのか。これ。

せめて、DXD3DXVECTOR4(const float *begin, const float *end)くらいに
できなかったのかなあ。標準ライブラリとも整合性ないし。

909 :デフォルトの名無しさん:2009/03/16(月) 23:34:49
おまえらときたら…


910 :デフォルトの名無しさん:2009/03/16(月) 23:58:59
気がついたらもう900代か。消化はやいな。

911 :デフォルトの名無しさん:2009/03/17(火) 00:54:27
テンプレート関数を使うときに、const 参照と普通の参照の両方を使う場合は
どうするのが効率良いでしょうか?

template<typename A0, typename A1, typename A2> void f( A0& a0, A1& a1, A2& a2);
template<typename A0, typename A1, typename A2> void f(const A0& a0, A1& a1, A2& a2);
template<typename A0, typename A1, typename A2> void f( A0& a0, const A1& a1, A2& a2);
template<typename A0, typename A1, typename A2> void f(const A0& a0, const A1& a1, A2& a2);
……

とかboost::preprocessorでやっていたら組合せ爆発で死にました……
引数の総当たりなんてやるもんじゃないなぁ。


912 :デフォルトの名無しさん:2009/03/17(火) 01:06:55
効率云々以前に、constにできるものはすべてconstにする。

913 :911:2009/03/17(火) 01:39:11
>912
ライブラリ(Visitor)なのでconst & と & の両方構える必要があります。
決め打ちだと簡単だけど、利便性が格段に落ちるからなぁ……

914 :デフォルトの名無しさん:2009/03/17(火) 02:05:35
その手のものはスクリプトで自動で吐き出すのが流行だったんじゃないの?

915 :デフォルトの名無しさん:2009/03/17(火) 02:26:33
template<const A,~const A[1]>f(const A a0~ , const A [1]);
template<A,~A[1]>f(A a0~ , A [1]);
template<A,~>f(A a0,~){typeof(a0) xx[1] x; f(a0,a1,a2,x)}

916 :911:2009/03/17(火) 02:51:31
>914
boostぐらいしか使用しないポータブルなライブラリを作っているので、
まずはboost::preprocessorでチャレンジしました。

>915
それは何でしょう?コンパイル失敗しましたが……

917 :デフォルトの名無しさん:2009/03/17(火) 07:08:16
これって0xなら全部&&にしておけば問題ないパターンだよね?

918 :デフォルトの名無しさん:2009/03/17(火) 07:29:35
0xは流行しないから禁止

919 :デフォルトの名無しさん:2009/03/17(火) 09:19:58
>>917
&&って何?
&&hogeみたいに使う新しい演算子が出るの?

920 :デフォルトの名無しさん:2009/03/17(火) 09:27:45
>>919
rvalue referenceでぐぐれ

921 :911:2009/03/17(火) 20:41:14
>917
いや、ダメですね。委譲する関数次第では左辺値参照で扱う必要があるので、
右辺値参照決め打ちにすることは出来ません。

const&と&を自動で切り替えるテンプレートがあればいいのですが……

922 :デフォルトの名無しさん:2009/03/17(火) 22:05:43
>>921
やりたいことはbindとかfunctionのようにほかへ引数を渡すような感じだよね?
それなら、perfect fowarding問題として知られていて、
右辺値参照で解決を期待されている事柄の1つ。
詳しくはstd::forwardでググるといいと思う。

923 :911:2009/03/17(火) 22:52:05
>922 そうです。perfect fowarding問題かぁ。
とりあえず8変数までは何とか回っているので、しばらくはこれで凌ぐことにします。

それ以上の変数が必要になったらテンプレートクラス使って明示指定することにしよう……


924 :デフォルトの名無しさん:2009/03/18(水) 00:05:02
どうでもいいが
×テンプレート関数
○関数テンプレート
×テンプレートクラス
○クラステンプレート

925 :デフォルトの名無しさん:2009/03/18(水) 00:10:55
>>924
関数テンプレートを具体的に指定して出来た関数がテンプレート関数で、
クラステンプレートを具体的に指定して出来たクラスがテンプレートクラスだっけ?


926 :911:2009/03/18(水) 00:59:42
>924
あれ?そうだったっけ……ということで標準を見てみたけど、確かにtemplate function / classという
用例はほとんど無いね。 non-template〜〜ばっかだった。

927 :デフォルトの名無しさん:2009/03/18(水) 01:03:15
>テンプレートを具体的に指定して出来た
単に関数、クラスでいいと思う。
型を与えたテンプレートは、型を明記した同様の関数/クラスと同じ振る舞いをするから、区別する必要は無い。

テンプレートを具体化(instantiate)した事を強調したければ、具体化関数/具体化クラスと呼べるのかな。あんまりしっくりこないけど。

928 :911:2009/03/18(水) 01:03:30
>925
ちなみに標準だと
Template instantiation
instantiated function
instantiated class
ね。

929 :デフォルトの名無しさん:2009/03/18(水) 01:05:23
テンプラの良書ってありますか?


930 :927:2009/03/18(水) 01:05:52
おっと、標準がそうなら日本語でも具体化関数/具体化クラスとした方がいいかな。

931 :デフォルトの名無しさん:2009/03/18(水) 01:16:26
今まで散々インスタンスのことを「実体」と呼んできてるんだから
instantiatedは「具体化」ではなく「実体化」が素直だろ。

932 :デフォルトの名無しさん:2009/03/18(水) 01:21:04
そのインスタンスはクラス(型)に対する実体を意味しているのであって、
テンプレートに対してパラメータを与えることとは意味が違わない?

933 :デフォルトの名無しさん:2009/03/18(水) 01:25:03
違わない。同じ。

934 :デフォルトの名無しさん:2009/03/18(水) 17:00:33
void foo(const std::string &str){};
という関数があった時に、
foo("hoge");
と呼び出したらどうなりますか?
コンパイル時に何の警告もでないのですが、
「std::stringのconst char*が受け取れるコンストラクタ」でキャストされているのですか?

935 :934:2009/03/18(水) 17:02:20
追記:
void foo(std::string str){}
の場合はキャストされますよね?
void foo(std::string &str){}
としたら未定義の動作になっちゃったりとかしますか?

936 :デフォルトの名無しさん:2009/03/18(水) 17:13:50
>>935
やってみればわかる

937 :デフォルトの名無しさん:2009/03/18(水) 17:16:11
キャストではない、暗黙の型変換

938 :デフォルトの名無しさん:2009/03/18(水) 17:35:32
>>936
3コードとも試してあります。
bccはvoid foo(std::string &str){}で勝手に一時変数を作りました。
g++はコンパイルエラーになりました。
その他の2コードは特に何も問題無いようです。
>>937
暗黙の型変換ですか。
明示的な型変換はキャストと同義ですか?

939 :デフォルトの名無しさん:2009/03/18(水) 18:07:27
最近のコンパイラ(有名どころのGCCとか)は、相当最適化機能が優秀だから
下手にinlineとか付けないでもうコンパイラの最適化まかせにしちゃっても大差ないと
聞いた。
みんなはどう考える?ぜひ意見を聞きたい。

940 :デフォルトの名無しさん:2009/03/18(水) 18:19:33
下手もへったくれも、inlineは書く必要がない。

941 :デフォルトの名無しさん:2009/03/18(水) 18:26:07
メンバ関数の実装をヘッダに書くか、それともcppに書くかはプログラマが決めなきゃならないのでは?
ヘッダに書いたメンバ関数(クラス定義の外)は、inlineが必要なんだよね?

942 :デフォルトの名無しさん:2009/03/18(水) 18:28:12
この前もどっかで書いたばかりの気がするけど、
自分は、最適化なんて意識せず、
returnだけの1行とかmin/max並に単純なものなど、
ヘッダに書きたければinlineを付けるという基準でやっている。

943 :デフォルトの名無しさん:2009/03/18(水) 18:33:24
1) ヘッダでは一切、メンバ関数の定義をしない
2) ヘッダには一切、余計なincludeをしない

な奴は俺と友達。

944 :デフォルトの名無しさん:2009/03/18(水) 18:39:42
>>941
必要なんて何処に書いてあるんだ?

945 :デフォルトの名無しさん:2009/03/18(水) 18:40:36
C++相談室 part67
http://pc11.2ch.net/test/read.cgi/tech/1231640498/

946 :デフォルトの名無しさん:2009/03/18(水) 18:45:57
>>944
リンケージ的になにもなしじゃまずいだろう

947 :デフォルトの名無しさん:2009/03/18(水) 19:38:36
宣言がクラス内にあるのだから、何の問題もない希ガス。

948 :デフォルトの名無しさん:2009/03/18(水) 20:42:44
>>941
>ヘッダに書いたメンバ関数(クラス定義の外)
そんなことしたら、他のファイルでそのヘッダをインクルードしたら定義が重複してるぜっていうエラーがでないか?

949 :デフォルトの名無しさん:2009/03/18(水) 20:44:49
>>945
なるほど、あのふざけた重複スレをPart67に仕立て上げたのか。

950 :デフォルトの名無しさん:2009/03/18(水) 21:00:03
だからinlineを

951 :デフォルトの名無しさん:2009/03/18(水) 21:08:26
>>950
ああinlineすれば大丈夫になるのか。意味不明なレスしてすまんかった。

952 :デフォルトの名無しさん:2009/03/19(木) 00:56:02
参照を返すメソッドがあって、その戻り値が有効かどうかを判定したいのですが
NULLと比較するとコンパイルエラーになります。
どうすればよいのでしょうか?

953 :デフォルトの名無しさん:2009/03/19(木) 01:00:42
例外を投げる

954 :デフォルトの名無しさん:2009/03/19(木) 01:01:05
>>952
参照は有効な物の参照しかとらないようにコーディングすべき。
無効なポインタと同じで、無効な参照は検出不可能。
ちなみにNULLはポインタだからコンパイルエラーになる。

955 :デフォルトの名無しさん:2009/03/19(木) 01:03:57
ちなみに無効なものの参照ってどうやって返すの?自動変数の参照とか?

956 :デフォルトの名無しさん:2009/03/19(木) 01:17:29
mapコンテナを返す、しかしmapのキーが今まで登録した事ない場合です

957 :954:2009/03/19(木) 01:18:04
>>955
そっちのが難しいよな(笑)
俺としてはnewして得たオブジェクトをdeleteしちゃった後のことを想定している。


958 :デフォルトの名無しさん:2009/03/19(木) 01:22:30
なんか話が全然かみ合ってないなぁ。

959 :デフォルトの名無しさん:2009/03/19(木) 01:25:31
説明が悪かったでしょうか
classでも構造体でも、intでも何でも良いのでキーにしたmapコンテナを作り
そのclassなり構造体の参照を返すコードを、キー指定のmapコンテナを記述です。

960 :954:2009/03/19(木) 01:33:57
>>958
俺のは伝わっているよね?


961 :デフォルトの名無しさん:2009/03/19(木) 01:34:00
その説明でより状況が悪化した。

反復子を返したいのかね

962 :953,958:2009/03/19(木) 01:45:03
>>960
うん。

エスパーするとmapを包含したクラスがあって、map::findの結果を参照で返すメソッドがあるのかな。

そうだとしたら、参照は無効な状態を表すことができないので、無効である(見つからなかった)ことを表現するなら例外を投げるしか無い。
戻り値がポインタならNULLを返すという手はある。

map::findで得られた反復子の有効性を判断したいのであれば、map::end()と比較して、同じなら無効。

963 :デフォルトの名無しさん:2009/03/19(木) 01:54:44
こんな感じです。
struct AB {
int a;
int b;
};
std::map< int, AB > global;

void SetVal( int key, int a, int b )
{
global[ key ].a = a;
global[ key ].b = b;
}

AB& GetVal( int key )
{
return global[ key ];
}

こんなソースの場合です。

964 :デフォルトの名無しさん:2009/03/19(木) 02:03:40
>>963
global[key] と書くと、
 - key に等しいキーを持つエントリがない場合はそのエントリを作成した上で、
 - そのエントリの値への参照を返す
という動作をする。

したがって、そのコードは無効な参照を返さない。


965 :デフォルトの名無しさん:2009/03/19(木) 02:07:35
解説ありがとうございます。

と言うと、つまりエラーチェックは出来ない訳ですね?
未初期化の実体が返ってくると、、

訳あって、その処理コードは使うだけで手を入れる事が不可なんです…
あー、コード直したい

966 :デフォルトの名無しさん:2009/03/19(木) 02:13:35
>>965
それはうざいコードだ。

967 :デフォルトの名無しさん:2009/03/19(木) 02:16:43
ひどいね。
globalが本当にglobalならexternで無理矢理参照してしまうとか(冗談です)

968 :デフォルトの名無しさん:2009/03/19(木) 02:21:18
もう対抗するには、こちらもスマートさを捨てる事にします。

登録関数をラッパーして、キーをベクターコンテナに登録
取得関数をラッパーして、キーを検索、見つかったら本当の取得関数コール

で行きます…
諸兄の皆様方は、何か良い案は有りますでしょうか?
条件は、ヘッダーインクルードだけで使うのみ、です。

969 :デフォルトの名無しさん:2009/03/19(木) 02:22:18
>965
operator[]は値が無い場合はデフォルトコンストラクタで初期化する。
無いことを確認したいのならばmap::findを使うべきですな。


>訳あって、その処理コードは使うだけで手を入れる事が不可なんです…

グローバル変数使っているようなコードに依存するのもなんだけど、自分のところだけは
アダプタ使ってアクセスするようにしたら?

やっつけコード

template<typename AB>
struct Adapter {
static std::map<int, AB> global() { return global; };
void value(int key, int a, int b) {
std::map<int, AB>& m(global());
m[key].a = a;
m[key].b = b;
};
AB& value(int key) {
std::map<int, AB>& m(global());
std::map<int, AB>::iterator i(m.find(key));
if (i == m.end()) throw "Error";
return *i;
};
};

970 :デフォルトの名無しさん:2009/03/19(木) 02:23:36
ごめんなさい、追加の条件で使うだけの人間は、私を含めて複数います。
(だからチェック機能が欲しいのです)

971 :デフォルトの名無しさん:2009/03/19(木) 02:26:38
>>969
ありがとうございます。
ただ、globalとは、例に出すのに私が付けた変数名なだけでして…
ようは、ソースは見れるのですがヘッダーと***.aなのです。


972 :デフォルトの名無しさん:2009/03/19(木) 02:26:54
ああ、globalの実体には触れないのね。
>968 をするなら std::setの方が良いよ。

973 :デフォルトの名無しさん:2009/03/19(木) 02:34:11
>>972
こちらも、ありがとうございます。
重複キーの場合どうするか皆と話して、かつ実際の使用されるキーの個数も視野にいれ
検討対象とさせて頂きます。

974 :デフォルトの名無しさん:2009/03/19(木) 02:42:08
そのライブラリ、ソースは見れても、再コンパイルはさせて貰えないの?

975 :デフォルトの名無しさん:2009/03/19(木) 03:02:29
はい、お仕事の都合上、デバッグの為にソースもらっただけなので…

最初は中できとんと処理されてると思ったのですが、共同が変になる場合があり
ソースもらって見た瞬間に理解したんですが…

作った側曰く、少しでも速度を稼ぐため、エラーチェック無し、正しく使うのが前提との事です。
(実際の取得メソッドはインライン関数です)

976 :デフォルトの名無しさん:2009/03/19(木) 03:08:55
大変そうだけどがんばってね。

しかし、少しでも速度を稼ごうとする奴がこんなコード書くかなぁ。
global[ key ].a = a;
global[ key ].b = b;

977 :デフォルトの名無しさん:2009/03/19(木) 03:16:08
>>975
コードの見た目で処理が減ってるように見えるだけで、速度を稼ぐことにはなって無いよ。
内部的には find() の戻り値をチェックするのと同等の分岐が必要になる。

978 :デフォルトの名無しさん:2009/03/19(木) 07:33:11
>>968
その方法で良さそうというか、常套手段。
あるいは、mapに登録するクラスのデフォルトコンストラクタに無効フラグを設定するか。

その上で、元のクラスを変更するよう訴え続けるべし。


979 :デフォルトの名無しさん:2009/03/19(木) 08:09:01
>>963
ふと思ったんだけどさ、GetVal というメソッドを、CreateValと改名すれば
なんか許せる気分になるな。ほらファクトリーもどきでw

・・・だめだ自分をごまかせねぇ OTZ

>>968
単に元コードが変更できないだけで、ラップしてそのメソッド利用を強制できる環境なら、
GetValの代わりに、getValを作るとか、GlobalMapクラスを作成して、
globalをprivateメンバにして、利用はGlobalMapのメソッドからアクセスするように
すりゃいいんじゃないのか。
キーをベクタに登録するよりはましな感じが。globalに直接アクセスしているライブラリが
でーんとあるとかいうなら、また別な話だが。

980 :デフォルトの名無しさん:2009/03/19(木) 16:14:26
part67 はテンプレ付きで立て直したほうがいいと思うんだが、どうか?

981 :デフォルトの名無しさん:2009/03/19(木) 16:17:37
くだらん事で増やすな
その次にしろ

982 :デフォルトの名無しさん:2009/03/19(木) 20:54:27
今のところからテンプレ追加すりゃ良いよ。

983 :デフォルトの名無しさん:2009/03/19(木) 20:56:37
>979
問題は「既にキーが存在するかどうかが判らないクソ仕様になっている」つうことですな。
ラップするだけじゃ情報が足りないのね。

984 :デフォルトの名無しさん:2009/03/19(木) 22:20:35


985 :デフォルトの名無しさん:2009/03/20(金) 07:31:08


986 :デフォルトの名無しさん:2009/03/20(金) 13:59:02
 

987 :デフォルトの名無しさん:2009/03/20(金) 13:59:33
 

988 :デフォルトの名無しさん:2009/03/20(金) 14:00:03
 

989 :デフォルトの名無しさん:2009/03/20(金) 14:00:33
 

990 :デフォルトの名無しさん:2009/03/20(金) 14:01:03
 

991 :デフォルトの名無しさん:2009/03/20(金) 14:07:45
>>989
>>987

992 :デフォルトの名無しさん:2009/03/20(金) 14:25:35
 

993 :デフォルトの名無しさん:2009/03/20(金) 14:26:02
 

994 :デフォルトの名無しさん:2009/03/20(金) 14:26:39
 

995 :デフォルトの名無しさん:2009/03/20(金) 14:27:01
 

996 :デフォルトの名無しさん:2009/03/20(金) 14:28:17
埋めめめ

997 :デフォルトの名無しさん:2009/03/20(金) 14:28:31
 

998 :デフォルトの名無しさん:2009/03/20(金) 14:29:10
 

999 :デフォルトの名無しさん:2009/03/20(金) 14:29:53
C++相談室 part67
http://pc11.2ch.net/test/read.cgi/tech/1231640498/

1000 :デフォルトの名無しさん:2009/03/20(金) 14:30:43
C++相談室 part67
http://pc11.2ch.net/test/read.cgi/tech/1231640498/

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

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

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)