C++相談室 part90

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part89
http://hibari.2ch.net/test/read.cgi/tech/1304410950/

このスレもよろしくね。
http://hibari.2ch.net/test/read.cgi/tech/1299218426/

ついでに壁紙にしてね。
http://www.research.att.com/~bs/Bjarne.jpg
2デフォルトの名無しさん:2011/07/17(日) 15:51:19.94
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[Stroustrup大聖人]
 http://www2.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?id=15868
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3デフォルトの名無しさん:2011/07/17(日) 15:51:33.55
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
4デフォルトの名無しさん:2011/07/17(日) 15:51:47.76
5デフォルトの名無しさん:2011/07/17(日) 15:52:03.54
6デフォルトの名無しさん:2011/07/17(日) 16:22:16.88
>>1 1さん乙です
7デフォルトの名無しさん:2011/07/17(日) 17:22:45.50
>>1 おつ
8デフォルトの名無しさん:2011/07/17(日) 19:06:37.25
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
9デフォルトの名無しさん:2011/07/17(日) 21:18:59.47
>>8
地鎮祭乙
10デフォルトの名無しさん:2011/07/17(日) 21:21:34.14
>>8
なにこれ
11デフォルトの名無しさん:2011/07/17(日) 21:25:12.60
ここまでテンプレ
12sage:2011/07/17(日) 21:56:10.33
入力バッファの消去の仕方教えてください
fflush(cin);ではできなかったので
13デフォルトの名無しさん:2011/07/17(日) 22:23:44.70
>>12
標準ではないんじゃね?
リダイレクトされてどこに接続されているか分からないし
食っても食っても後から追加されてきて予想外の動作になるかも

だからVCは敢えて非標準の fflush(stdin) を付けたのだと思う
14デフォルトの名無しさん:2011/07/17(日) 22:26:28.18
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

正しいのかどうかは知らん。
15デフォルトの名無しさん:2011/07/17(日) 22:33:35.34
cin.sync() とかのこと?
16デフォルトの名無しさん:2011/07/17(日) 23:03:40.64
>>15
おおこんなメンバ関数があったんだ

ISO/IEC14882/2003を見てもstd::basic_streambufのメンバ関数としてしか
紹介されてないし、「プログラミング言語C++第3版」を見ると 入力に対するsync()は
いつも正しく終了するとは限らない。成功すると 0 を返し、ios_base::badbitをセットして
-1を返す。 とあるので、使い方には気を付けなければならないようだけど、一応
あるみたいだね
17デフォルトの名無しさん:2011/07/18(月) 01:55:18.65
18デフォルトの名無しさん:2011/07/18(月) 03:30:15.01
何の誤爆だよ
19デフォルトの名無しさん:2011/07/18(月) 14:09:39.67
#define STATIC_ASSERT(expr) static_assert(expr, #expr)
STATIC_ASSERT(std::is_same<int, int>::value);

VC++2010ではstd::is_same<int, int>のカンマが、マクロ引数を区切るカンマと解釈されているようで警告C4002が出ます。
C4002の説明によると、多すぎるマクロ引数は無視されるらしく

static_assert(std::is_same<int, "std::is_same<int");

と展開されているようで、意図通りになりません。
言語仕様的にこの動作は正しいのでしょうか?
20デフォルトの名無しさん:2011/07/18(月) 14:13:51.67
正しい。
21デフォルトの名無しさん:2011/07/18(月) 14:17:11.66
ファイルを分割して関数にstringの変数を渡そうとするとエラーを起こすんですけど、どうすればいいですか?
22デフォルトの名無しさん:2011/07/18(月) 14:18:30.17
そのエラーを貼れよ
23デフォルトの名無しさん:2011/07/18(月) 14:19:52.93
>>21
回答が得られるような質問のスキルを習得してから出直す。
24デフォルトの名無しさん:2011/07/18(月) 14:37:19.83
>>22>>23
すいません、プログラムは下のような感じです。
//main.cpp

#include <iostream>
#include <string>
#include "sub.h"
using namespace std;
int main()
{
string a = "aaaa";
bbb(string a);
return 0;
}
//sub.cpp
#include <iostream>
#include <string>
#include "sub.h"
using namespace std;
void bbb(string a)
{
cout << a << endl;
}
//sub.h
void bbb(string a);
これをvisual c++で「デバッグ無しで開始」しようとすると
1>c:\users\あなた\desktop\c++\abbb\bbb.h(2) : error C2065: 'string' : 定義されていない識別子です。
1>c:\users\あなた\desktop\c++\abbb\bbb.h(2) : error C2146: 構文エラー : ')' が、識別子 'a' の前に必要です。
1>c:\users\あなた\desktop\c++\abbb\bbb.h(2) : error C2182: 'bbb' : 'void' 型が不適切に使用されています。
1>c:\users\あなた\desktop\c++\abbb\bbb.h(2) : error C2059: 構文エラー : ')'
というようなエラーが出てしまいます
初歩的な所で躓いてるんだと思うのですけど原因が何なのか分からなくて
25デフォルトの名無しさん:2011/07/18(月) 14:40:32.09
//sub.h
#include <string>
void bbb(std::string a);
26デフォルトの名無しさん:2011/07/18(月) 14:43:10.20
>>25
できました!!
ありがとうございます!!
27デフォルトの名無しさん:2011/07/18(月) 14:48:47.91
マジか!
提示されてないbbb.hのエラー貼るとか、俺には釣りにしか見えなかったよ。
28デフォルトの名無しさん:2011/07/18(月) 22:35:44.30
やさしいC++という入門書的な本を読み終わって、全くc++について知らないというところからは抜け出せたかと思います
入門書の次に読むべき本としては何が宜しいでしょうか?
29デフォルトの名無しさん:2011/07/18(月) 22:42:00.75
禿本
30デフォルトの名無しさん:2011/07/18(月) 22:53:52.28
次はやさしくない入門書を読みなおすこと
31デフォルトの名無しさん:2011/07/18(月) 23:20:35.39
A*探索って、ダイクストラのコストの小さいノードから確定して接続ノードを展開していってるのを、
現在の「コスト+ゴールまでの予想コスト」の小さいもの。に置き換えた版ってことであってる?
32デフォルトの名無しさん:2011/07/18(月) 23:29:15.23
そうですね
33デフォルトの名無しさん:2011/07/18(月) 23:56:42.30
>>27
提示されている・・・と思うよ
コードの下のほう。

//sub.h
void bbb(string a);
34デフォルトの名無しさん:2011/07/19(火) 00:25:13.95
>>33
それはsub.hだろ。
エラーメッセージにははっきりとbbb.hって出てるんだが?
少なくともそのソースをコンパイルしたエラーメッセージを貼ったのではない。

こういう粗忽さがつまらないコンパイルエラーの根本的な原因だから、ちゃんと指摘すべき。
35デフォルトの名無しさん:2011/07/19(火) 00:28:18.19
>>31
そして予想コスト(heuristic functionの値)が外れ(矛盾発生)だった場合の付け替え処理も含まれています。
36デフォルトの名無しさん:2011/07/19(火) 00:54:05.62
ありがとう、外れの場合も考えないといけないのか。
まぁ今回は外れることはないとして作るからいいや
37デフォルトの名無しさん:2011/07/19(火) 11:52:57.95
enum E { a, b, c };でE::aとアクセスできないのはなんでなんだろ
別の名前空間でtypedef E E_t; したらE_t::aとできてすごく使えると思うんだけど
もちろんC言語と互換性ないのはわかるけど・・・
38デフォルトの名無しさん:2011/07/19(火) 11:57:15.91
>>37 わかってるのに「なんでなんだろ」とか言う意味がわからない。
39デフォルトの名無しさん:2011/07/19(火) 12:00:42.75
簡単に作れるからわざわざ言語でサポートしなくてもってことじゃね?

class Hoge
{
public:
enum Enum { a, b, c };
inline Hoge(Enum e) : e_(e) { }
inline operator Enum (void) const { return e_; }
private:
Enum e_;
};

int main(void)
{
Hoge hoge(Hoge::a);
switch(hoge)
{
case Hoge::a: 〜; break;
case Hoge::b: 〜; break;
case Hoge::c: 〜; break;
}
return 0;
}
40デフォルトの名無しさん:2011/07/19(火) 12:00:49.74
じゃあ、そうなったらいいのにと捉えてくれ
41デフォルトの名無しさん:2011/07/19(火) 12:04:46.56
>>39
クラスや構造体で包めばいいというのも分かってはいたんですが
すでにあるもの、何かしらのライブラリの名前空間にある列挙型を
自分の名前空間でtypedefして、>>37のように使えたらいいのにな、ってことでした
42デフォルトの名無しさん:2011/07/19(火) 12:06:44.41
もともと
#define a 0
#define b 1
#define c 2
を置き換えるためのものだからな

「強く型付けされた」列挙体が欲しければ
作りようはいくらでもあるし

Cとの互換性を捨てたらC++の地位は大幅に後退する
43デフォルトの名無しさん:2011/07/19(火) 12:08:34.43
禿がenum嫌いなせいだろ
44デフォルトの名無しさん:2011/07/19(火) 12:09:39.22
Cから持ってきた型だからしょうがない。
45デフォルトの名無しさん:2011/07/19(火) 12:10:22.91
46デフォルトの名無しさん:2011/07/19(火) 12:56:38.18
enum Operation
{
 Operation_Add,
 Operation_Subtract,
 Operation_Multiply,
 Operation_Divide,
 Operation_Assign,
 ...
};

Operatioin op = Operation_Divide;
47デフォルトの名無しさん:2011/07/19(火) 13:06:47.24
あぁ、typedefを使いたいのか
>>46は無視してくれ
48デフォルトの名無しさん:2011/07/19(火) 14:11:25.52
std::string _status[2] = {_T("正常"), _T("毒")};

ヘッダーファイルに書いたらエラーになるんだけどどう書くべきですか?
49デフォルトの名無しさん:2011/07/19(火) 14:13:25.44
std::string _status[];
じゃねーの?
50片山博文MZ:2011/07/19(火) 14:20:51.44
extern std::string _status[];
51デフォルトの名無しさん:2011/07/19(火) 14:22:16.62
const std::string status[]=...;
52デフォルトの名無しさん:2011/07/19(火) 14:23:29.63
>>48
ヘッダーでは定義じゃなくて宣言で済ませて、対応するソースファイルで定義する。

ついでに const 付けて、変数名の先頭アンダースコアは外しとけ。
53デフォルトの名無しさん:2011/07/19(火) 14:24:19.09
const 付けてヘッダで宣言するには明示的な extern が要るから気をつけて。
54デフォルトの名無しさん:2011/07/19(火) 14:30:15.04
>>235
内モンゴルを荒廃させたのは中共だろ、
日本のせいにするなよチャソコロ!
55デフォルトの名無しさん:2011/07/19(火) 14:40:37.95
お、おう・・・
5648:2011/07/19(火) 15:32:18.82
はい。CPPで初期化します。ありがとう
57デフォルトの名無しさん:2011/07/19(火) 21:58:44.72
細かいことですが、教えてください。
Hoge クラスのメンバ変数 n をFoo クラスのコンストラクタの初期化子リストで
初期化したいのですが、このような継承関係がある場合は、どのように書いたらいいのでしょうか?初期化子リストで初期化できない場合は、どのようにしたらいいのですか?
合わせてお願いします。
class Hoge
{
public:
virtual Hoge * clone () const = 0;
protected:
int n;
};

class Foo : public Hoge
{
Foo * clone() const { return new Foo( *this ); }
Foo() : n(0) // 当然これでは初期化できません・・・・orz
{
n;
}
};
58デフォルトの名無しさん:2011/07/19(火) 22:05:04.57
変な日本語です。失礼しました訂正します
×
初期化したいのですが、このような継承関係がある場合は、どのように書いたらいいのでしょうか?初期化子リストで初期化できない場合は、どのようにしたらいいのですか?

初期化したいのですが、このような継承関係がある場合は、どのようにしたらいいのでしょうか?
また、不可能な場合、他の手段でn を初期化する方法はあるのでしょうか。
59デフォルトの名無しさん:2011/07/19(火) 22:38:48.61
それだとFoo() { n = 0; }しかないじゃん?
本来はHogeしか初期化できないんだから、Hogeを触っていいなら
Hoge(int n = 0) : n(n) {}
Foo() : Hoge(0) {}
60デフォルトの名無しさん:2011/07/19(火) 23:01:40.35
>>59
thx です。そうですか、Foo() { n = 0; }オーソドックスな、コンストラクタ内で
初期化する方法ですね
質問ですが
Hoge(int n = 0) : n(n) {}
Foo() : Hoge(0) {}
これですと、Hoge()引数無しの、デフォルトコンストラクタが初期化されるのではなく
Hoge(int n)の如く、引数付きのコンストラクタが初期化されているように
見えるのですが、自分の勘違いでしょうか?
61デフォルトの名無しさん:2011/07/19(火) 23:22:34.51
>>60
>>59のはデフォルト値を設定してあるからHoge(0)は省略すればnは0で初期化されるし
任意の値を設定できるようにもなってる
つまりFoo() {}でもFoo() : Hoge() {}でもFoo() : Hoge(n) {}でもいける

もっとちゃんと書くとこうなるかな
Hoge() : n(0) {}
Hoge(int n) : n(n) {}
Foo() {} // Hoge()が呼ばれてHoge::nは0で初期化
Foo(int n) : Hoge(n) {} // Hoge::nをnで初期化
62sage:2011/07/19(火) 23:23:19.62
class intArray2D{
public:
IntArray2D(int size0,int size1):
mArray(0),
mSize0(size0),
mSize1(size1){mArray=new int[size0*size1];}

上のクラス宣言内のコンストラクタについてなんですが:の意味がわからないので教えて
ください 
63デフォルトの名無しさん:2011/07/19(火) 23:28:40.11
>>62
初期化子リストで調べて
64デフォルトの名無しさん:2011/07/19(火) 23:32:41.74
ごめん、初期化リストだった
65デフォルトの名無しさん:2011/07/20(水) 02:50:05.57
継承不可のクラス作りたいんだけどconst class でできます?

const class Hello
{
};
66デフォルトの名無しさん:2011/07/20(水) 03:40:19.86
const classなんて構文はない
VC++ならclass Hello sealedでいけるが非標準
67デフォルトの名無しさん:2011/07/20(水) 04:02:37.97
オブジェクトをバイナリに変換・復元をしたいのですが、
以下のような形式で親クラス*に戻した場合、正しい実装クラスを指すことが
できますか?

class Abstract {
virtual void hoge() = 0;
};
class ImpA : public Abstract{ void hoge(){} };
class ImpA : public Abstract{ void hoge(){} };
class ImpA : public Abstract{ void hoge(){} };
enum AbstractType { A, B, C };

Abstract* restore(char* binary, AbstractType type)
{
 if(type == A)
 {
  ImpA* pResult = (ImpA*)binary;
  return pResult;
 }
 if(type == B)
 {
  ImpB* pResult = (ImpB*)binary;
  return pResult;
 }
 if(type == C)
 {
  ImpC* pResult = (ImpC*)binary;
  return pResult;
 }
 return 0;
}
6867:2011/07/20(水) 04:03:50.36
訂正:


class ImpA : public Abstract{ void hoge(){} };
class ImpA : public Abstract{ void hoge(){} };
class ImpA : public Abstract{ void hoge(){} };


class ImpA : public Abstract{ void hoge(){} };
class ImpB : public Abstract{ void hoge(){} };
class ImpC : public Abstract{ void hoge(){} };
69デフォルトの名無しさん:2011/07/20(水) 04:11:18.43
binaryの中身次第
7067:2011/07/20(水) 04:26:01.68
例えばこれをソケット通信で送ったとして
char* p = (char*)new ImpA();
AbstractType type = A;

受け取った側が復元したいのです。
Abstract* restore(p, type);
71デフォルトの名無しさん:2011/07/20(水) 04:34:23.29
>>70
そんなことは無理
boost::serializationとか使え
72デフォルトの名無しさん:2011/07/20(水) 12:18:21.93
STLportの質問はここでいい?
ファイル名がstd::wstringで与えられてるんだが、
STLportのstd::ofstreamはwchar_tのファイル名を扱えないっぽい。
どうしてる?
変換するしかない?
73デフォルトの名無しさん:2011/07/20(水) 12:52:55.13
bost::filesystem::pathに食わせてからstring()で取り出してる
74デフォルトの名無しさん:2011/07/20(水) 13:06:04.71
STLPortは知らないんだけど、wofstreamとか無いの?
75デフォルトの名無しさん:2011/07/20(水) 14:44:14.93
もうSTLportの時代じゃないだろ
C++1Xが出てムーブコンストラクタを多用したSTLが出るまで待てないのか?
76デフォルトの名無しさん:2011/07/20(水) 18:12:29.87
>>74
標準のfstreamが取るファイル名は常にchar*(実装依存)だよ。
boost::filesystem::fstreamならpath/wpathが使える。
77sage:2011/07/20(水) 19:17:50.35
STLのmax()の意味教えてください
78デフォルトの名無しさん:2011/07/20(水) 19:19:46.59
if(mox()) { alldead(); }
79デフォルトの名無しさん:2011/07/20(水) 21:39:16.48
>>57です>>61昨晩はどうもありがとうです
よくわかりました。
ところで、ふと疑問が湧きました、よろしくお願いします。
class Hoge
{
public:
virtual Hoge * clone () const = 0;
protected:
int n;
};

class Foo : public Hoge
{
public:
Foo * clone() const { return new Foo( *this ); }
void Delete() { delete this; }
~Foo()
{
Delete();
}
};
純仮想関数のインスタンスをヒープから削除する実装ですが、こんな感じでいいでしょうか?
それとも、参照カウンタを付けないとヤバイですか?
80デフォルトの名無しさん:2011/07/20(水) 21:42:40.35
質問
基底クラスのインスタンスBと派生クラスのインスタンスCで、たとえばBのpublicなメンバ変数を
Cにコピーしたい場合は、Cで=オペレータをオーバーロードしてやる以外に方法はある?
81デフォルトの名無しさん:2011/07/20(水) 21:45:10.50
>>79
デストラクタからdelete this;を呼んでいる方がヤバイ。
参照カウンタを使うかどうかは使い方による。
82デフォルトの名無しさん:2011/07/20(水) 22:00:22.70
>>79
デストラクタでdeleteはありえない(破棄されることが決まってるんだから)
ヒープに作ることを前提にするなら
コンストラクタを非公開にして(スタックに置かせないため)、静的メンバ関数から生成するとかで対応しないと
外部からdeleteさせていいならスマートポインタでいいんじゃないかな

>>80
普通にコピーするための関数をクラスBに用意すれば良いんじゃないかな
クラスBの参照かポインタで受ければインスタンスCも放り込めるでしょ
8380:2011/07/20(水) 22:03:34.20
>>82
ふむ、なるほど
感謝、やってみます
84デフォルトの名無しさん:2011/07/20(水) 22:04:18.86
>>81Thx です
なるほど、デストラクタに難ありですか、難しそうなので、こういう場合スマートポインタとか
boost::shared_ptr とかを使うことは出来るのでしょうか?
85デフォルトの名無しさん:2011/07/20(水) 22:09:24.16
>>79です>>82Thxです
なるほどありがとうです、調べてみます。
86デフォルトの名無しさん:2011/07/20(水) 23:27:01.07
>>84
なんかやりたいことが違ったらスマンが
ttp://ideone.com/5ILos
こういうことがしたいってこと?
87デフォルトの名無しさん:2011/07/21(木) 00:39:37.51
>>86
ありがとうございます。
やりたいことは派生クラスから、基底クラスのコンストラクタの振る舞いを制御するということです。いわゆる仮想コンストラクタという奴です。
いろいろ調べたり、More Effective STL を読み返すと、一筋縄でない事を知り思考錯誤しています。
auto_ptrの使い方が間違っていてエラーが出ます

error C2555: 'Foo::clone': オーバーライドする仮想関数の戻り値の型が異なり、'Hoge::clone' の covariant ではありません。
error C2664: 'Foo::Foo(const Foo &)' : 1 番目の引数を 'const Foo *const ' から 'const Foo &' に変換できません。(新しい機能 ; ヘルプを参照)
#include <memory>
#include <iostream>
using namespace std;
class Hoge
{
public:
virtual Hoge * clone () const = 0;
protected:
int n;
};
class Foo : public Hoge
{
public:
//Foo * clone() const { return new Foo( *this ); } ここでエラーがでますorz
auto_ptr<Foo> clone() const { return new Foo( this ); }
Foo()
{
int n = 0;
cout << "Foo Constructor" << endl;
}
};
8887:2011/07/21(木) 00:40:40.01
正しいつか方を教えてもらえないでしょうか。
89デフォルトの名無しさん:2011/07/21(木) 01:46:58.10
>>87-88
相談に乗って欲しいならエラーメッセージ貼れ。
Hoge に virtual デストラクタが要る。
そこに auto_ptr は要らない。呼び出し側で欲しけりゃ使えばいい。
9089:2011/07/21(木) 01:48:37.31
>>87
あ、エラーメッセージは上に貼ってあったのか。ごめん。
covariant じゃなくなってるのは auto_ptr のせい。
2つめのやつは this と *this の違い。
9187:2011/07/21(木) 02:04:05.19
>>90ありがとう、これで逝けたと思うのですが
#include <memory>
#include <iostream>
using namespace std;
class Hoge
{
public:
virtual Hoge * clone () const = 0;
virtual ~Hoge(){}
};
class Foo : public Hoge
{
public:
Foo * clone() const { return new Foo( *this ); }
Foo()
{
cout << "Foo Constructor" << endl;
}
};
class Foo_ : public Hoge
{
public:
Foo_ * clone() const { return new Foo_( *this ); }
Foo_()
{
cout << "Foo_ Constructor" << endl;
}
};
9287:2011/07/21(木) 02:04:34.22
続きです

int main(int argc, char* argv[])
{
try {
auto_ptr<Foo> PtrFoo(new Foo());
auto_ptr<Foo_> PtrFoo_(new Foo_());
} catch(...){
;
}
return 0;
}
93デフォルトの名無しさん:2011/07/21(木) 08:23:43.31
アクセス修飾子について質問です。

class Hoge
{
private:
int x;
public:
Hoge(int a){ x = a; }
operator+(Hoge hoge);
}
Hoge Hoge::operator+(Hoge hoge)
{
return Hoge(x + hoge.x);
}

演算子オーバーロードのサンプルコードでこのようなものがありました。
xはprivateになっているので、11行目のhoge.xはアクセスできないように思うのですが、
何故これで大丈夫なのでしょうか?
初歩的な質問ですみません。
94デフォルトの名無しさん:2011/07/21(木) 08:26:59.92
private指定の意味を見なおせゴミクズ
95デフォルトの名無しさん:2011/07/21(木) 10:44:02.93
>>93
x も hoge.x もクラスHogeのメンバーだから。
異なるクラスからアクセスできないのであって、異なるインスタンスからアクセスできないわけじゃない。
同じクラスならアクセス可能。
96デフォルトの名無しさん:2011/07/21(木) 11:00:04.46
>>87
そろそろそのでたらめなコードをなんとかしないとな、聞いたことはちゃんと取り入れないと
まずは目的と欲しい機能を文章で分かりやすく表現できないことには前に進まない
まずコードの前に落ち着いて文章でまとめてみてよ

あとエラーC2555は、戻り値だけが違う関数はオーバーロードできないってこと
97デフォルトの名無しさん:2011/07/21(木) 11:16:59.12
とういうかもう>>86が答えなんじゃないのか?
98デフォルトの名無しさん:2011/07/21(木) 12:46:08.15
>>96
> あとエラーC2555は、戻り値だけが違う関数はオーバーロードできないってこと

違うよ。全然違うよ。
99デフォルトの名無しさん:2011/07/21(木) 18:59:53.58
struct X {
 virtual void func();
};

struct Y : X {
 char func(); // C2555
};

1. 名前とパラメータの型が同じ仮想関数が基本クラスで宣言されている
2. その関数をオーバー「ライド」しようとしているが、戻り値の型だけ違う
1番、2番が合わさることでC2555となり最強に見える
100Perl忍者:2011/07/21(木) 20:01:51.00
C++ってRADの開発向いてますか?
そういうIDEと飼ってありますか? 教えてください
.NETみてみたんですが

.NET C++とか検索してもなんか 入門サイトとか全然のってなくてよくわかりません
.NET 入門とか調べると C#がでてくるんですが C#がむいてるんですか?
C#は.NETがむいてるんですか???わかりません教えてください


C++でできるGUIアプリ開発とかやりたいですがなにがむいてますか?
Xcodeみたいにウインドウとかボタンとか自由に配置してやりたいんですが
WIN32みたいに変な全部ウインドーコードかいたり リソースエディタとかめんどくさいのやりたくないです

C++をやる理由なんですが UnrealEngine3っていうやつC++つかうみたいなんで
教えてください

C++でできるXcodeみたいなやつ
C++だと.NETはむずかしい  C#使えっていわれたんですがホンとですか??
C++でできるGUIのIDEとかそういうのあったら教えてくださいまってます
101デフォルトの名無しさん:2011/07/21(木) 20:09:21.14
>>100
マルチ死ね
102Perl忍者:2011/07/21(木) 20:15:16.39
マルチしてません 教えてください
103Perl忍者:2011/07/21(木) 20:15:46.96
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
マルチしてません 教えてください
104デフォルトの名無しさん:2011/07/21(木) 20:17:57.00
105Perl忍者:2011/07/21(木) 20:19:26.77
違いますそれ  違う
本当に違います
どなたか親切なかた教えてく
106Perl忍者:2011/07/21(木) 20:22:08.41
C++と.NETの資料の少なさや手間さはクソですか?

やっぱり.NETはC#のほうがいいんですか?教えてください

本当に教えてくださいまってますみまさん
107デフォルトの名無しさん:2011/07/21(木) 20:28:26.15
次にお前は「釣り乙w」と言う
108 忍法帖【Lv=30,xxxPT】 :2011/07/21(木) 20:43:57.68
>>107
死ね
109デフォルトの名無しさん:2011/07/21(木) 20:47:44.59
>>107
なに忍者さんに口聞いてんだ?
死ね
110デフォルトの名無しさん:2011/07/21(木) 21:56:45.41
>>108-109
ファック
111デフォルトの名無しさん:2011/07/21(木) 22:21:03.10
>>100
何も考えずにC#(VS Express)かJava(Eclipse)を始めろ。
C++のことは一旦忘れるんだ。
112デフォルトの名無しさん:2011/07/21(木) 23:47:45.49
typedef templateが実装されているコンパイラはありますか?
113デフォルトの名無しさん:2011/07/22(金) 16:59:33.38
bool load(const char *pData) {
unsingned long num_ = *( reinterpret_cast<const unsigned long *>(pData) );
pData += sizeof( unsigned long );
//etc
}
この関数で移動したpDataのアドレスを返すにはどうするのがスマートですかね?
引数を2重ポインタ使って返す?
返値で返す?

一般的な解法がわからん
114デフォルトの名無しさん:2011/07/22(金) 17:04:36.56
bool init( const char *fileName ) {
FILE *pFile;
fpos_t fposFileSize;
char *pData;

pFile = fopen( fileName, "rb" );
if( !pFile ) return false; // ファイルが開けない

// ファイルサイズ取得
fseek( pFile, 0, SEEK_END );
fgetpos( pFile, &fposFileSize );

// メモリ確保
pData = (char *)malloc( (size_t)fposFileSize );

// 読み込み
fseek( pFile, 0, SEEK_SET );
fread( pData, 1, (size_t)fposFileSize, pFile );

fclose( pFile );

bool bRet = load( pData );

free( pData );

return bRet;
}

pDataはこんな感じになってます
115デフォルトの名無しさん:2011/07/22(金) 17:11:44.23
>>113
std::pair<bool, char*>で返すとか
三つ以上はboost::tupleかstd::tr1::tuple
116デフォルトの名無しさん:2011/07/22(金) 17:15:08.20
>>114
参照でもポインタでもいいけど、呼び出し元のpData変えたらfree()できなくなるから戻り値しかないじゃん。
117デフォルトの名無しさん:2011/07/22(金) 17:59:19.23
>>115-116
thx。こんな感じにしました。
http://codepad.org/yMQoNwL0
ファイル操作慣れてないので、なんか突っ込みどころあったら突っ込んでください

初めてcodepad使ったんだけど、urlいつまで有効なんだろう?
118デフォルトの名無しさん:2011/07/22(金) 20:11:22.01
char* classAinit( const char *pData) {
char num_ = *( reinterpret_cast<const char *>(pData) );
pData += sizeof( char );
//etc
return (char*)pData;
}

static const char* classAinit( const char *pData) {
char num_ = *pData;
++pData;
//etc
return pData;
}
119デフォルトの名無しさん:2011/07/22(金) 20:13:22.84
公開しない関数はstaticにしておけ。
無闇とキャストするな。
C型のキャストは禁物。
sizeof(char)は意味が無い。

つーか、char *をint *にキャストしてもまともに使えるとは限らんぞ。
120デフォルトの名無しさん:2011/07/22(金) 21:10:57.99
> 公開しない関数はstaticにしておけ。
これはやめろ
121デフォルトの名無しさん:2011/07/22(金) 21:23:04.08
ダメなの?
122デフォルトの名無しさん:2011/07/22(金) 21:39:08.13
無名namespaceでくくった方がいいんじゃね?
123デフォルトの名無しさん:2011/07/22(金) 23:18:42.57
ヘッダに書かなければどっちでも同じだろ
124デフォルトの名無しさん:2011/07/22(金) 23:53:50.87
staticで内部リンケージにするのは非推奨になってなかったっけ?
125デフォルトの名無しさん:2011/07/23(土) 00:23:27.85
C++03ではdeprecated
C++0xでは廃止
126デフォルトの名無しさん:2011/07/23(土) 00:34:10.75
Koenig Lookupを賢く使おう
127デフォルトの名無しさん:2011/07/23(土) 06:32:27.24
なんだ。廃止ってdeprecatedじゃなくなったって意味か。びびった。
128デフォルトの名無しさん:2011/07/23(土) 10:08:29.70
>>125
>>127
まじで!?
129デフォルトの名無しさん:2011/07/23(土) 10:11:47.50
コンパイラが怒ったら本気だす
130デフォルトの名無しさん:2011/07/23(土) 12:46:46.03
131デフォルトの名無しさん:2011/07/23(土) 13:52:59.13
>>130
まあADLがなかったら標準C++ライブラリはあり得なかったからな
132117:2011/07/23(土) 15:36:46.42
いろいろありがとうございます
ぬーCはホント黒魔術だ

>つーか、char *をint *にキャストしてもまともに使えるとは限らんぞ。
void* かpritf %pの方がよかったのか。
いいわけだけど、C++型のキャストは書きにくいからC形式のキャストを使ってしまう。
使いにくくするのも目的の1つなんだろうけど、自分のコードの悪い癖ですね
133デフォルトの名無しさん:2011/07/23(土) 15:44:30.62
intはワード境界に置かないとアクセスできないCPUもある。
アクセスできる場合でも速度上のペナルティ食らう。
134デフォルトの名無しさん:2011/07/23(土) 16:24:42.92
バスエラー
135デフォルトの名無しさん:2011/07/23(土) 16:55:38.24
>>133
thx
そういう理由ですか
ほんとに複雑な言語だな
勝手にコンパイラがやってくれる最適化とか、アライメントでつい最近壮大な時間はまった。
#programa pack(push, 1)
#program pack(pop)
これを知らなかった

仕様を知らないのが、バグの温床にもなる
怖いな
136デフォルトの名無しさん:2011/07/23(土) 16:59:17.81
#pragma だけどな
137デフォルトの名無しさん:2011/07/23(土) 17:09:23.41
#pragmaはコンパイラ独自拡張だけどな
138デフォルトの名無しさん:2011/07/23(土) 17:17:42.35
#pragmaそのものは標準だろ
139デフォルトの名無しさん:2011/07/23(土) 18:12:58.79
#pragma once はもう標準にしろよ
140デフォルトの名無しさん:2011/07/23(土) 18:26:03.26
0xでは標準になったよ
141デフォルトの名無しさん:2011/07/23(土) 18:26:50.52
#pragunma
142デフォルトの名無しさん:2011/07/23(土) 18:51:15.71
>>140
やるじゃん
0x△
143デフォルトの名無しさん:2011/07/23(土) 19:51:49.64
なんだうそか
144デフォルトの名無しさん:2011/07/23(土) 20:09:02.97
まぁ、VCとgccで使えるからいいや
145デフォルトの名無しさん:2011/07/23(土) 20:59:54.57
え、嘘なの?
0x▽
146sage:2011/07/24(日) 01:05:19.38
const int& w = mWidth;
const int& h = mHeight;
Array2D< unsigned char >& o = mObjects;

mWidth,mHeight, mObjectsはそれぞれメンバ変数なんですが
この参照の使い方がわからないので教えてください 
147デフォルトの名無しさん:2011/07/24(日) 01:19:28.12
>>146 書いた奴に聞けよ。
148デフォルトの名無しさん:2011/07/24(日) 01:20:37.71
const int& w = mWidth;
const int& h = mHeight;

w = 100;
h = 200;

bool a = (w == mWidth);
bool b = (h == mHeight);

この地点で a == true、b == true
ってこと?
149デフォルトの名無しさん:2011/07/24(日) 01:21:20.19
何が判らないのかよく判らん。
単に、一時変数として使いたいだけでしょ。
150デフォルトの名無しさん:2011/07/24(日) 05:04:09.28
単に安全性と見やすさの為にconst参照で束縛したようにしか見えんが、なんか問題あるのか?
どうせその後にw,n,o使ったなんかの処理あるんだろ?
151デフォルトの名無しさん:2011/07/24(日) 18:01:11.61
streamのsentryオブジェクトの役割というか概念が分かりません。
例外安全の為らしいですが、どういう状況の時に役に立つのでしょうか?
152デフォルトの名無しさん:2011/07/24(日) 21:24:26.86
pthreadとかの関数ポインタの実体は、friend関数にするべきですかね?
クラスのメンバー関数にして、それを型キャストしてpthreadに入れるとワーニングが出るんですが。
153デフォルトの名無しさん:2011/07/24(日) 21:25:40.60
コンパイラはgcc(g++)です。
154デフォルトの名無しさん:2011/07/24(日) 22:22:56.68
関数ポインタをキャストということが、どれだけ異常な事態かわかってる?
155デフォルトの名無しさん:2011/07/24(日) 22:27:45.86
「関数ポインタのキャスト」は異常と言えば異常だが、正常でもある。>>152のは異常。
156デフォルトの名無しさん:2011/07/24(日) 22:34:50.10
>>154
わかってないですね
教えて頂けると嬉しいです。

>>155
friniedにした方が良いという事でしょうか?
157デフォルトの名無しさん:2011/07/24(日) 22:39:45.73
メンバー関数はptheadには渡せない。staticメンバー関数なら渡せる。
158デフォルトの名無しさん:2011/07/24(日) 22:44:02.88
http://www.atmarkit.co.jp/fdotnet/chushin/comparedataproc_01/comparedataproc_01_02.html
こういう話でC++がハブられるのは何故なんでしょう?
159デフォルトの名無しさん:2011/07/24(日) 22:48:36.12
人気言語じゃないから
160デフォルトの名無しさん:2011/07/24(日) 23:19:42.99
>>157
なので、関数ポインタの型キャストをしたのです。
警告がでますが、正常に動きます。
friendの方が良いということでしょうか?
161デフォルトの名無しさん:2011/07/24(日) 23:31:08.49
>>156
void(*a)() = (キャスト)printf;
a();

何が起きるか考えてみな
162デフォルトの名無しさん:2011/07/24(日) 23:37:08.92
>>152が何をしたいのか理解できない俺はおかしいのか?
163デフォルトの名無しさん:2011/07/24(日) 23:38:46.98
スッドレという言葉が出てるのに想像できないのはおかしいね
164デフォルトの名無しさん:2011/07/24(日) 23:39:54.58
スッドレ!
165デフォルトの名無しさん:2011/07/24(日) 23:42:23.73
>>157
大抵の実装ではキャスト無しで通ってしまうが、ほんとうは extern "C" の付いてる
pthread の関数に extern "C++" な static メンバ関数へのポインタは渡せない。

>>160 キャストってのは↑の問題のことか?
よくわかんないからコピペ推奨。
166デフォルトの名無しさん:2011/07/24(日) 23:44:16.71
>>161
よくわかりませんね。

class A{
void *func(void *p);
};
pthread_create(NULL, NULL, reinterpret_cast<void* (*)(void*)>(&A::func), NULL);

において、
このキャストが悪い理由がわかりません。
結局、friendにした方が良いとおっしゃりたいんですかね?
167デフォルトの名無しさん:2011/07/24(日) 23:48:25.22
>>166
func を実行する相手がいないだろ
アクセス制御とは無関係な問題だ
168デフォルトの名無しさん:2011/07/24(日) 23:52:04.17
>>167
funcの実体がないという事ですか?
割愛したんですが、

xxx.h

class A{
void *func(void *p);
};

xxx.c
A::A(){
pthread_create(NULL, NULL, reinterpret_cast<void* (*)(void*)>(&A::func), NULL);
}

void *A::func(void *p){
return NULL;
}

取りあえず、クラスのメンバ関数にするか、frindでAにアクセスする方が良いかを聞きたいのですが…
169デフォルトの名無しさん:2011/07/24(日) 23:53:01.50
>>166
これはfriendとかそういう次元の話じゃないな
170デフォルトの名無しさん:2011/07/24(日) 23:53:42.08
>>169
では、funcがclass Aにアクセスするにはどうすればいいですか?
171デフォルトの名無しさん:2011/07/24(日) 23:55:14.54
>>170
pからアクセスすれば?
172デフォルトの名無しさん:2011/07/24(日) 23:55:41.27
>>171
すみません。
pってなんですか?
173デフォルトの名無しさん:2011/07/24(日) 23:57:46.90
void *func(void *p <- これ
pthread_createの第四引数にthis渡せば普通にAのメンバ呼べるでしょ
174デフォルトの名無しさん:2011/07/24(日) 23:58:14.76
>>170
func の実体じゃない、func の対象
クラスにアクセスって、自分が言ってることを冷静に考えてみな
175デフォルトの名無しさん:2011/07/24(日) 23:58:26.05
>>151
ライブラリ実装側が、個別の出入力ごとに事前操作と事後操作を入れられるようになる。
オブジェクトにすることで事後操作が正しく実行されることを想定できる。

こんなところかと。たぶん。
176デフォルトの名無しさん:2011/07/25(月) 00:00:29.18
>>173
やっと納得できる答えがありました。
どうもありがとうございます。
177デフォルトの名無しさん:2011/07/25(月) 01:03:21.26
なんかずれてる思考だな。この先苦労しそうな人。
ていうか、頭固すぎ。
178デフォルトの名無しさん:2011/07/25(月) 01:09:32.28
多重継承クラスのメンバポインタや
仮想関数のメンバポインタがからむと
発狂しそうだな、このお方

sizeof の違う reinterpret_cast とか平気みたいだし
179デフォルトの名無しさん:2011/07/25(月) 02:13:07.61
コードの書き方で、人生の心配までされたのは初めてだw
C++って最近暇つぶしに書き始めたばかりだから、先輩諸氏には到底及ばんと思う。


結局、ワーニングでるけどこれにしました。
pthread_create(NULL, NULL, reinterpret_cast<void* (*)(void*)>(&A::func), NULL);
privateにアクセス出来ないのは結構痛いので。
180デフォルトの名無しさん:2011/07/25(月) 02:15:20.64
sizeofが違っても、reinterpret_castしても大丈夫だと思うのだが…
陰口もいいけど、合理的な理由も付けて欲しいね
181デフォルトの名無しさん:2011/07/25(月) 02:19:59.36
>>179
それじゃやりたいことができないだろう。
A のインスタンスをスレッド内で作成できるなら別だが。
182デフォルトの名無しさん:2011/07/25(月) 02:25:42.82
>>179
こいつ何もわかってなくて泣いた
183デフォルトの名無しさん:2011/07/25(月) 02:32:54.63
>>179
メンバポインタからやり直した方がいいよ
184デフォルトの名無しさん:2011/07/25(月) 02:33:01.77
>>180
確かに sizeof は本質ではないが、サイズとは無関係に reinterpret_cast 自体が大丈夫じゃない。
大丈夫だと思うならまずその理由を言ってみろよ。
185デフォルトの名無しさん:2011/07/25(月) 02:38:01.05
>>179
お前それで正常に動いたか?
186デフォルトの名無しさん:2011/07/25(月) 02:40:15.38
>>159
確かに…
187デフォルトの名無しさん:2011/07/25(月) 03:57:15.70
>>184
ダメな理由を述べよ

てか、教えないがグダグダ言われてもな…
嫌なら答えなきゃ良いのに、腐った死体ばかりだなw
188デフォルトの名無しさん:2011/07/25(月) 03:58:16.97
君たち偉大な技術者には敵わないから、おおめに見てくれや。
189デフォルトの名無しさん:2011/07/25(月) 04:02:08.08
教えてもここにいる技術者に突っ込まれるしな
相手に語らせればつついて遊べるし
190デフォルトの名無しさん:2011/07/25(月) 04:03:53.12
>>185
動かなかった。
スレッドは実行されるが、メンバ変数にアクセスしたところで落ちた。
勉強して出直すわ。

friendにして、明日試してみる。
191デフォルトの名無しさん:2011/07/25(月) 04:11:34.03
それにしてもメンバ関数を無理やりキャストして使うってすごい発想だな
192デフォルトの名無しさん:2011/07/25(月) 04:19:24.48
そうか?
むしろ、メンバ変数を参照するには、それしか思いつかんかった。
193デフォルトの名無しさん:2011/07/25(月) 04:33:01.56
>>190

>friendにして、明日試してみる。

結果報告ヨロ
メンバ関数ポインタという物を全く理解してないのがこれでわかるな・・・
194デフォルトの名無しさん:2011/07/25(月) 04:34:44.69
boost::thread tr(boost::bind(&A::func, this, NULL));
もうこれでいいよ
195デフォルトの名無しさん:2011/07/25(月) 05:28:32.37
簡単に考えてみようじゃん?
メンバ関数は中で this ポインタを使えるじゃん?
hoge.Save(); って呼び出すと、メンバ関数Saveの中で this(= hogeのアドレス)が使えるじゃん?
ってことはメンバ関数は裏で hoge(インスタンス)のアドレスが勝手に渡されてるってことじゃん?
ってことは普通の関数とメンバ関数は別物ってことになるじゃん?
196デフォルトの名無しさん:2011/07/25(月) 06:18:53.11
理解させるだけ無駄だな
197デフォルトの名無しさん:2011/07/25(月) 06:28:49.43
A::funcはスタック上にvoid*とthisが積まれていると想定しているのに対して、pthreadは
void*しか積んでないのでおかしな事になる。(thisには多分pthread_createルーチン内の
リターンアドレスが入っていると思う)
スタックの清掃は呼び出し側で行っているようなので問題ない様に見えるけど、
やってる事はスタックオーバーフローと大して変わらない

198デフォルトの名無しさん:2011/07/25(月) 06:43:38.13
std::cout << reinterpret_cast<int>(&A::func) << std::endl;
面白いからやってみろよ
199デフォルトの名無しさん:2011/07/25(月) 07:17:15.23
>>180,187
N3290 5.2.10 [expr.reinterpret.cast] p6 より。
"The effect of calling a function through a pointer to a function type that is not the same
as the type used in the definition of the function is undefined."

これまで流れを見るに、これで理解してもらえるとは思わないが。
200デフォルトの名無しさん:2011/07/25(月) 07:42:00.94
自分で考えない奴が理解できるわけがない
201デフォルトの名無しさん:2011/07/25(月) 08:04:45.64
なんか、早朝から俺を懸命に貶す作業をしてる奴ら乙ww
「相談室」というスレタイで来たのに、ベテランの公開オナニー場とは詐欺なスレだなw

>>193
間違いなく、ただの関数ポインタって思ってるからな。
昨日の結果を鑑みると、何か間違ってるようだが。。
盆休みにでも、徹底して勉強したい。

>>197
解説ありがとう。
唯一、技術的にCプログラマな俺にもわかるように説明してくれたのはあんただよ。
202デフォルトの名無しさん:2011/07/25(月) 08:10:28.84
>>199
せっかく出典出してもらったのに悪いが、君の予想通りわからないっぽい。
せめて日本語なら…
203デフォルトの名無しさん:2011/07/25(月) 08:18:19.63
>>187
reinterpret_cast はどこで覚えたの?

どういう解説したら「reinterpret_castしても大丈夫」「ダメな理由を述べよ」なんて
発想になってしまうのか興味があるな。
204デフォルトの名無しさん:2011/07/25(月) 08:35:58.71
>>201
> 「相談室」というスレタイで来たのに、ベテランの公開オナニー場とは詐欺なスレだなw
書籍等で学んでいることが前提だよ。その上でわからない場合の相談室。一から十までこのスレで学ぶ気か?
キミは基本を全くわかっていないのに、どこから仕入れてきた知識かしらんけど、見よう見まねでfriendとか言い出してる。
これじゃ、C++の初心者でも簡単に弄れる。弄ってるのはベテランじゃなくて初心者だろう。

面倒くさいから正しい書き方教えてやる。なぜこうするのかは書籍で学べ。

#include <pthread.h>
class A {
private:
void member1() { }
public:
static void* thread_func(void *data) {
A &self = *reinterpret_cast<A *>(data);
self.member1();
....
return NULL;
}
};
void aaaa()
{
pthread_t th;
A a;
pthread_create(&th, NULL, A::thread_func, &a);
}
205デフォルトの名無しさん:2011/07/25(月) 09:59:39.11
>>204
> 面倒くさいから正しい書き方教えてやる。なぜこうするのかは書籍で学べ。
「正しい」ねぇ・・・

> A &self = *reinterpret_cast<A *>(data);
static_cast だろ。

> pthread_create(&th, NULL, A::thread_func, &a);
>>165

あと pthread_create() のエラー処理な。
206デフォルトの名無しさん:2011/07/25(月) 10:23:44.88
>>205
カルシウム足りてないようだな。

ポインターの変換には例外を設けずreinterpret_castを用いる方が自然。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1120
207デフォルトの名無しさん:2011/07/25(月) 10:32:25.61
>>206
リンク先が全然根拠になってない件。
少なくとも C++2003 では標準の範囲外なわけだ。
さらに C++2011 で変換自体が認められたとしても変換後の値自体は
unspecified で、動作は保証されない。
全然自然じゃない。

暗黙変換の逆変換は C++1998 からずっと static_cast の役目。
208デフォルトの名無しさん:2011/07/25(月) 11:25:24.22
>>201
一生Cから出てこないでほしいな
209デフォルトの名無しさん:2011/07/25(月) 11:29:44.20
>>207
void*からオブジェクトのポインタへの変換後の動作が保証されないのは
static_castも同様。つーか保証できるわけがない。
だからこそ、reinterpret_castでいいじゃんという話がでてきてる。
210デフォルトの名無しさん:2011/07/25(月) 12:56:40.78
ビット列を変えずに型だけ変わったことにしたければ reinterpret_cast
暗黙変換の逆なら const_cast や dynamic_cast という場合もある
上記いずれにもあたらない「明示的な型変換」がしたいとき static_cast

よって 204,206 vs 205=207 は 204,206 の勝ち

# この法則にも穴があるが今の流れとは関係ないので放置
211デフォルトの名無しさん:2011/07/25(月) 13:14:51.06
とりあえず全てstatic_castを使って対応出来ない場合のみ
他のキャストを使用するって方針なのかもよ
reinterpret_castだと(やるかどうかは別として)間違えてvoid*以外を渡してもコンパイルエラーにならないし
212デフォルトの名無しさん:2011/07/25(月) 14:37:25.35
>>211
まあreinterpret_cast使うなら任意の不完全型でもいいからなw
voidは「static_castでも変換できる不完全型」なのでせっかくだから俺はこのstatic_castを選ぶぜ!ってやつがいてもおかしくない。例えば俺とか
213デフォルトの名無しさん:2011/07/25(月) 14:40:52.64
僕はCスタイルキャストちゃん!
214デフォルトの名無しさん:2011/07/25(月) 14:50:31.93
【初心者歓迎】C/C++室 Ver.75【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1299218426/
215デフォルトの名無しさん:2011/07/25(月) 16:20:33.28
>>211
テンプレートを作ってコンパイルエラー検出。
template <class T>
T hoge_cast(void*p)
{
return reinterpret_cast<T>(p);
}
216デフォルトの名無しさん:2011/07/25(月) 20:29:47.21
>>203
入門書にかいてあったよ。
結構平気でvoid *に値突っ込んだり、取り出したりしてたから

>>204
そうカリカリするなよ。
一応、入門書は走破して、実際にコードを書き始めたわけさ。
スレタイに入門者・初心者お断りといれればどうよ?
あと、サンプルありがとな。
早速試すわ。

>>208
お前の人生には迷惑かけないから、ゆるしてちょ

217デフォルトの名無しさん:2011/07/25(月) 20:30:22.17
喧嘩はやめてくれ。たのむ

ttp://ideone.com/BlmAq

サンプル書いてみました。「メンバへのポインタ」でググるといいかも

実際に書いてみると、自分の知識もずいぶんと曖昧だと思いました
21行目でreinterpret_cast<int>(this)がエラーになる理由と
67行目の&演算子を外すとエラーになる理由がよく分からないです
218デフォルトの名無しさん:2011/07/25(月) 20:49:28.30
>>217
散々叩かれた俺が言うべきか分からんけど、
一つ目は(64bit cpuでは)intではケタがたりないのでは?
219デフォルトの名無しさん:2011/07/25(月) 20:50:50.27
>>217
staticメンバ関数ってようは普通の関数だからthisとか使えない
220デフォルトの名無しさん:2011/07/25(月) 22:05:29.74
禿本よめば一発で済むことをまあgdgdと長いこと・・・
221デフォルトの名無しさん:2011/07/25(月) 22:06:38.05
>>217
pthreadの件については、戻り値と引数が同じ関数なら型キャスト出来ると思っていた。
少なくとも今まで上手くいかなかった事がないので、
生涯わからんと思うけど、
C++において、メンバ関数の型キャストは危険と覚えておくわ。
222デフォルトの名無しさん:2011/07/25(月) 22:49:13.11
ttp://ideone.com/nG9M6

普通のポインタ:
メモリ上の直接のアドレス

メンバへのポインタ:
インスタンスの先頭アドレスからのオフセット、
なのでインスタンスと一緒に使わないと意味がない

普通の関数ポインタを、メンバへのポインタに reinterpret_cast するのは
危ないのではないかと思う
223デフォルトの名無しさん:2011/07/26(火) 00:51:50.21
>>209
> void*からオブジェクトのポインタへの変換後の動作が保証されないのは
> static_castも同様。つーか保証できるわけがない。

なんでそう思ったの?

static_cast の動作として T* → void* という標準変換の逆変換が含まれることは
きちんと規格で定められているよ。 N3290 だと 5.2.9 p7 で。
224デフォルトの名無しさん:2011/07/26(火) 00:59:17.78
>>210
> ビット列を変えずに型だけ変わったことにしたければ reinterpret_cast

reinterpret_cast でビット列が変わらないと期待するコードに移植性は無いよ。
5.2.10 p3
[ Note: The mapping performed by reinterpret_cast might, or might not, produce
a representation different from the original value. ?end note ]


ポインタを別のポインタ型にキャストして、元に戻してから使う限りは static_cast も
reinterpret_cast も同程度の保証があるけど、 >>204 について言えば最初の変換が
暗黙変換なのだから戻すのは static_cast じゃないといけない。

戻すのに reinterpret_cast を使うのなら、最初の変換も reinterpret_cast でなければ
ならない。
pthread_create(&th, NULL, A::thread_func, reinterpret_cast<void*>(&a));
225デフォルトの名無しさん:2011/07/26(火) 03:24:22.80
>>223
> なんでそう思ったの?
当たり前だろ。void *として渡されてたポインタが変換先のオブジェクトへの
ポインタであったことなんか保証できないんだから。

>>224
暗黙変換の逆変換がstatic_castで出来るというだけで、暗黙変換の逆変換を
static_castでやらなければいけないなんて、どこにも書いていない。
226デフォルトの名無しさん:2011/07/26(火) 04:12:55.78
>>225
> 当たり前だろ。void *として渡されてたポインタが変換先のオブジェクトへの
> ポインタであったことなんか保証できないんだから。

そこの保証が無い場合はどのキャスト使おうがアウトなんで話してもしょうがないでしょ。

> static_castでやらなければいけないなんて、どこにも書いていない。

static_cast では、暗黙変換の逆変換ができると定められている。
reinterpret_cast では、暗黙変換の逆変換ができると定められていない。
(変換自体はできるが値が unspecified になる)

どっちを使うべきか、もうわかるよね?
227デフォルトの名無しさん:2011/07/26(火) 07:34:46.38
> reinterpret_cast では、暗黙変換の逆変換ができると定められていない。
> (変換自体はできるが値が unspecified になる)
妄想規格 wwww
228デフォルトの名無しさん:2011/07/26(火) 08:52:13.99
>>227
ちがうの?
5.2.10 [expr.reinterpret.cast] paragraph 7 (>>206 のリンク先)に unspecified って
書いてあるみたいだけど。
229デフォルトの名無しさん:2011/07/26(火) 09:11:57.88
>>228
The result of any other such pointer conversion is unspecified.
これら以外のポインター変換の結果はunspecified
230デフォルトの名無しさん:2011/07/26(火) 10:04:46.66
「確かに、フジテレビの方針は目に余るものがあります。ペ・ヨンジュンブームのころから
韓流ドラマをやたら放送したり、女子フィギュアでは浅田真央よりキム・ヨナに寄せた
報道をして批判を浴びたりしたことがありましたが、最近ではさらに拍車がかかっている
ようで、社内にも微妙な雰囲気が漂っています」(フジテレビ関係者)

フジテレビや産経新聞は「フジサンケイグループ」の傘下だが、同グループのサンケイ
スポーツからは4月に韓国エンターテインメント情報のタブロイド誌「韓Fun(カンファン)」が
創刊されるなど、今年に入って"韓流押し"に本腰を入れてきているという。

「フジは他にも、今年4月に渋谷と恵比寿に同時オープンしたK-POPの常設公演会場
『Kシアター』に出資。系列の音楽出版会社はKARAらK-POPアーティストの版権を
買いまくっている。七夕に放送された同局の情報番組では『少女時代のように足が
綺麗になりますように』『KARAのライブに行けますように』などと書かれた短冊を
映り込ませ、女子アナたちもことあるごとに韓国旅行の魅力をPR。まるで韓国国家の
宣伝企業と化している状態ですよ」(スポーツ紙デスク)

そうしたメディアと視聴者との温度差が露見した形となった今回の騒動。現在のような、
キー局による露骨な"利益誘導型"の放送が続けば、さらなるテレビ離れが進むことは
避けられないだろう。

http://news.livedoor.com/article/detail/5732069/
231デフォルトの名無しさん:2011/07/26(火) 12:36:47.82
>>229
これら = reinterpret_castでT1 *→T2 *→T1 *とすると元の値に戻りますよーとかnullはどのポインタに変換してもnullですよーなど
でしょ?

んでその「これら」には
暗黙の変換でT1 *→void *に変換して
そのあとreinterpret_castでvoid *→T1 *に変換すると元の値に戻りますよってのが含まれてるの?
ってのが>>228の言いたいことなんじゃね?


今ちょっと調べられないけどどうなの?
232デフォルトの名無しさん:2011/07/26(火) 14:28:30.70
>>231
半端な知識でいいがかりつけてきた>>205が引けなくなって粘着してるだけだから気にすんな。
「これらの変換」が「T1*をT2*に変換したものを元に戻す」の事で、それ以外はunspecifiedと
いうのならば、↓これがunspecifiedという事になってしまう。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int bbb(sockaddr *sa);

int aaa(struct sockaddr_in *sin)
{
return bbb(reinterpret_cast<struct sockaddr*>(sin));
}

すなわち、「これらの変換」とはその前(スタンダードタイプでかつT2のアライメント要求が
厳しくない、またはどちらかがvoid)の変換も含む。
233デフォルトの名無しさん:2011/07/26(火) 14:55:48.31
>>232
> いうのならば、↓これがunspecifiedという事になってしまう。

C++03 までは unspecified なコードだね。

> すなわち、「これらの変換」とはその前(スタンダードタイプでかつT2のアライメント要求が
> 厳しくない、またはどちらかがvoid)の変換も含む。

で、 >>204 のコードでは void* data → A* だから「どちらかがvoid」に含まれ、
その結果は static_cast<A*>(static_cast<void*>(data)) となる、つまり
static_cast<A*>(data) になる、と C++11 では新たに規定されることになった。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#658
234デフォルトの名無しさん:2011/07/26(火) 15:27:51.46
>>222
そのメンバポインタの話じゃないだろ

>>226
> static_cast では、暗黙変換の逆変換ができると定められている。

いちいち突っ込むのもアホくせえほど無茶苦茶やなw
235デフォルトの名無しさん:2011/07/26(火) 15:34:21.30
>>234 N3290 5.2.9 p7 で定められてるらしい(>223)ぞ。
236デフォルトの名無しさん:2011/07/26(火) 15:35:52.25
>>232はC++03でも正しい。
「voidのアライメントなんて定義されてねー」と言いがかりつけてくるのがいるので、
voidが特記された。

5.2.10 p7
A pointer to an object can be explicitly converted to a pointer to an object of
different type. Except that converting an rvalue of type 懼pointer to T1懼?�
to the type 懼pointer to T2懼?� (where T1 and T2 are object types and where the
alignment requirements of T2 are no stricter than those of T1) and back to its
original type yields the original pointer value, the result of such a pointer
conversion is unspecified
237デフォルトの名無しさん:2011/07/26(火) 15:40:14.59
化けた。
ま、>>233が規格理解してない半可通という事が証明されてしまったわけだ。w

5.2.10 p7
A pointer to an object can be explicitly converted to a pointer to an object of
different type. Except that converting an rvalue of type "pointer to T1" to the
type "pointer to T2" (where T1 and T2 are object types and where the alignment
requirements of T2 are no stricter than those of T1) and back to its original type
yields the original pointer value, the result of such a pointer conversion is
unspecified.
238デフォルトの名無しさん:2011/07/26(火) 15:41:41.85
>>233
C++03 では void* → A* の変換自体が認められていない。
unspecified 以前にコンパイルが通らない可能性がある。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1120
239238:2011/07/26(火) 15:44:19.26
>>237
void* は "pointer to an object" ではなくてですね。

> ま、>>233が規格理解してない半可通という事が証明されてしまったわけだ。w
お前もな。
240デフォルトの名無しさん:2011/07/26(火) 15:47:31.99
>>236
ねー、 >>232 ってキャストした後元に戻してないんだけど、なんで大丈夫なの?
241デフォルトの名無しさん:2011/07/26(火) 15:57:47.31
そもそもなんでこんなに reinterpret_cast が大好きなんだろう?
危険性や移植性が増えるだけだろうに。
242デフォルトの名無しさん:2011/07/26(火) 15:58:30.32
>>235
template <typename a>
int b(int c)
{
a d;
d = c; //暗黙変換
return N3290_cast<int>(d); //ふーん、すごいなあ・・・
}
243デフォルトの名無しさん:2011/07/26(火) 15:59:40.73
>>238-239
> C++03 では void* → A* の変換自体が認められていない。
> void* は "pointer to an object" ではなくてですね。
そういう言いがかり付けてくる奴がいるから「どっちかがvoid」が追加されたんだよ。w
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1120

>>240
bbb()はconnect(2)のようにstruct socksaddr*を引数に取る関数。
bbbの内部(共通部分に書かれてるタイプみて)で戻す。
244デフォルトの名無しさん:2011/07/26(火) 16:01:49.75
>>241
それじゃお前は↓このように書け。大変だな。www

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int bbb(sockaddr *sa);

int aaa(struct sockaddr_in *sin)
{
return bbb(static_cast<struct sockaddr*>(static_cast<void*>(sin)));
}
245デフォルトの名無しさん:2011/07/26(火) 16:37:33.92
C++形式のキャストそのものが嫌いな俺はどうしたらいいんだぜ
246デフォルトの名無しさん:2011/07/26(火) 16:38:59.49
よく首にならないな
247デフォルトの名無しさん:2011/07/26(火) 17:42:24.37
>>241
今は>>231の2段落目 "んでその「これら」には……が含まれてるの?" のYes/Noを議論してるので
それが実際にコーディングする上でミスを誘いやすいか否かはまた別の問題として扱ったほうがいいんじゃないかな
248デフォルトの名無しさん:2011/07/26(火) 17:49:56.19
>>237
でもその文面に void の特記が含まれてないお
というか現行標準の 5.2.10/7 には未だ void の特記は
含まれてないと思うお
249デフォルトの名無しさん:2011/07/26(火) 18:57:35.15
>>237
>>232の例がC++03でunspecifiedだと>>233が言いがかり付けてきたから、
C++03(>>236)を引用した。

>>232-233はvoid*とは直接関係ないから。文脈読めない人は引っ込んでなよ。
250デフォルトの名無しさん:2011/07/26(火) 19:25:55.62
アンカー間違えた

>>248
>>232の例がC++03でunspecifiedだと>>233が言いがかり付けてきたから、
C++03(>>236-237)を引用した。

>>232-233はvoid*とは直接関係ないから。文脈読めない人は引っ込んでなよ。
251デフォルトの名無しさん:2011/07/26(火) 21:26:03.86
ttp://ideone.com/NlHSk

確かに 5.2.10p7 の Converting... の文だけでは
A* => void* => A* のような void* を含む変換では、元に戻る確証が得られないような気がする

ただ、最初の文によると void* を経由して static_cast すれば、reinterpret_cast が実現できるので
reinterpret_cast<A*>( reinterpret_cast<void*>( &A() ) )

static_cast<A*>( static_cast<void*>( static_cast<void*>( static_cast<void*>( &A() ) ) ) )
= static_cast<A*>( static_cast<void*>( &A() ) )   /* (!) */
と同じこと

そして、5.2.9p13 によれば、(!) の式は元の値に等しくなるとある

「ただ、…」以降の部分は、確証がもてんです
というか、実務で問題なく使えれば、もうそれでいいかなあ。。
252デフォルトの名無しさん:2011/07/26(火) 21:30:24.11
ああ、抜けがある。。ごめんなさい

void* gf( void* )
{
  A().operation();
  return NULL;
}

ところで、戻り値の NULL の型はどのような扱いになるんですか?
253デフォルトの名無しさん:2011/07/26(火) 21:43:18.03
十分に討論して、それが済んだら3行でまとめてくれ
254デフォルトの名無しさん:2011/07/26(火) 21:49:06.07
誰がどの点に対してどういう意見なのか分かりにくいので反論という形にせずに
自分の認識を書いてみる。

5.2.10 はあくまで reinterpret_cast の項なので p7 の 2 回の変換が共に
reinterpret_cast の場合にのみ成立する(元に戻る保証がある)、というのが
俺の解釈で、>205 も同様の解釈なのだと思う。

>232 については sockaddr_in と sockaddr が無関係の型なので、bbb の中では
reinterpret_cast を使って戻していると想定されるため unspecified ではない(と想定される)。

一方で、暗黙の型変換の逆方向の変換ができるとは reinterpret_cast では規定されていない。
static_cast は 5.2.9 で規定されている。
実際、(reinterpret_cast の変換が処理系定義なので)処理系に依存するけど元に戻せない例を
作る事が出来て実例が http://ideone.com/L7ZuL

後出しで多重継承かよ、というかもしれないが 5.2.10 の規定に継承について書かれていない以上
多重継承かどうか等に関わらず元に戻せる保証がないと読むべき、というのが俺の主張。
255デフォルトの名無しさん:2011/07/26(火) 22:11:16.99
>>254
インチキ
reinterpret_casterの呼び出しの暗黙のC*->B*への変換で変更されている。
256デフォルトの名無しさん:2011/07/26(火) 22:17:44.17
職場の人が変数も関数も全部publicにして困るんですけどどうしたらいいですか。
言うと怒るし。
257デフォルトの名無しさん:2011/07/26(火) 22:19:40.90
>>256
老害はほっとけ
258デフォルトの名無しさん:2011/07/26(火) 22:20:10.50
classじゃなくてstructにすればpublic要らないですよ。と教えてあげましょう。
259デフォルトの名無しさん:2011/07/26(火) 22:23:35.10
#define public private
して職場の人を困らせてあげましょう
260248:2011/07/26(火) 22:43:02.85
流れ理解してなかった。ごめんお (´;ω;`)
261デフォルトの名無しさん:2011/07/26(火) 23:03:55.06
>>256
COBOLerかな?
シングルトン一本槍とか、10進ライブラリにご執心とか?
262デフォルトの名無しさん:2011/07/26(火) 23:19:13.33
>>222
ああ、俺への回答か。
ありがとう。

今日、昼休み中考えてて、俺なりに納得してみた。

class A{
void *func(void *arg){
reurn NULL;
}
};
の場合において、
reinterpret_cast<void* (*)(void*)>(&A::func)
というキャストは、A::を取る目的でつかったんだが、
A::を取る事は即ちclass Aのメンバでなくなるという事かなと。
なので、class Aのメンバにアクセスしようとすると落ちると。

Cとかアセンブラの場合、関数ポインタは関数の先頭を指すアドレスにすぎないけど、
(だから、強引なキャストで良いと思ってた)けど、
C++ではそうではないんだなと。
263デフォルトの名無しさん:2011/07/26(火) 23:29:51.91
>255
暗黙の変換を元に戻せるかどうか、を確認してるんだから暗黙の変換がないと意味がないじゃん。
264デフォルトの名無しさん:2011/07/27(水) 01:50:59.53
T* p = ...;
void* vp = p;
assert(static_cast<T*>(vp) == p); // (1)
assert(reinterpret_cast<T*>(vp) == p); // (2)

(1) static_cast (5.2.9)
C++03 でも C++11 でも OK 。

(2) reinterpret_cast (5.2.10)
C++03 では可能な変換として挙げられていない。
C++11 では OK 。(DR #658, #1120 による変更)


とりあえずここまでは合ってる?
265デフォルトの名無しさん:2011/07/27(水) 17:13:48.64
Cは関数の中に関数を作ることができるみたいですが
C++では似たようなことはできないのでしょうか
266デフォルトの名無しさん:2011/07/27(水) 17:21:29.70
0xならラムダ式が使える
267デフォルトの名無しさん:2011/07/27(水) 17:23:28.35
関数オブジェクトを作ればC++でもいけるな
268デフォルトの名無しさん:2011/07/27(水) 17:31:18.63
>>265
Cではできないよ
それができるのはGCCの独自拡張じゃないかな
269デフォルトの名無しさん:2011/07/27(水) 17:42:19.76
>>265
void Foo(void) {
struct Local { static void Bar(void) { /*^o^*/ } };
Local::Bar();
}
270デフォルトの名無しさん:2011/07/27(水) 18:29:41.56
>>264
おまえ >>207 か?
ここ「まで」って何を勝手に限定してるんだよ

> 暗黙変換の逆変換は C++1998 からずっと static_cast の役目。

これだけ大きく出たんなら「任意の」暗黙変換の逆がすべて static_cast であることを示せ
271デフォルトの名無しさん:2011/07/27(水) 20:07:14.67
予定じゃ来年だしC++11とかいってる>>207,233,264は同じやつなんだろうな
そしてたぶん>>205
272デフォルトの名無しさん:2011/07/27(水) 23:51:17.31
EclipseにCDTでほぼデフォルトのままでC++ by Jim Congerを組み込んでみたのですが、
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\blowfish\blowfish.o ..\src\blowfish\blowfish.cpp
In file included from ..\src\blowfish\blowfish.cpp:5:
..\src\blowfish\blowfish.h2:268: warning: missing braces around initializer(長いのでとりあえず略)
こんな感じでエラーになってしまいました。
どこに問題があるのでしょうか?
273272:2011/07/27(水) 23:53:06.05
Blowfishを使ってとりあえず暗号化とか出来るサンプルを作ってみようと思ったのですが、
うまくいきませんでした。
ちなみに組み込んだというのはここのファイルです
http://www.schneier.com/blowfish-download.html
274デフォルトの名無しさん:2011/07/27(水) 23:56:17.47
それはエラーじゃなくて警告なんで
275デフォルトの名無しさん:2011/07/28(木) 00:09:16.82
>>265
>Cは関数の中に関数を作ることができる
どう作るのか教えてください
276デフォルトの名無しさん:2011/07/28(木) 00:15:43.73
>>272
二次元配列を{{}, {}, ...}って形でなく{...}の形の初期化子で初期化してるからじゃないかな。
277272:2011/07/28(木) 00:25:00.43
ありがとうございます
これは特に気にしなくていいメッセージでしたか、
確かに276の言うとおりなソースになっていました。

これのエラーメッセージの後にさらに
g++ -oサンプル.exe src\main.o src\blowfish\blowfish.o
src\blowfish\blowfish.o:blowfish.cpp:(.text+0x0): multiple definition of `CBlowFish::CBlowFish()'
src\main.o:main.cpp:(.text+0x0): first defined here
と関数系のエラーが出ているのですが、
ファイルに#ifndefとかを追加していますし、
試しにとコマンドでg++ main.cpp(←blowfishをインクルードしているだけ)をやると
コンパイルが通るのですが、
このエラーは何が原因と考えられるでしょうか?
278デフォルトの名無しさん:2011/07/28(木) 00:36:55.53
279デフォルトの名無しさん:2011/07/28(木) 01:01:50.02
>>277main.cppでblowfish.cppをインクルードしてるのが原因だろ
280デフォルトの名無しさん:2011/07/28(木) 01:06:38.40
unsigned char red,green,blue;
unsigned int color =(red<<16)|(green<<8)|blue;
これの使い方わかりますか
赤青緑それぞれ一バイトの数値を持っていてcolorにその赤青緑を代入する
ときビットシフトがかかる と思ってたんですが実際やったらうまくいきませんでした
サンプルのお手本なんですが使い方を教えてください 
281デフォルトの名無しさん:2011/07/28(木) 01:20:40.60
うまくいかないってどうなったんだ
282デフォルトの名無しさん:2011/07/28(木) 01:21:11.26
>>280
まさかと思うが、red, green, blueに赤青緑を代入してないだろうな。
283272:2011/07/28(木) 01:32:59.26
>>279
インクルードを消したら、
クラスを使おうとする時に未定義エラーで通らないですよね。
284デフォルトの名無しさん:2011/07/28(木) 01:39:28.46
285デフォルトの名無しさん:2011/07/28(木) 06:15:50.55
>>280
red,greenをunsigned intにキャストしてからシフト
286デフォルトの名無しさん:2011/07/28(木) 16:10:06.95
Observerパターンを実装しようと考えています

SubjectにObserverを登録したいのですが
登録用メンバ関数
Subject::Attach( boost::shared_ptr<Observer> &src)
にObserver自身のshared_ptrを渡せなくてこまっております。
このような場合どうしたらいいでしょうか
287デフォルトの名無しさん:2011/07/28(木) 16:47:50.02
shared_from_thisを使うか設計を見直す(オブザーバーの内部に参照カウントをもたせるなど)
288デフォルトの名無しさん:2011/07/29(金) 06:43:42.03
#include "GameLib/Framework.h"
unsigned char red,green,blue;
unsigned int color =(red<<16)|(green<<8)|blue;
namespace GameLib{
void Framework::update(){
unsigned int* vram = videoMemory();
red=0xff;
color=static_cast<unsigned int>(red);
vram[200*width()+100]=color;}}
>>280なんですが
 できなかったんでもう一度確認してもらえますか
289デフォルトの名無しさん:2011/07/29(金) 07:00:48.08
>color=static_cast<unsigned int>(red);
この時に勝手にビットシフトがかかると思ってるのか?
290デフォルトの名無しさん:2011/07/29(金) 07:28:00.23
>unsigned int color =(red<<16)|(green<<8)|blue;
>red=0xff;
>color=static_cast<unsigned int>(red);

うわ、予想の遥か下を行く低空飛行で壁に激突しとるがなw
291デフォルトの名無しさん:2011/07/29(金) 10:10:57.98
面倒だから正解教えてしまおう。

unsigned int color =(static_cast<unsigned int>(red)<<16)|(static_cast<unsigned int>(green)<<8)|static_cast<unsigned int>(blue);

携帯からだからtypoあるかも
292デフォルトの名無しさん:2011/07/29(金) 10:15:25.74
>>289
将来、リアクティブプログラミングが可能になれば有り、かも。
293デフォルトの名無しさん:2011/07/29(金) 12:23:33.58
関数型言語とかのほうから来た人なのかな。
colorが他の変数の参照をキャプチャして遅延評価されるなにかなら最初に考えてたコードで思ったとおりに動いたんだろうけどな。
294 忍法帖【Lv=34,xxxPT】 :2011/07/29(金) 12:47:37.80
これでいいよ、もう。
ttp://ideone.com/Za803
295デフォルトの名無しさん:2011/07/29(金) 13:21:15.25
原始的にこれで
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
unsigned char red(0),green(0),blue(0);
#define color static_cast<unsigned int>(((red)<<16)|((green)<<8)|(blue))
red=0xff;
cout << setbase(16) << color << endl;
}
296デフォルトの名無しさん:2011/07/29(金) 17:40:42.45
func(bool b) { if(b) { TRUE } else { FALSE } }
funcT() { TRUE }
funcF() { FALSE }
この場合、TRUEとFALSEの処理をインライン化させたいなら
普通にfunc(boolean)と呼ぶよりboolean ? funcT() : funcF()とした方が良いですか?
297デフォルトの名無しさん:2011/07/29(金) 17:43:45.47
inline付ければいいんじゃね
298デフォルトの名無しさん:2011/07/29(金) 17:46:09.19
それくらいわかってますしそういう問題じゃないです
299デフォルトの名無しさん:2011/07/29(金) 17:47:36.76
funcT、funcFは別にfuncを経由しなくても呼べちゃうけどそれはいいの?
300デフォルトの名無しさん:2011/07/29(金) 17:51:05.39
>>299
boolで分けたのは例え話なので、そういうところは考慮してないです
301デフォルトの名無しさん:2011/07/29(金) 17:52:51.72
>>300
trueの処理とfalseの処理を他で使いまわすつもりがないなら前者で
302デフォルトの名無しさん:2011/07/29(金) 21:08:26.66
>>296
>func(bool b) { if(b) { TRUE } else { FALSE } }
なんでfunc()からfuncT()やfuncT()を呼ばないの?
303デフォルトの名無しさん:2011/07/29(金) 21:15:27.12
例え話に突っ込んでどうするの?
304デフォルトの名無しさん:2011/07/29(金) 21:39:11.05
どうしてもインライン化したいなら書き方によるコンパイラの微妙な振る舞いの差に頼るのではなく
処理系依存の強制インライン化キーワードでも使うべきなのでは?
305デフォルトの名無しさん:2011/07/29(金) 22:52:15.80
つーか、ただ単に if と ?: の性能差が聞きたいだけじゃないのか?
306デフォルトの名無しさん:2011/07/29(金) 23:09:43.74
template についての相談というか質問なんですが
なぜ、ヘッダーファイルに書かなければならないのでしょうか?
理由を教えてください。
307デフォルトの名無しさん:2011/07/29(金) 23:35:07.07
VC++のフォームアプリケーションで
アラームつき時計つくりたいんだが
textBoxに入れた時間(アラーム時刻)と
現在時刻を合わせるのに苦労してるんだが
textBoxに入れた時刻を数値にフォーマットするにはどうしたらよいものか
308デフォルトの名無しさん:2011/07/29(金) 23:45:42.37
>>307
mktime(), strftime()
309デフォルトの名無しさん:2011/07/30(土) 01:20:28.78
>>306
別にヘッダファイルに書かなければならないというわけではないが、
とりあえず(厳密な説明ではないが)以下を理解しな。
・templateはインスタンス化してクラス定義や関数定義を生成するためのもの。
・templateをインスタンス化するにはtemplateの定義が必要。
・templateのインスタンス化はコンパイル時に行われる。
・コンパイル時にコンパイラが参照できるのはコンパイル中のソースとそこにincludeされたソースだけ。

そのうえで考えてみな。
複数のソースで利用される汎用的なtemplateの定義はどこに置いてどのように利用するのが自然で使いやすい方法か?
310デフォルトの名無しさん:2011/07/30(土) 01:30:20.79
http://www.twitlonger.com/show/c1dqum
フジテレビ内部者からの告発

フジテレビは内部で戦っています。
ホリエモン買収対応で、ソフトバンク系SBIに助けてもらったので、朝鮮系グループが
経営側でチカラを出してきましたが、報道部はサンケイ新聞とともに、朝鮮系グループに
喧嘩を売って戦ってます

どうかみなさんの応援で助けて下さい。
朝鮮系グループのしつこさとえげつなさには、正攻法では戦えないです。

テレビ側が言うのはおかしですが、ネットで話を盛り上げて助けて下さい。
盛り上がれば多くの芸能時の人の耳にも入り、さらに話が大きくなると思います。

日本のメディアは瀕死状態です。 助けて下さい。行動を起こして下さい。

応援お願いします。
311デフォルトの名無しさん:2011/07/30(土) 16:28:26.69
>>309
>>306です、なんとなく分かった感じthx
312デフォルトの名無しさん:2011/07/30(土) 16:45:55.76
オーバーフローするとバグるけど
オーバーフローするには何万年とかかかる
みたいな場合でもオーバーフロー検知と対応コードを書くべき?
313デフォルトの名無しさん:2011/07/30(土) 16:50:33.60
いつ、どんな使われ方をされるか分からないのなら、書いておけ。
「2000年まで使われることはない」という思い込みでY2Kは起きた。
314デフォルトの名無しさん:2011/07/30(土) 16:53:37.27
>>312
書かない理由が説明できないなら、書くべき。
説明できるならコメントで添えておくべき。
315デフォルトの名無しさん:2011/07/30(土) 17:51:15.42
エラー等の通知を行う際、例外と戻り値ではどちらが良いでしょう?
出来れば理由もお願いします
316デフォルトの名無しさん:2011/07/30(土) 17:52:59.06
292471210647年問題かw
某大学院で「正義とは本質的に何か」って授業やってたのと似てるな
317デフォルトの名無しさん:2011/07/30(土) 17:55:57.16
>>315
返り値
そんなこと聞くような奴はそうしといたほうがいい
例外安全というものがあって、その辺を理解せずに適当にぶん投げるとろくなことにならない
318デフォルトの名無しさん:2011/07/30(土) 18:03:20.38
>>317
例外安全って言葉知りませんでした。
戻り値にしときます
319デフォルトの名無しさん:2011/07/30(土) 18:27:15.87
フジテレビ「ミトカナイトフジ!」 コメント
ttp://www.youtube.com/fujitv

misuzukaru1982 (1分前)
俺「冷やし韓国ってなんですか」
蛆「特別企画で製作したものです」
俺「あのランキングはなんですか?」
蛆「あれは区切りです。ランキングではございません」
俺「え?思いっきり"人気ナンバーone"って言ってたじゃない ですか!?」
蛆「番組の区切りの数字です。それ以上はお答えできません。」
俺「はあ?明らかにランキングを捏造したものでしょ?」?
蛆「お答えしておりません。」
この一点張り。
そこまで公共の電波使って韓国持ち上げる意味が分からん


冷やし韓国一位
ttp://blog-imgs-34-origin.fc2.com/n/e/w/news020/873487.jpg

順位つけてるのに番組の区切りの数字とかwwそれってフジの番組のランキングは
すべて区切りって認識されてもいいって事だろwバカスww
320312:2011/07/30(土) 19:16:35.97
いまのCPUで何万年でも未来のCPUでは現実的な速度で終わるかもしれない
ということで例外処理書くことにしました。まる
321デフォルトの名無しさん:2011/07/30(土) 21:39:48.66
>>315
例外のほうが良いよ。
戻り値は戻り値に使えないと嫌でしょ。
使うときにいちいち分岐書かないといけないし。
322デフォルトの名無しさん:2011/07/30(土) 21:56:01.99
>>318
例外安全性を壊さずに例外を使うという発想は無いのか?
323デフォルトの名無しさん:2011/07/30(土) 23:53:04.81
>>321
そんな気がして、「例外」を使ってみようかと思いました。

>>322
否定されたから、やめとこうかなと…
調べてみたけど、例外安全ってのを考慮するようなプログラムでもない。
324デフォルトの名無しさん:2011/07/30(土) 23:54:45.92
googleスタイルだと例外禁止してるみたい。
ゲーム用途でも例外使ってない所が多い。
325デフォルトの名無しさん:2011/07/31(日) 00:03:56.04
禿さまご乱心の特にひどいところだからな
326デフォルトの名無しさん:2011/07/31(日) 00:36:14.23
>>325 なんかやらかしたの?
327デフォルトの名無しさん:2011/07/31(日) 06:45:25.27
finallyつけろ つけなさい つけてくれ
328デフォルトの名無しさん:2011/07/31(日) 06:53:40.18
だが断る!!
329デフォルトの名無しさん:2011/07/31(日) 10:14:24.04
ゲームだが例外とRTTIは外してたな
重く遅くなるから
組み込みもそうなんじゃね
だが局所的に例外使いたいシーンがでてくる
そんなときはwhileとフラグとマクロで疑似例外
330デフォルトの名無しさん:2011/07/31(日) 11:45:41.92
RTTIはともかく例外ってそんな遅くなるのか?
tryブロック入るのと出る時のオーバーヘッドぐらいじゃねーのか
ループ内じゃなくて外に置けば問題ないとおもうが
331デフォルトの名無しさん:2011/07/31(日) 11:54:39.62
参考

>そこで、ゲームエンジンでの構造化例外処理を完全に無効にすることには強力な論拠がある。
>これはノーティドッグで採用されているもので、エレクトロニック・アーツやミッドウェイで私が従事していた
>ほとんどのプロジェクトでも使った方法である。ゲーム機の限られたメモリや処理能力を考えると、
>ゲーム機で動作するゲームエンジンでは、SEHは決して使うべきではないだろう。
>しかし、パーソナルコンピュータ上で実行されることを想定したゲームエンジンであれば、
>何の問題もなくSEHを使えるかもしれない。
>ゲームエンジン・アーキテクチャ ジェイソン・グレゴリー著
332デフォルトの名無しさん:2011/07/31(日) 12:06:46.43
>>331
「誰が言ったか」じゃなくて「なんでそうなるのか」を示さないとなんの説明にもならないよ
そのレスからじゃジェイソンが例外アレルギーってことしかわからないよ

333デフォルトの名無しさん:2011/07/31(日) 12:17:47.69
>>332
この後にその論拠となるURLがいくつか紹介されてるんだけど書くのめんどくさくなった。
334デフォルトの名無しさん:2011/07/31(日) 12:31:12.69
#include<iostream>
using namespace std;
int main()
{
char word[20]="Hello";
cout << &word[0] << endl;
}

word[0]のアドレスを表示しようと上のプログラムを書いたのですが、「Hello」と出力されました。
word[0]のアドレスを表示するためにはどうしたらいいのでしょうか。
335デフォルトの名無しさん:2011/07/31(日) 12:40:19.85
cout << (void*)word << endl;
336デフォルトの名無しさん:2011/07/31(日) 12:40:46.54
std::hex
337デフォルトの名無しさん:2011/07/31(日) 12:46:08.93
>>335
できました。ありがとうございます。
338デフォルトの名無しさん:2011/07/31(日) 16:51:03.48
>>331
Windows の SEH と C++ 例外がごっちゃになってるようなのも怪しいな。
339デフォルトの名無しさん:2011/07/31(日) 17:07:33.39
>>329-330
C++ Exception Handling and Performance
http://lazarenko.me/tips-and-tricks/c-exception-handling-and-performance
↓日本語訳
C++ の例外ハンドリングとパフォーマンス
http://zakkas783.tumblr.com/post/3870295160/c
340デフォルトの名無しさん:2011/07/31(日) 17:36:54.35
なんだ例外のほうが速いのか
341デフォルトの名無しさん:2011/07/31(日) 19:11:43.19
>>271 の「予定じゃ来年」ってどこ情報なの?
ちょっと探した感じだと今のところは今年の予定みたいなんだけど。

禿情報
http://www2.research.att.com/~bs/C++0xFAQ.html#when-standard
髭情報
http://herbsutter.com/2011/03/25/we-have-fdis-trip-report-march-2011-c-standards-meeting/
342デフォルトの名無しさん:2011/07/31(日) 20:17:15.45
>>205とかを釣ろうとしたんじゃね
まあiso.orgには来年2月とかあるからそっちの話かもしれないけど
343デフォルトの名無しさん:2011/07/31(日) 22:11:47.56
コンテナを拡張メンバ関数で拡張しようとしたとき、コンテナの中身に依存してる場合
it=array|find_name<A*>("test");を
array|find_name("test");にする上手い方法無い?

std::vectorを継承しろは禁止で。
一回作っちまえばvectorを継承するより使いやすそうなので

http://codepad.org/w2fsi44V
344デフォルトの名無しさん:2011/07/31(日) 23:18:30.70
やりたかった事とはチョット違うかもだけど
ttp://ideone.com/pCkID
345デフォルトの名無しさん:2011/08/01(月) 00:05:46.86
http://codepad.org/KRIjAhrL
これでいい
vector以外にも使える
346デフォルトの名無しさん:2011/08/01(月) 01:25:43.62
int x,y=0;
こういう初期化の仕方するとエラーになるので
int x,y;x=0;y=0;こういった書き方しているんですが
まとめて変数を初期化するやり方教えてください
347デフォルトの名無しさん:2011/08/01(月) 01:35:01.66
x=y=0;
348デフォルトの名無しさん:2011/08/01(月) 02:00:55.41
int x=0,y=0; じゃないの?
349デフォルトの名無しさん:2011/08/01(月) 02:15:08.03
初期化なら>>348。初期化せずに int x,y; 後で>>347もありだけど>>347は初期化じゃなく代入。
350343:2011/08/01(月) 03:26:43.28
ttp://codepad.org/Ojn0KkJB

もうだみだ。よくわからねーーーーー
コンパイル通らないorz
テンプレート死ね

テンプレートの特殊化とかADLとかわけわからん
この場合特殊化でいけると思っていろいろやったがいまいち書き方がよくわからん
351デフォルトの名無しさん:2011/08/01(月) 07:18:16.48
拡張メンバの利点が解らない
352デフォルトの名無しさん:2011/08/01(月) 07:49:26.45
>>350
日本語は下手じゃないけど礼の概念が存在しない民族が、よく分からないのに改造するからだろwww
353デフォルトの名無しさん:2011/08/01(月) 16:39:56.17
>>350
ttp://codepad.org/ikWh8Kd0
ただのサブルーチンで事足りるのに、わざわざ分かりにくくしているって感じ
354デフォルトの名無しさん:2011/08/01(月) 18:31:19.00
>>353
まさしくそれだ。ありがとうございます。
result_ofにこだわりすぎて、混乱してた。

ちなみにC++テンプレートテクニックという本を参考にしてました。

>>352
いやすみません。言い訳させてもらうといろいろ書いてたの消して
眠かったんです。

今さらですが>>344-345レスサンクスです。

355デフォルトの名無しさん:2011/08/01(月) 18:34:50.96
>>351
拡張メンバ関数の利点
・一回作れば、再利用しやすいと思う
・何となく見た目がいい。関数に突っ込むよりもメンバー関数として持ちたい。
・タイプが少ない、find_ifとかstd::for_eachとかめんどい
・myvectorをprotected継承やhas std::vectorの設計で作った場合、myvector is not std::vectorなので func(std::vecor) みたいな関数に放り込めないので再利用しにくい
・通常の継承にした場合、使い方次第では解放漏れの恐れがある
std::vectorのデストラクタにvirtual着いてないから
356デフォルトの名無しさん:2011/08/01(月) 20:27:24.03
>>355
> ・何となく見た目がいい。関数に突っ込むよりもメンバー関数として持ちたい。
へルパー関数(find_name(array,"test")とか)と比較したときの利点はこれだけだな。
それも
・演算子のどれかを標準的な意味とは異なる意味でオーバーロードするのでぱっと見で誤解と混乱を招く。
という欠点とのトレードオフだ。
357デフォルトの名無しさん:2011/08/02(火) 01:17:45.79
templateでポリモーフィックな型かどうか判別する方法はありますか?
dynamic_castが使えない型にはstatic_castを実行したいのですが、
判別方法が分からず困っています。

やりたい事は↓みたいな事です。

template <bool> void* foo() { return dynamic_cast<void*>(p); }
template <> void* foo<false>() { return static_cast<void*>(p); }

template <typename T>
void* bar(T* p)
{
  return foo<IsPolymorphic::RESULT>(p);
}
358デフォルトの名無しさん:2011/08/02(火) 01:35:20.23
359デフォルトの名無しさん:2011/08/02(火) 01:46:41.95
>>357
Boostか0xのis_polymorphic
360デフォルトの名無しさん:2011/08/02(火) 02:04:47.56
>>358,359
そのものずばりなクラスがあったのですね。
全く気がつきませんでした。ありがとうございました。
361デフォルトの名無しさん:2011/08/03(水) 10:42:00.01
シングルトンのインスタンスはポインタと参照どっちを返すのがいいですか
362デフォルトの名無しさん:2011/08/03(水) 11:04:58.86
普通は参照ですね
363デフォルトの名無しさん:2011/08/03(水) 11:41:41.20
メモリー管理をクラス任せにするとメモリー消費は大きいが
自分でやれば節約になる。
364デフォルトの名無しさん:2011/08/03(水) 12:40:03.62
誤爆?
365デフォルトの名無しさん:2011/08/03(水) 12:49:20.83
メモリーの盗用と借用の違いだよ。
366デフォルトの名無しさん:2011/08/03(水) 12:56:26.85
聞かれてもいないのに何語っちゃってんの
367デフォルトの名無しさん:2011/08/03(水) 13:09:54.25
誤爆って聞いたからその答えがこれだろ。
何もかんでも一から説明するほど行数はないのでな。
368デフォルトの名無しさん:2011/08/03(水) 13:16:15.73
もしかして>>363>>365って>>361宛?
369デフォルトの名無しさん:2011/08/03(水) 13:19:30.70
>>367
いや……そもそも>>363を語りだしたのはなんでだ?w
370デフォルトの名無しさん:2011/08/03(水) 13:21:49.42
アホはスルーしましょうよ
371デフォルトの名無しさん:2011/08/03(水) 16:25:45.77
行間を読むということのできない池沼が増えましたね。
まあ一生そういった書物には縁の無い人たちでしょうが・・・(笑
372デフォルトの名無しさん:2011/08/03(水) 20:28:51.15
速度効率はいいとして空間効率ってどうやって上げてんの?
373デフォルトの名無しさん:2011/08/04(木) 00:54:02.60
>>363
誤爆かどうかは別にしても、意味が分からんのだが。
メモリー管理を自分でやることによって節約になるっていうのは、どういう状況なの?
何が節約できるの?
374デフォルトの名無しさん:2011/08/04(木) 02:30:31.62
>>373
>>363はたまにC++関連スレに出てくるアンチRAIIの人じゃないかと思える
リソース管理クラスに任せっきりだと不要になったリソースをブロックを抜けるまで無駄に保持し続けるけど
自分で不要になった時点ですぐ解放するように管理すればそういう無駄が出ないってことじゃないだろうか
375デフォルトの名無しさん:2011/08/04(木) 02:34:42.26
Q1. >>364:誤爆?

A1. >>365:メモリーの盗用と借用の違いだよ。

Q2. >>369:いや……そもそも>>363を語りだしたのはなんでだ?w

A2.
376デフォルトの名無しさん:2011/08/04(木) 10:15:20.25
>>374
RAIIは解放忘れに対しては安全かもしれないけど自由度が低いのが問題
いつも同じ解放の仕方をしたいとは限らないからクラスに解放処理を埋め込むのは良くない
377デフォルトの名無しさん:2011/08/04(木) 10:22:54.53
>>376 それて、たとえばどんなの?
378デフォルトの名無しさん:2011/08/04(木) 10:26:26.11
>>377
普通に作業してりゃ例を挙げるまでもなく随所で見ることができる問題だろ
むしろRAIIで全て完全に無駄なコストなくスマートに解決できたプロジェクトなんてものがあるなら教えてくれ
379デフォルトの名無しさん:2011/08/04(木) 10:29:00.81
99%のリソースはデストラクタで解放するようにしてるけど
それで問題が出たことなんてないんだけど
問題出ないようにそうしてるんだし
380デフォルトの名無しさん:2011/08/04(木) 10:35:31.68
共有/非共有、エラー処理、etc
これらをオブジェクト単位、あるいは文脈ごとに
切り替えたいまたは新しい処理を追加したい
って要求はどうやって解決してんの?
381デフォルトの名無しさん:2011/08/04(木) 10:36:06.20
>>378
ごめんわかんない。
とりあえず一個でもいいから、例を見せて。
382デフォルトの名無しさん:2011/08/04(木) 11:03:25.71
RAIIのとかを進める外人のやつはC++でJAVAを再現しようとする間違った考えの持ち主で
アメリカ人の無能さを前提に考えているからであって手先の器用な日本人にはあわない。
日本の狭い道路をでアメ車に乗って走るようなもの。
翻訳本にばっか頼ってるからこういう間違った考え方がひろがるんだよ。
383デフォルトの名無しさん:2011/08/04(木) 11:06:04.74
わけがわからないよ
384デフォルトの名無しさん:2011/08/04(木) 11:17:00.01
それは勉強不足なのでは?
385デフォルトの名無しさん:2011/08/04(木) 11:26:10.21
>>382
ぱねぇwwwwwwww
386デフォルトの名無しさん:2011/08/04(木) 11:26:23.03
RAII使って素直に設計しろよ
387デフォルトの名無しさん:2011/08/04(木) 11:38:49.70
解放に失敗したときの例外処理どーすんの?っと
388デフォルトの名無しさん:2011/08/04(木) 11:44:08.38
重要なことだから何度も言うけど、
大雑把で適当なアメリカ人にはどうしても必要なものであるが
繊細で見えない所まで拘りを持つ日本人には逆に厄介なものになる。
389デフォルトの名無しさん:2011/08/04(木) 11:48:12.22
>>380に回答ください
390デフォルトの名無しさん:2011/08/04(木) 11:49:09.88
用途別のRAIIオブジェクトを使えよ
391デフォルトの名無しさん:2011/08/04(木) 11:49:44.23
RAIIを使わない理由になってないよな
392デフォルトの名無しさん:2011/08/04(木) 11:51:13.57
>>387に回答ください
393デフォルトの名無しさん:2011/08/04(木) 11:52:57.87
オブジェクト指向は紙の上でだけでやっておけば良いんだよ。
オブジェクト指向は不必要と入ってないよ。
オブジェクト指向に踊らされるのはよくないといってるの。
394デフォルトの名無しさん:2011/08/04(木) 11:57:03.39
デストラクタでエラー出たら死ぬやん
揉み潰すのは苦肉の策って感じでスマートじゃないし
放置なんてしたら即解雇、リトライループにはまったらユーザーを怒らせるだけ
RAIIは永遠にこの問題を解決することができない
だからリソースは安全なポイントでまとめて手動で返すのが常道
395デフォルトの名無しさん:2011/08/04(木) 11:59:06.52
アメリカ人にとってはそれ以上にメリットの方が大きく感じるほどプログラマーの質が低いのだろうな。
396デフォルトの名無しさん:2011/08/04(木) 12:00:33.74
結局C言語だけで良かったんにゃ
397デフォルトの名無しさん:2011/08/04(木) 12:00:55.53
失敗するなら手動で解放する
失敗しないならデストラクタで解放する
これだけのことじゃないのか
398デフォルトの名無しさん:2011/08/04(木) 12:02:14.50
>>390
オブジェクトごとにRAIIobj持たせようとしたらテンプレートか動的削除子になるが
いつも要るわけじゃない機能にコストを払うぐらいならマネージャで管理させたほうがいい
399デフォルトの名無しさん:2011/08/04(木) 12:04:59.80
>>394
破棄処理でエラーの出る困ったリソースについては、デストラクタじゃなくて
明示的な破棄処理を提供すればいい。

そういうケースがあるとしても、それとは別に RAII が問題なく適用できる場面が
多くあるのだから、全部ひっくるめて「間違っている」とか「良くない」とかいう話に
するのはおかしい。
400デフォルトの名無しさん:2011/08/04(木) 12:10:04.18
>>398
特殊な用途を持ち出しても RAII 一般を批判する根拠にはならないよ。
401デフォルトの名無しさん:2011/08/04(木) 12:13:39.31
ちょっと言い方が悪かった
日本人でA型で長男にはRAIIは必要ない。
日本人でB型で次男には特に必要。
402デフォルトの名無しさん:2011/08/04(木) 12:14:59.40
>>401
お前はもういいよ
403デフォルトの名無しさん:2011/08/04(木) 12:18:13.02
RAIIは安全のために実行効率と柔軟性を犠牲にしてるから結局宗教論争に帰着するんだよね
使うべきところで使って使うべきでないところでは使わない以上の議論は無駄
そういう意味でRAII全否定とか99%RAIIですがなにか(キリッ)みたいな偏った人はちょっと頭固すぎだなと思う
404デフォルトの名無しさん:2011/08/04(木) 12:18:38.53
そういえば夏だったな
405デフォルトの名無しさん:2011/08/04(木) 12:19:28.57
もう夏か厨が現れると夏を実感するね
406デフォルトの名無しさん:2011/08/04(木) 12:19:48.56
>>394
それはRAIIの問題ではなくリソースの性質から来る問題なので
RAIIを使わなくても問題になるしRAIIを使わなければ自動的に解決されるわけでもない。
407デフォルトの名無しさん:2011/08/04(木) 12:24:31.72
要はRAII不要と言ってる奴が、一番RAIIに不当に高い評価をしているでFAだな
テクニックなんだから向かない場面で使わないのは当たり前
408デフォルトの名無しさん:2011/08/04(木) 12:25:07.65
実行効率はともかく、エラー処理はデストラクタから例外投げられれば済む話だった
もう言っても仕方ないことだけど
409デフォルトの名無しさん:2011/08/04(木) 12:25:34.70
結局クラスに解放処理を組み込むのがよくない理由はなんだったの?
410デフォルトの名無しさん:2011/08/04(木) 12:29:29.21
RAIIの型に解放メンバ関数を追加しても何も問題ない

リソースを取得するメンバ関数を追加するのはダメだけどな。少なくともRAIIではなくなる
411デフォルトの名無しさん:2011/08/04(木) 12:30:47.15
412デフォルトの名無しさん:2011/08/04(木) 12:35:58.34
413デフォルトの名無しさん:2011/08/04(木) 12:40:38.60
デストラクタ内で何が何でもケリをつけねば!みたいな脅迫観念があるのかなぁ。
ただのシーケンスでしかないのに。
無理なもんはどう書こうが無理なのに。
414デフォルトの名無しさん:2011/08/04(木) 12:41:07.29
真面目な話、みんなメモリ管理以外にRAII使ってる?
415デフォルトの名無しさん:2011/08/04(木) 12:46:19.17
オブジェクトがリソースの確保解放を請け負うなんて馬鹿なクラスじゃ
ループ中はもうそのクラス使えないなwww使ったら遅すぎて苦情が来るぞ
416デフォルトの名無しさん:2011/08/04(木) 12:47:41.60
実測したの?
417デフォルトの名無しさん:2011/08/04(木) 12:48:34.75
魚おおおおおおおおおおおおおおおおおおおおおおおおおお
418デフォルトの名無しさん:2011/08/04(木) 12:49:19.51
>>408
そんなことを言う奴は、デストラクタが例外を投げる型に対応した
uninitialized_copy() を設計・実装するの刑に処す。
419デフォルトの名無しさん:2011/08/04(木) 13:02:48.44
>>414
windowsでmutexの取得/解放に使ったことがある

>>415
ループの中で構築する必要があるならRAIIを使うか使わないかに関わらず構築コストはかかるでしょ
ループの中で構築する必要がないならRAIIの使用に関わらずループの外で構築すればいい。構築済のオブジェクトを使う分にはどちらも変わらないよ
420デフォルトの名無しさん:2011/08/04(木) 13:07:03.05
>>419
特定の処理前にどれだけのオブジェクトが必要かわかるならいいけどね
処理中に必要な数計算して動的に生成しなきゃだめなケースとか日常茶飯事だろ
それともそういうケースが絶対に存在しないものとして無視したクラス設計にするわけ?
421デフォルトの名無しさん:2011/08/04(木) 13:08:33.89
RAII信者は理想論者。現実が見えてない
422デフォルトの名無しさん:2011/08/04(木) 13:15:09.61
>>420
つまり前者ね
423デフォルトの名無しさん:2011/08/04(木) 13:16:04.88
それ設計が悪いんじゃね・・・
424デフォルトの名無しさん:2011/08/04(木) 13:24:22.42
>>420
RAII を使うと「処理中に必要な数計算して動的に生成しなきゃだめなケース」で困るってこと?
さっぱり状況が見えてこないんだが。
425デフォルトの名無しさん:2011/08/04(木) 13:35:49.38
もう釣りってことでいいんじゃね?
まともなことひとつも言ってないし
426デフォルトの名無しさん:2011/08/04(木) 15:58:08.80
パフォーマンスの悪化と無駄なエラーの可能性を生じさせる点でRAIIは出来損ない
バカのための安全装置としてはシンプルで効果も見込める点で優秀



427デフォルトの名無しさん:2011/08/04(木) 16:07:03.86
ってバカは言ってたよ
428デフォルトの名無しさん:2011/08/04(木) 16:08:18.04
ってバカは言ってたよ
429デフォルトの名無しさん:2011/08/04(木) 16:14:37.30
RAIIはエラー検知がめんどくさいのがやだわ
返り値も無いし例外も投げれないから、グローバルなエラーログみたいなスマートじゃない方法で調べなければならない
430デフォルトの名無しさん:2011/08/04(木) 16:30:30.66
RAIIって問題だらけだったんですね
勉強になりました
431デフォルトの名無しさん:2011/08/04(木) 19:22:12.29
std::vector の値をstd::map のsecond に代入するスマートな方法を教えてください
432デフォルトの名無しさん:2011/08/04(木) 19:27:04.08
>>431
スマートな = 1行で
ってこと?
433デフォルトの名無しさん:2011/08/04(木) 19:27:45.30
リソース管理の話題だったら、ファクトリの話もしてほしいな
434デフォルトの名無しさん:2011/08/04(木) 19:31:22.08
>>431 です
>>432
1行でなくても全然OK です
algorithm や for_each とかcopy を使った方法を教えてください
兎に角for やwhile を使わない方法であればcool です
435デフォルトの名無しさん:2011/08/04(木) 19:38:23.37
>>434 です
関数オブジェクトでやる方法が知りたいです
436デフォルトの名無しさん:2011/08/04(木) 19:59:02.90
vectorの要素それぞれをmapのsecondに入れたいってことかな
各要素のfirstはどうするの?
437デフォルトの名無しさん:2011/08/04(木) 20:03:28.34
438デフォルトの名無しさん:2011/08/04(木) 20:17:32.75
>>437
それってboost ですよね?boostは別にかまわないんですけど、関数オブジェクト勉強したくて
聞きたかったんです。
>>436そのとおりです
あらかじめmapコンテナにデータは入っていて、secondのデータを入れ替えたいのです
439デフォルトの名無しさん:2011/08/04(木) 21:35:18.78
>>438
boostを使うということは>>434の理に適うと思うのだけど
STLでなければならないなら始めからそう言えばいいのに
440デフォルトの名無しさん:2011/08/04(木) 21:50:48.34
>>439
すんません
441デフォルトの名無しさん:2011/08/04(木) 21:58:17.33
coolじゃない関数オブジェクトを自分で書いたらいいと思うよ
使うところだけを見ればきっとcoolだよ
442デフォルトの名無しさん:2011/08/05(金) 01:33:23.03
>>430 最初からこう書いとけば黙って消えてくれたのか。次の機会に覚えてたらこうしよう。
443デフォルトの名無しさん:2011/08/05(金) 01:40:04.64
初歩的なことかもしれませんが他人のソースでこんな記述を見つけました
unsigned short b:2;
で、これはただ単に2ビットだけの数値として扱っていることは理解したのですが、
この2ビットだけの数値で配列を作ることは可能でしょうか?
444デフォルトの名無しさん:2011/08/05(金) 01:44:52.61
無理
445デフォルトの名無しさん:2011/08/05(金) 02:02:28.25
ビットフィールドはアドレス取れないのと配列がポインタ互換なのがあわさって配列にはできないんだよな
446デフォルトの名無しさん:2011/08/05(金) 03:15:51.77
>>443
できた。
struct _2bits { unsigned int b:2; };
_2bits array[10];
447デフォルトの名無しさん:2011/08/05(金) 07:15:26.30
それは、構造体の配列。
448デフォルトの名無しさん:2011/08/05(金) 20:32:13.96
クラスのインスタンスが作られるとき、コンストラクタに無効な引数が入ってきた場合、
コンストラクタ内でデストラクタを呼び出してインスタンスを破棄する、ってアリ?
449デフォルトの名無しさん:2011/08/05(金) 20:33:23.13
無しに決まってんだろ
例外出せよ
450デフォルトの名無しさん:2011/08/06(土) 02:33:33.29
>>448
Foo::Foo( int arg ) { // コンストラクタ
 int* p = new int [100]; // ← もし直接newで確保した場合、これは片付ける必要がある
 if (arg == invalid) {
  delete [] p; // 解放してから
  throw std::invalid_argument("blah blah"); // 例外を投げる
 }
 ...
}
生newではなくてコンテナやスマポを使えば例外スタック巻き戻しで解放してくれる
451デフォルトの名無しさん:2011/08/06(土) 02:40:12.46
ちょいと関連するネタ

More C++ Idioms/生成の追跡(Construction Tracker)
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E7%94%9F%E6%88%90%E3%81%AE%E8%BF%BD%E8%B7%A1(Construction_Tracker)
452デフォルトの名無しさん:2011/08/06(土) 02:41:59.44
えーマジ生ポ?
キーモーイ
生ポが許されるのは小学生までだよね
きゃははは

Foo::Foo(int arg)
try : p() {
 this->p = new int[arg];
}
catch(...) {
 delete this->p; // 漢ならfunction try-catchで後始末だぜ
}
453デフォルトの名無しさん:2011/08/06(土) 02:51:47.82
//安全が保障されるまでメンバにストアすらしない漢気
Foo::Foo(int arg, int *dummy=NULL)
try : p() {
 dummy = new int[arg];
 this->p = dummy;
}
catch(...) {
 delete dummy;
}
454デフォルトの名無しさん:2011/08/06(土) 03:26:32.31
>>452
15.3 p10
"Referring to any non-static member or base class of an object in the handler for a
function-try-block of a constructor or destructor for that object results in undefined behavior."
455デフォルトの名無しさん:2011/08/06(土) 07:33:50.43
だから仕様にfinally追加しろって言ってんだろおおおおお!!!!!!
456デフォルトの名無しさん:2011/08/06(土) 11:26:43.69
動的配列が必要ならvectorで。
457デフォルトの名無しさん:2011/08/06(土) 11:28:49.36
>>456
動的配列を戻り値で返したい場合はどうしますか?
458デフォルトの名無しさん:2011/08/06(土) 14:27:43.69
次期C++ならMove semanticsがあるからvectorをそのまま返す
459デフォルトの名無しさん:2011/08/06(土) 15:50:57.86
どうせコピーコストが問題になるような現場じゃないから現行でもそのままでおk
460デフォルトの名無しさん:2011/08/06(土) 18:44:06.44
次期は知ってるのですが、vectorに大きなデータを入れたい場合も
あるじゃないですか。1998年規格にauto_ptrがあってそれの配列版が
無いというのは、どういう設計なんだろと思いまして。
461デフォルトの名無しさん:2011/08/06(土) 18:48:53.46
>>61
おおぅ
ダメか・・・
462デフォルトの名無しさん:2011/08/06(土) 18:51:11.93
unique_ptrでおk
463デフォルトの名無しさん:2011/08/06(土) 19:06:43.89
この場合、hogeのインスタンスはリークしてますよね?
ttp://ideone.com/heeR5
464デフォルトの名無しさん:2011/08/06(土) 19:11:31.05
インスタンスはリークの意味が不明
465デフォルトの名無しさん:2011/08/06(土) 19:13:03.94
わかるだろあほ
466デフォルトの名無しさん:2011/08/06(土) 19:13:31.64
意味不明だよアホ
467デフォルトの名無しさん:2011/08/06(土) 19:13:45.95
コンストラクタで例外が投げられているのでデストラクタは呼ばれないが
newしたメモリは解放されます
468デフォルトの名無しさん:2011/08/06(土) 19:13:53.61
>>463
しないよ
469デフォルトの名無しさん:2011/08/06(土) 19:30:18.78
>>467-468
なるほど、ややこしいな。
ありがとう
470デフォルトの名無しさん:2011/08/06(土) 19:50:51.82
>>460
関数の引数を参照にして値をいれるオブジェクトを渡せばいい。
Cのころから(そのころはポインタやポインタへのポインタを引数にしてたけど)あるデザインだ。
(あくまでも返却値で返さなければならないならそれこそどういう設計なんだろ、だ)
471デフォルトの名無しさん:2011/08/06(土) 21:27:47.51
>>470
>返却値で返さなければならないならそれこそどういう設計なんだ
なんかの一覧を作成して返すってのは、普通じゃないの。
vectorの入れ物だけ渡してそこに値が詰められるって方がcrazyだとおもうけど
472デフォルトの名無しさん:2011/08/06(土) 21:43:42.63
>>470 がCの流儀から抜けられないだけだろ。
473デフォルトの名無しさん:2011/08/06(土) 21:43:54.06
クレイジーだぜぇ〜。この>>471はよぉ〜『常識が通じない』ってやつだぜ〜!
474デフォルトの名無しさん:2011/08/06(土) 21:54:02.68
>>467
メイン関数を抜けた時点でdeleteが呼ばれるんですよね?
なのにデストラクタは呼ばれないのですか?
475デフォルトの名無しさん:2011/08/06(土) 21:55:08.52
どうしても一時オブジェクトで返す必要があるかどうかってだけだろ
C の流儀から抜けたから何だっつの
476デフォルトの名無しさん:2011/08/06(土) 23:28:44.91
> vectorの入れ物だけ渡してそこに値が詰められるって方がcrazyだとおもうけど

> >>470 がCの流儀から抜けられないだけだろ。

iteratorを受け取る関数にiteratorかinserterを渡してコンテナに値を詰めてもらえ。
こういうiteratorを受けてその参照先に代入していく関数はC++でよくあるデザインだが
これはCのmemsetやmemcpy等のデザインと本質的に同じものだ。
477デフォルトの名無しさん:2011/08/06(土) 23:32:04.83
つーかmove用のオブジェクト作って代用すればいいじゃん
478デフォルトの名無しさん:2011/08/07(日) 00:03:38.65
>>476
ならオマエは文字値取得も↓こうやってるんだな?

void get_config(const string &key, back_insert_iterator<string> &item);
//設定値取得
string s;
get_config("item1", back_inserter(s));
s.clear();
get_config("item2", back_inserter(s));
479デフォルトの名無しさん:2011/08/07(日) 00:10:04.56
文盲が多いな。
>これはCのmemsetやmemcpy等のデザインと本質的に同じものだ。
auto_ptrの所有の概念でそのCから脱却したのに、
配列だけどうして標準クラスで簡単にできないのかという質問だろ。
参照を渡せとかinserter使えとかmove用作れとかは答えになってない。

標準委員会がお疲れだったんじゃね
480デフォルトの名無しさん:2011/08/07(日) 00:10:40.51
vector使えって禿が言ったから…
481デフォルトの名無しさん:2011/08/07(日) 00:17:34.63
確かに禿はvectorを使えと言っていたね。
vectorじゃauto_ptrの代わりにならないのに
482デフォルトの名無しさん:2011/08/07(日) 00:18:46.19
unique_ptr入ったからもういいじゃない
483デフォルトの名無しさん:2011/08/07(日) 00:31:22.56
初歩的な質問なんだけど、unique_ptr<int[]>って、どうやってサイズ取得するの?
484デフォルトの名無しさん:2011/08/07(日) 00:32:46.75
new[]したときに指定したんだから覚えてろよ
485デフォルトの名無しさん:2011/08/07(日) 00:46:00.30
>>478
流れ読まないで噛み付いてるから意味の通らない突っ込みになってないか。

その例で順序いらない・重複したら新しい設定で上書きならコンテナ決め打ちで
void get_config(map<string,string>& config, string const & rawtext);
でいいだろ。

順序いる・重複許可なら
template<class T> void get_config(T iter, string const & rawtext);
vector< pair<string,string> > v;
get_config(back_inserter(v), raw);
とかな。
486デフォルトの名無しさん:2011/08/07(日) 01:09:47.67
>>485
mapは関係ないんじゃ。一件の文字列値取得でしょ。Cでいう get_config(const char key[], char buf[], size_t buf_size); に対応するものが
>>476説では get_config(const string &key, back_insert_iterator<string> &buf) になるんだよね。
>>478はstringを例に配列も値として返したいと言っているんだろ。僕だったら string get_confg(strint const &key) にするね。
487デフォルトの名無しさん:2011/08/07(日) 01:16:10.56
>>486
解雇
488デフォルトの名無しさん:2011/08/07(日) 01:23:13.15
>>484
mjdsk!? じゃあ関数の戻り値に使えないね(´・ω・`)
489デフォルトの名無しさん:2011/08/07(日) 01:38:54.60
>>476>>470
> 関数の引数を参照にして値をいれるオブジェクトを渡せばいい。
に対する>>471,472の突っ込みに対する反論だろ。
その流れを>>478が理解せず>>476がオブジェクト本体の参照を渡すことはするなって言ってると思って突っ込んだのがずれてる。
490デフォルトの名無しさん:2011/08/07(日) 01:52:18.52
>>488
pairにでも一緒に突っ込めよ
491478:2011/08/07(日) 03:48:27.28
>>489
理解してないのはアンタじゃないの?
>>460 配列データを戻り値として返したい
>>470 戻り値は設計ミス。ポインタのポインタ(orポインタの参照)を使え。
>>471 データ取得なのだから戻り値で欲しい。受け取りvector(の参照)を渡すのは嫌だ
>>476 入れ物のinserterを渡せ
>>478 では、char配列の文字列が欲しい時も、受け取るためのinserterを渡すんだな

>>478(=俺)は「受け取りのための変数を渡すのが汚い」と言ってる。
vector本体の参照でもinserterでも同じこと。

ちなみに>>470は 用意したメモリに書き込むことを目的としたmemcpy/memsetの例を、
データを戻り値として欲しいという>>460の話に持ってくるのは変だと思う。
492デフォルトの名無しさん:2011/08/07(日) 03:57:55.62
>>490
汚いな。
0xのmove使わなきゃ簡単にできないんだね(´・ω・`)
493デフォルトの名無しさん:2011/08/07(日) 04:23:10.62
相談です。

>頻繁に動的にクラスインスタンスが生成破棄される

という場合、生成用の関数を用意してshared_ptrで管理するのか、
それとも管理用のインスタンスpoolを作って、そいつに管理させてIdで間接的に管理するのか、
どっちが良いのか迷ってます。

ケースバイケースかと思うのですが、
判断の基準になるようなものってありますか?
494デフォルトの名無しさん:2011/08/07(日) 10:02:43.29
個別での管理に迷いが生じるような状況なら逆に迷わずまとめて管理したほうがやりやすいよ。

いちおう判断基準になりそうなのはこのくらいかな?
・同時に存在するインスタンスの数:多い-まとめて管理、少ない-個別に管理
・時間当たりに生成・破棄されるインスタンスの数:多い-まとめて管理、少ない-個別に管理
・個々のインスタンスの使用範囲:プログラム全体-まとめて管理、生成した関数の内側だけ-個別に管理
・インスタンス群全体に対する操作(条件にあうインスタンスの検索とか):行う-まとめて管理、行わない-個別に管理
495デフォルトの名無しさん:2011/08/07(日) 13:35:13.80
>>493
え?
自分で書いてるとおり、個別のインスタンスへの参照を保持したいときは
shared_ptrで、IDで管理したいときはpoolじゃないか。
後から取得するときにshareするものを探したいならpoolが必要でしょ。
shared_ptr管理はshared_ptr所有側がインスタンスを管理する。
あなたの言うpoolはpoolが最終的にメモリを破棄する。好きにすれば
496デフォルトの名無しさん:2011/08/07(日) 15:41:35.73
>>493
ボトルネックでshared_ptrは最初から選択肢として無いわこれクソ遅いスマポとして有名だから
だからプールにするか、あるいはアロケータをカスタムする方が柔軟で無駄もなく将来性がある
497デフォルトの名無しさん:2011/08/07(日) 18:15:36.14
>>493
まず何を心配しているのか明らかにするべき。
対象が実行時間効率なのか空間効率なのかすらわからないようじゃ話にならない。

そしてターゲットがわかったらとりあえず素直なコードで書いて、対象について実測するべき。
実測もせずになんとなくで pool とか用意するのはよくない。
498デフォルトの名無しさん:2011/08/08(月) 00:30:13.31
>>493
>>頻繁に動的にクラスインスタンスが生成破棄される
にたいして、どうして
>という場合、生成用の関数を用意してshared_ptrで管理するのか、
なんだ?
頻繁に生成とshare/poolは関係なかろう
499493:2011/08/08(月) 01:18:55.20
ご指摘色々ありがとうございます。

一番気にしているのはコードの可読性で、
規模が大きくなったり、複数人で開発をするときの秩序を求めてます。
linux,android,iphone,windows で利用される可能性があります。
品質が上がるなら、速度はよほどの事が無い限り犠牲にしても構いません。

shared_ptr() を用いる方法(インスタンスを利用コード側で管理する方法)は、
その場しのぎでさっさと解決するには良かったのですが、
長期的に見るとインスタンス生成破棄タイミングが散らばって、
バグを生みやすいかなぁと漠然と感じまして…。
pool形式なら、メモリ再利用もできるなぁなどと、色々思いを馳せておりました。

速度面でもpool方式の方が良さそうですね、こちらの方針で行ってみようと思います。
ありがとうございました!
500デフォルトの名無しさん:2011/08/08(月) 01:19:51.27
ぶっちゃけるとアロケーター作っておしまい
501493:2011/08/08(月) 01:35:01.13
>>496,500
アロケーターは難度高そう。勉強してみます…
502デフォルトの名無しさん:2011/08/08(月) 01:59:27.37
boostにpoolアロケータがあったと思う
503デフォルトの名無しさん:2011/08/08(月) 07:25:45.74
>>499
>一番気にしているのはコードの可読性で
んなこたー>>497以外わかってる
504デフォルトの名無しさん:2011/08/09(火) 11:03:02.20
1. 処理なしの仮想デストラクタ
 virtual ~Hoge() {}

2. 純粋仮想デストラクタ
 virtual ~Hoge() = NULL;
 ...
 Hoge::~Hoge() {}

この2つの違いって何?
メリットとデメリットを教えて欲しい
505デフォルトの名無しさん:2011/08/09(火) 11:11:06.24
>>504
まず、純粋仮想関数の定義に NULL が使えるとは限らない。ふつうに 0 が正しい。
わざわざ記述量の多い後者を使ってこんな間違いを仕込むぐらいなら前者のほうがいい。

実質違わないと思うけど、後者だと派生クラスで明示的なデストラクタを書かないと
いけないと思う人が増えそう。
506デフォルトの名無しさん:2011/08/09(火) 11:17:59.47
サブルーチンコール先(処理先のアドレス)があるか無いか
1が「行き先はあるけど(一度コールするけど)何もしないで戻る」で、
2が「そもそも行き先が無い」 じゃね?
&(Foo::Hoge) で取り出した時、それが null かそうでないか
507デフォルトの名無しさん:2011/08/09(火) 12:04:58.11
2ならHogeはとりあえず抽象クラスになる.
1だと,Hogeに他に純粋仮想関数が無い場合には具象クラスになる.
508デフォルトの名無しさん:2011/08/09(火) 12:12:42.74
GotWではあるクラスを抽象クラスであるべきだ、としたいんだけど
他に純粋仮想関数が存在しない場合に使うことがあると書いてるようですね。
ヘッダから見ると virtual ... = 0; となっているから抽象クラスなのか。
http://www.gotw.ca/gotw/031.htm
509デフォルトの名無しさん:2011/08/09(火) 12:32:37.80
そもそも pure にすべき関数を具体的に挙げられないときにまで
abstract という手段にしがみつくのは本末転倒だろ

そーゆーことを考えるやつの頭の中が何教か、おおかた見当がつく
510デフォルトの名無しさん:2011/08/09(火) 12:42:29.65
おおかた見当付くとか偏見と思い込みに縛られるのは
あまり良い考え方でない。 理由のバリエーションを想像するべき
511デフォルトの名無しさん:2011/08/09(火) 13:05:05.69
>>508
俺がその理由で純粋仮想デストラクタを作るのはデストラクタ以外のメンバが存在しないときだけだな
ほかの全ての実装が提供されてるのにデストラクタだけは派生の実装が必要になるという状況が想像できない
512デフォルトの名無しさん:2011/08/09(火) 13:08:54.93
なんでも何教とかなんでも信者とか言って、そこで思考停止するヤツって、
もう自分の技量よりもネット上で戦う事しか考えてないよね。 頭おかしくなってる
513デフォルトの名無しさん:2011/08/10(水) 01:59:58.24
>>506 ねーよ
514デフォルトの名無しさん:2011/08/10(水) 04:11:18.75
>>513
どう、ねーのか書いてくれよ
515デフォルトの名無しさん:2011/08/10(水) 04:50:21.54
>>514
デストラクタへのポインタは取れないし、純粋仮想関数へのポインタがヌルになるわけでも
ねーよ
516デフォルトの名無しさん:2011/08/10(水) 07:42:21.54
若干亀ってしまった。すまない

>>505
> まず、純粋仮想関数の定義に NULL が使えるとは限らない。ふつうに 0 が正しい。
単純に記述ミスしていた。指摘あり
517デフォルトの名無しさん:2011/08/10(水) 11:39:18.43
>>514
513じゃないけど
純粋かそうでないかは単に「派生によってオーバーロードする必要があるかないか」でしかないよ
その理由によってメンバポインタが0になるってことはないし
純粋仮想関数は定義を持つこともできる。もちろん呼び出すこともできる
518デフォルトの名無しさん:2011/08/10(水) 19:13:52.77
>>507
その違いは一応把握しているが、それぞれの記述が抽象・具象であることを示すための手段であるのかどうかが気になる
インスタンスを作成させないことが目的であれば、protected コンストラクタを宣言する方法が一般的だし、
それだけの違いであれば、記述が面倒な2番は不要かなと

ん?2番は空処理「{}」にしてあるが、何か処理を入れたらどうなるんだ?どのタイミングで実行されるんだ?
まさか速度やサイズに影響したりしないよな
519デフォルトの名無しさん:2011/08/10(水) 22:02:53.54
初心者です、質問させてください。
1>device.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall CString::~CString(void)" (??1CString@@QAE@XZ) が関数 __unwindfunclet$??0CDevice@@QAE@XZ$0 で参照されました。
このエラーはCStringが宣言されていないよ、と言われている解釈していいのでしょうか?
520デフォルトの名無しさん:2011/08/10(水) 22:06:25.24
クラスは宣言されてるけど呼び出した関数が存在しない・・・みたいな
521デフォルトの名無しさん:2011/08/10(水) 22:07:35.85
CString::~CStringのソースコード(cpp)かそれをコンパイルしたものが見つからないって言ってる
522デフォルトの名無しさん:2011/08/10(水) 22:11:05.91
大体の場合実装部分にクラス名::をつけ忘れてるか引数を間違えてる
523519:2011/08/10(水) 22:34:35.82
ありがとうございます

うーん、CStringクラスは標準インクルードにあるはずだから
コンパイルしたものがないか、何か別の要因ということですかね・・・
524デフォルトの名無しさん:2011/08/10(水) 22:40:46.09
志村〜 LNK LNK
525デフォルトの名無しさん:2011/08/10(水) 23:07:24.31
>>523
>うーん、CStringクラスは標準インクルードにあるはずだから

ちゃんと、ある事を確かめた?
526デフォルトの名無しさん:2011/08/10(水) 23:32:34.76
>>525
「はず」と書いてしまいましたが定義を遡るとCStringクラスははいっていました
527デフォルトの名無しさん:2011/08/10(水) 23:53:52.52
デストラクタってlibに入ってんじゃねーかな
528デフォルトの名無しさん:2011/08/11(木) 03:34:17.81
C++始めて少し
未だnewの使いどころわからず
529デフォルトの名無しさん:2011/08/11(木) 03:46:38.16
new = malloc()
delete = free()
と思ってほぼ間違いなし。
530デフォルトの名無しさん:2011/08/11(木) 03:51:11.30
コンストラクタ 「…」
デストラクタ 「…」
531デフォルトの名無しさん:2011/08/11(木) 03:53:02.52
>>528
newが分からないというより、
メモリの動的割り当てのメリットがわからないってカンジ?
532デフォルトの名無しさん:2011/08/11(木) 03:56:13.34
動的確保の使いどころが分からないっていうのは幸せなことだな
単純で小さいプログラムを書く必要しか生じてないってことだし
533デフォルトの名無しさん:2011/08/11(木) 07:18:20.34
>>518
純粋仮想はオーバーライドさせるための手段でしかない


純粋仮想デストラクタは純粋じゃない仮想デストラクタが実行されるのと同じように実行されるよ
だから純粋仮想であっても定義は必要
534デフォルトの名無しさん:2011/08/11(木) 09:31:33.74
>518
コンストラクタをprotectedにしてもインスタンスを作れなくなるわけじゃない.
単に作れる相手を制限するだけ.

例えば,純粋仮想関数f()を持つクラスを作ったけど
あとからf()を純粋仮想じゃなくする変更をしたときにそのクラスがうっかり
具象クラスになってしまった なんてことが起きると嫌だから
個人的には抽象クラスなら必ず2で書く.
デストラクタに=0を付けることで
「僕はこのクラスは絶対に抽象クラスにしたいんだー」という強い意志を表明する.
535デフォルトの名無しさん:2011/08/12(金) 00:48:38.33
派生クラスから基底クラスへデフォルトコピーコンストラクタを使ってメンバ変数を代入したいのですが
これって可能ですか?
536デフォルトの名無しさん:2011/08/12(金) 01:03:39.20
537デフォルトの名無しさん:2011/08/12(金) 01:09:05.21
>>535
代入と初期化をごっちゃにしてるといつか酷い目に遭いますぞ。
538デフォルトの名無しさん:2011/08/12(金) 07:25:16.78
>>533,534
抽象クラスは純粋仮想デストラクタを宣言定義すべきなんだな
そして、必要であればそのデストラクタにメンバ変数の始末処理を書く、と
勉強になった
539デフォルトの名無しさん:2011/08/12(金) 10:10:48.13
std::map std::set に加えて
C++0x では
unordered_set
unordered_multiset
unordered_map
unordered_multimap
これらのハッシュコンテナが追加されましたが、<key, value>
value を基準にソートでききるような使い方ができる、コンテナがあれば教えてください。

540デフォルトの名無しさん:2011/08/12(金) 11:12:58.48
ttp://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0002
↑の問題を今やっているんですけど入力の終わりってどうやって判断するんですか?
541デフォルトの名無しさん:2011/08/12(金) 11:59:13.84
>>539
std::set<value>
とか
std::map<value,key>
とか
std::vector<value>
とか
std::list<value>
とかじゃね?w
542デフォルトの名無しさん:2011/08/12(金) 12:15:39.86
>>thx です
std::map<value,key> これって、key とvalue を入れ替えて使ってことですね
543デフォルトの名無しさん:2011/08/12(金) 12:17:31.94
>>540
#include <iostream>

int main()
{
int a, b;
while (std::cin >> a >> b) {
// 何か処理
}
}
544デフォルトの名無しさん:2011/08/12(金) 13:47:04.87
>>542
言いたいことはもっと厳密に定義しろ
545デフォルトの名無しさん:2011/08/12(金) 15:43:16.14
今日本語対応のプログラムを書いているのですが、文字コードがよくわかりません。

1.ワイド文字やマルチバイト文字の具体的なエンコードの指定はどうするのか
2. ソースコード自体の文字コードは何か関係あるのか
3.vc++の文字セットをunicodeにしているのにchar配列に日本語をいれておいても文字化けせずに表示できるのはなぜか

根本的な理解がないのかもしれません。誰か教えてください。
546デフォルトの名無しさん:2011/08/12(金) 18:06:33.38
vectorでpush_backに失敗した場合(メモリ確保失敗で)
でもプログラムを進めるとしてsize自体は変わらないのでしょうか?
forでsize分回したとしても普通に問題はないのでしょうか?
気になったので教えてください。
547デフォルトの名無しさん:2011/08/12(金) 18:13:09.42
>>545
とりあえず一般的な基本。
プログラム作成過程ではそれぞれ異なるかもしれない
・ソースファイルの記述に使う文字集合・符号化方式(各ソースごとでも異なるかもしれない)
・コンパイラが内部で使う文字集合・符号化方式
・実行ファイルで使う文字集合・符号化方式(一つの実行ファイル内でも複数が使われるかもしれない)
が使われていてそれらを問題なく扱うには
・全ての文字集合・符号化方式を統一しておくか
・必要に応じて適切(かつその環境で実際に変換可能)な変換を行う・変換を行うように指定する
必要がある。
548デフォルトの名無しさん:2011/08/12(金) 18:16:39.58
>>545
> 1.ワイド文字やマルチバイト文字の具体的なエンコードの指定はどうするのか
どの段階・どういう意味でのエンコード指定かわからないが環境や段階に応じて
・事前に適切にエンコードしたものを用意
・コンパイルオプションで指定
・ソースの記述で指定

> 2. ソースコード自体の文字コードは何か関係あるのか
X->Yのただ一つの変換しか出来ないのに頼むならともかく
B->Aの変換もC->Aの変換もB->Cの変換もできるのに頼むなら、これはBですB->Aの変換をしてください、と頼まないと正しく変換できないだろ。
つまり状況によっては関係ある。
549デフォルトの名無しさん:2011/08/12(金) 19:12:40.67
>>545
1.VCはwchar_tがUTF-16固定。マルチバイトはSJIS固定
2.無い。VCはSJISで書こうがUTF-8で書こうが同じバイナリーになる
3.VCはprintfがロケールに従いUTF-16をSJISに変換する
550デフォルトの名無しさん:2011/08/12(金) 19:15:17.49
>>547
それはUnixの話。VCは違う。「一般的」なんて嘘つくな
551デフォルトの名無しさん:2011/08/12(金) 19:53:43.13
>>550
は?
552デフォルトの名無しさん:2011/08/12(金) 20:19:03.93
皆さんありがとうございました。
553デフォルトの名無しさん:2011/08/12(金) 20:41:06.30
>>551
「は?」じゃねえよ。意味の無い書き込みしやがって。
ソースの文字コードが何であろうとコンパイラがUTF-16に変換するんだから
ソースも統一しろなんてデマ流すな
554デフォルトの名無しさん:2011/08/12(金) 21:01:43.68
>>553
ありがとう
555デフォルトの名無しさん:2011/08/12(金) 21:41:41.11
>>543
ありがとう
556デフォルトの名無しさん:2011/08/12(金) 21:42:22.35
いえいえ
557デフォルトの名無しさん:2011/08/12(金) 21:47:42.62
>>547の何に突っかかってんのか分からん。めちゃ丁寧じゃん
win/xbox360の開発なら困らないけど
macやlinux、スマフォ、ゲーム機、組み込み機 etcだと困るからそっちの挙動を一般的っつってんじゃないの
558デフォルトの名無しさん:2011/08/12(金) 21:52:03.97
普通はどの環境でも成り立つ方法を一般的って言うよねー
559デフォルトの名無しさん:2011/08/13(土) 00:32:19.42
VC++って書いてる奴にWinで通じない話をされてもねー
560デフォルトの名無しさん:2011/08/13(土) 00:36:30.85
>>557
Mac,Linuxを考えたら「UTF-8に統一しろ」ってアドバイスするのが適切だろ。
今時20世紀のようなJIS/EUC/SJIS混在の頭でいるジジイは引退した方がいい
561デフォルトの名無しさん:2011/08/13(土) 00:55:25.52
>>546
>if an exception is thrown by an insert() function while inserting a single element, that function has no effects.
>if an exception is thrown by a push_back() or push_front() function, that function has no effects.
562デフォルトの名無しさん:2011/08/13(土) 05:05:12.54
>>560
UTF-8BOM統一の方がいいだろgccも新しいのは通る
563デフォルトの名無しさん:2011/08/13(土) 14:14:34.13
>>536
どうもありがとうございます。
基底から派生へってやるとエラーなんですよね、自分なりに工夫してみます。
簡単な方法があるなら教えてもらいたいですがw

>>537
アドレス確定してからすぐに初期化して、その後アドレス変更せずに継続的に行う処理だったので代入と勘違いしてました。
知識と経験が不足してるので精進したいと思います。
564デフォルトの名無しさん:2011/08/13(土) 14:35:21.46
>>562
BOM付って非標準じゃなかった?バイト順入れ替わることないし
たまにトラブルからBOM無しに統一した方がいいだろ

と思ったけどよく考えたらBOM無しでトラブったこともあるな orz どうすりゃいいんだ
565デフォルトの名無しさん:2011/08/13(土) 17:10:34.54
BOM付けているのは、notepadしか知らないんだけど、他にもあるんだろうか
BOM付けると、ASCII文字だけからなるUTF-8ファイルをasciiエンコーディングと見なせないから
今後BOMは撲滅されると勝手に予測
566デフォルトの名無しさん:2011/08/13(土) 18:37:27.06
>>564
BOMはUnicode規格およびISO/IEC 10646で規定されている。
つまりBOMを扱えないソフトは「UTF-8対応」とは言えない。
567デフォルトの名無しさん:2011/08/13(土) 19:00:38.85
>>566
UTF-8の規格はBOM有り無しどっちでもいいのか
じゃぁ問題がなければBOM付きで統一した方が日本では便利そうだな
568デフォルトの名無しさん:2011/08/13(土) 19:11:43.53
>>567
GCCはシバソ問題があるから
今まで対応しなかったんだろ。
安易につけた方が良いとは言えないだろう。
569デフォルトの名無しさん:2011/08/13(土) 19:25:11.85
>>568
シバソ問題ってなに?
570デフォルトの名無しさん:2011/08/14(日) 00:07:54.26
Unixではファイルの先頭の「#!/usr/bin/sh」などを
読んで動作を決めてたから、先頭の#の前にU+FEFFが入ると困る。
という問題だと思う
571デフォルトの名無しさん:2011/08/14(日) 00:44:17.56
shbangか
572デフォルトの名無しさん:2011/08/14(日) 01:36:15.90
>>568
ソースファイルはコンパイラに対しての入力データファイルだから、
シバンで問題が起きるはずない。
単にアンチマイクロソフトが多かっただけでは?
573デフォルトの名無しさん:2011/08/14(日) 05:40:32.80
Visual Studioを使わずにC++で開発をしようとしています。
.NET Frameworkが入っていないPCでも実行できるexeファイルを作成したいです。
試しにhello.cppに
#include <iostream>
using namespace std;
int main(int argc, char const* argv[]) {
cout << "Hello C++!!" << endl;
}
と書いてから
vcvars32.batを実行して
cl /EHsc hello.cpp
を実行すると、hello.objとhello.exeができました。正常に実行できました。
574573:2011/08/14(日) 05:41:38.49
dumpbin /DEPENDENTS hello.exe
すると
---
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file hello.exe
File Type: EXECUTABLE IMAGE
Image has the following dependencies:
KERNEL32.dll
Summary
4000 .data
5000 .rdata
2000 .reloc
11000 .text
---
と出力されました(空行は抜きました)。
KERNEL32.dllにしか依存していないので、.NET Frameworkが入ってないPCでも動作すると思っているのですが
その認識で合っていますか?
あと、exeのファイルサイズが100KBほどあるのですがそんなもんなんですか?
大したプログラムではないので、もっと小さくなってほしいのですが...。
575デフォルトの名無しさん:2011/08/14(日) 05:53:50.66
>>574
.NET関係ないから、その認識で合ってる
関係あるのは、C#やVB.NET、あとC++のフリした別物の、C++/CLI の時だけ
576デフォルトの名無しさん:2011/08/14(日) 05:55:24.47
ちなみに、VC++使ったって、意識的にC++/CLIとかにしない限り、
別に .NET関係ないぞ
577573:2011/08/14(日) 06:50:58.95
>575-576
ありがとうございます。
VC++を使わないのは半分趣味みたいなものです。
あまり大きなのを作るつもりではないので、
いちいちVC++を起動するのがめんどくさいなあと思って。
578デフォルトの名無しさん:2011/08/14(日) 12:34:08.37
静的リンクだもんでかいのはしょうがない
579デフォルトの名無しさん:2011/08/14(日) 13:24:11.66
>>578
複数の自作ツールを導入する時に、共通dllみたいに括り出せないんだっけ?
580デフォルトの名無しさん:2011/08/14(日) 13:32:08.25
>>574
間違っちゃいないけど、Cライブラリの話と勘違いしてないか?
.NET Frameworkが必要か確認するなら、SDK付属のIL Disassemblerで開けるかどうか。
dumpbinはどちらかというとCライブラリが動的リンクか静的リンクかの確認に使う。
581デフォルトの名無しさん:2011/08/15(月) 23:14:01.05
日本の新聞、テレビは在日中共の手に
落ちてるし国会はすでに中共の指導下にあるから、
日本原住民は主権を完全に失っている。

日本国憲法下、当然民主主義が守られ、主権は
日本国民にあると思い込んでいる。あるいは
ちょっと気づいているけど、見ない振りしてる
お馬鹿な民族。そんなお馬鹿は滅びさるのみである。

新聞、テレビが民主党政権を支えているから民主党は
安泰。新聞テレビに叩かれるか、無視されるかしかない
自民党や右派政党が政権をとることは永遠にありえない。

主権がない国民はどんな政権を立てようとも無意味
政府をいくら批判しても無駄、選挙なんて民主主義の
ごっこ遊びに過ぎない・・・主権がないんだから
582デフォルトの名無しさん:2011/08/16(火) 00:04:39.24
>>581
右派政党・自民党は、愛国心をあおりながら、実は合衆国に尻尾をふっている、別の意味での売国奴であることを理解していないとは。
これが「ゆとり脳」ですか。
583デフォルトの名無しさん:2011/08/16(火) 02:15:30.25
アイちゃん頑張りすぎだろ
584デフォルトの名無しさん:2011/08/16(火) 07:04:02.04
basic_string の pop_front って定数時間?線形時間?
585デフォルトの名無しさん:2011/08/16(火) 07:44:25.87
規格は basic_string の complexity は明示してないらしい
http://www.sgi.com/tech/stl/basic_string.html
> Note that the C++ standard does not specify the complexity of basic_string operations.
実際に規格書見ても sequence の要件を満たすくらいしか書いてないように見えますが
処理系依存・・ですかねえ
586デフォルトの名無しさん:2011/08/16(火) 19:09:12.16
newを使って解放しないままループを何回も実行した場合
while(1){
int *p=new int[10];
}
newはループごとに作られるのですか
それともループの2回目以降無視されるんですか
ちなみに
while(1){
int *p=new int[10];
delete p[];
}
これだと毎回newしますよね?
587デフォルトの名無しさん:2011/08/16(火) 19:15:32.34
staticじゃねえんだ毎回に決まってるだろ
588デフォルトの名無しさん:2011/08/16(火) 22:40:41.45
>>586
毎回 new される。そして
while(1){
int *p=new int[10];
}
ならば前の p の内容も失われてしまい、delete もできず、アプリが終了するまで、放置された存在になってしまう。
58931:2011/08/17(水) 00:21:16.83
while (1) {
 int r = rand();
}

rand() が二回目以無視されるはずがねぇだろォォォ!
59031:2011/08/17(水) 00:22:21.08
あッ



まぁいいか
591デフォルトの名無しさん:2011/08/17(水) 01:04:50.77
>>589-590
まず服を脱いでください
592デフォルトの名無しさん:2011/08/17(水) 01:12:12.44
別スレッドで無限ループでrand()を繰り返し実行して
乱数が欲しくなったときにそのスレッドの乱数の値を得れば完全ランダムじゃね?
593デフォルトの名無しさん:2011/08/17(水) 01:26:22.87
>>592
CPU食うぞ
594デフォルトの名無しさん:2011/08/17(水) 01:39:41.09
>>592
ばーかばーか
595デフォルトの名無しさん:2011/08/17(水) 02:01:17.09
VC2010 expressです。参照を用いると可変個引数な関数が動作しません。

↓ダメ
void hoge(hogehoge& a, ...)
{
va_alist ap;
va_start(ap, a);
}

参照でなくポインタなら動作します。
↓おk
void hoge(hogehoge* a, ...)
{
va_alist ap;
va_start(ap, a);
}

参照で記述したいのですが、どうすれば良いのでしょうか?
なお、関係ないとは思いますが、hogeはメンバ関数ではありません。
596デフォルトの名無しさん:2011/08/17(水) 02:19:03.12
>>592
これからの乱数発生器の姿ではないかな
ハードウエア乱数発生器からソルトを加えつつアプリに返し
バックグラウンドで統計評価しながらスコアをボットで集めて
次世代への課題を提起するという「宇宙乱数」をここに提唱する
597デフォルトの名無しさん:2011/08/17(水) 03:51:07.24
>>595
その動作は未定義だから参照使うな
どうしても参照使いたいなら
void hoge(hogehoge& a, int i,...) とか間になにか挟め
598デフォルトの名無しさん:2011/08/17(水) 09:56:45.25
それができたとして va_arg(ap,hogehoge&) とかどーすんだよ
呼び出し側で値渡しされてしまったものを後で参照ともし言えても
値渡しへの参照じゃ呼び出し側から見て左辺値に見える動きが作れないぞ

禿がちゃんとヒントくれてるんだが...
599デフォルトの名無しさん:2011/08/17(水) 14:53:17.83
完全ランダムなんてこの世に存在するのか?
600デフォルトの名無しさん:2011/08/17(水) 14:56:36.74
>>599
量子力学
601デフォルトの名無しさん:2011/08/17(水) 17:01:40.71
それは証明されていないはずだが
602デフォルトの名無しさん:2011/08/17(水) 21:32:43.56
完全なランダムって何?
因果律的なものと関係ある?
603デフォルトの名無しさん:2011/08/17(水) 21:38:13.63
STLにfind_endがあってfind_firstが無いのって何故なのでしょうか?
[first1, last1) からサブシーケンス[first2, last2) を探す場合、STLだとどう実装できるのでしょうか?
604デフォルトの名無しさん:2011/08/17(水) 21:46:56.88
std::searchがある
605デフォルトの名無しさん:2011/08/17(水) 22:02:39.58
そんな関数あったのか・・
ひょっとして、サブシーケンスを検索するだけでなく、サブシーケンスを置換するアルゴリズムもあったりしますか?
606デフォルトの名無しさん:2011/08/17(水) 22:55:32.76
find_end() 配列1の一部と配列2が部分一致したら、その最後の位置を返す
find() 配列を走査して値が最初に一致した要素の位置を返す
find_first_of() 配列1の一部と配列2が部分一致したら、その最初の位置を返す
find_if() 配列を走査し、最初に条件に一致した位置を返す
for_each() すべての要素に対して、指定された振る舞いを実行する
search() 配列1の一部と配列2が部分一致したら、その最初の要素の位置を返す
search_n() 連続した個数の要素を見つけ、その位置を返す

何が無いって?
607デフォルトの名無しさん:2011/08/17(水) 23:59:23.93
要素の数が変わるような変更はコンテナ自身にしか出来ないよ
608デフォルトの名無しさん:2011/08/18(木) 01:19:26.52
出力にinserter渡せば要素の追加はできる。
部分置換はコンテナの範囲eraseと範囲insertを使うのが基本で要素数が変わらないならアルゴリズムのcopyで上書きかな。
609デフォルトの名無しさん:2011/08/18(木) 10:45:30.39
>>597
そうですか。しょうがないのでポインタで我慢します。

でも、言語仕様に...組み込んでるんだから、va_start(ap)だけで充分だと思った。
これなら、func(...)も記述出来るし。
610デフォルトの名無しさん:2011/08/18(木) 12:04:27.58
その言語仕様で参照でないパラメータを先行させることに決まっているんだからぁしょうがない。
つーか、コンパイラを作る立場で考えたら先行パラメータがないと面倒なことが判ると思うよ。
それが理由で古いコンパイラでは先行パラメータが必須だったから仕様はそれを追認した形だね。
611デフォルトの名無しさん:2011/08/18(木) 12:16:24.35
stdargの手法は先行するパラメータのアドレスから可変個引数のスタック上の位置を
もとめるという、コンパイラに手を入れずに可変個引数を実装するvarargsの手法を
そのまま使っていますが、
..を導入してコンパイラに手を入れたのに、古い手法をそのまま使ってるのは頭悪い
と思いました。

コンパイラは可変個引数がスタック上のどこに置かれているか知っているので、すん
なり実装できると思いますよ。
612デフォルトの名無しさん:2011/08/18(木) 18:53:36.97
古いコンパイラに先行パラメータなんかねえよ

main(argc)
{
extern prntf(), exit(); /* すべての関数が 0 個以上の可変引数だった */
printf("%s", **(char***)(&argc + 1));
exit(0, argc, 2, 3, 4, 5);
}
613デフォルトの名無しさん:2011/08/18(木) 22:20:56.27
アプリケーション作成して見たいんですが、何か言い本ないでしょうか?
難しい本は絶対に無理なので簡単な本(入門者向け)でお願いします。
614デフォルトの名無しさん:2011/08/18(木) 22:27:39.31
CUIなのかGUIなのか、GUIならプラットフォームは?
使用するコンパイラぐらい書いとけ
615デフォルトの名無しさん:2011/08/18(木) 22:39:23.64
VC++2100 expressです。
616デフォルトの名無しさん:2011/08/18(木) 22:43:12.45

CUIでwindowsと言えばよろしいでしょうか?
617デフォルトの名無しさん:2011/08/18(木) 22:43:18.93
>>615
簡単な本しか読む気が無い場合、C++を選択する時点で間違っていると思う。
C#とかの方が良いよ。
618デフォルトの名無しさん:2011/08/18(木) 22:44:01.58
GUIでした。
619デフォルトの名無しさん:2011/08/18(木) 22:46:35.91
一番有名なのはC++じゃないですか。
それは有能という証明になりませんか?
入門者はまずは基本から学ぶべきだと思いますがね。
難しい本は後の話ですよ。
620デフォルトの名無しさん:2011/08/18(木) 22:55:06.85
自己解決しました。
621デフォルトの名無しさん:2011/08/18(木) 22:55:42.10
>一番有名なのはC++じゃないですか。
>それは有能という証明になりませんか?

材料にはなり える かもしれないが、
証明にはならない。 何故なら内容次第、場面次第だから
622デフォルトの名無しさん:2011/08/18(木) 23:02:50.37
C++よりCUIに興味を持ちました。
また質問にきてやるよ。
623デフォルトの名無しさん:2011/08/19(金) 10:04:39.59
>>615
2100ってなんだよwww

ExpressだとWindows GUIやるのに大変だと思うよ
624デフォルトの名無しさん:2011/08/19(金) 13:11:10.21
>>619
>入門者はまずは基本から学ぶべきだと思いますがね。

そう言うならアセンブラからやれよ。
625デフォルトの名無しさん:2011/08/19(金) 14:02:32.96
void question()
{
  if(0xffff == 0xffffffff)
  {
    // ここにくる?
  }
}
626デフォルトの名無しさん:2011/08/19(金) 14:18:54.02
void question()
{
  if(0xffff == 0xffffffff)
  {
    // 絶対にこない。最適化でコードさえ生成されないかもしれない。
  }
}
627デフォルトの名無しさん:2011/08/19(金) 14:27:00.48
-1 == -1
628デフォルトの名無しさん:2011/08/19(金) 14:37:10.23
0xffff != -1
629デフォルトの名無しさん:2011/08/19(金) 14:48:50.41
void question()
{
  if(0xff == 0xffffffff)
  {
    // ここにくる?
  }
}
630デフォルトの名無しさん:2011/08/19(金) 14:51:28.34
>>629
ばーか
631デフォルトの名無しさん:2011/08/19(金) 15:43:14.65
とにきみいしならくる
632デフォルトの名無しさん:2011/08/19(金) 16:07:18.44
>>631
間抜け
633デフォルトの名無しさん:2011/08/19(金) 16:20:30.49
I16L32でも来ねえ
634デフォルトの名無しさん:2011/08/19(金) 16:54:25.85
intの範囲が-128〜127のC++コンパイラのような何かならそうなるかもしれない
635デフォルトの名無しさん:2011/08/19(金) 17:18:11.18
そんな処理系なら0xffはunsigned int
整数拡張した結果が0xffffffffになることはない
636デフォルトの名無しさん:2011/08/19(金) 17:25:28.85
-1と-1が等しくないって計算機として致命的で
637デフォルトの名無しさん:2011/08/19(金) 17:26:00.03
バカ?
638デフォルトの名無しさん:2011/08/19(金) 17:47:41.28
639デフォルトの名無しさん:2011/08/19(金) 19:15:56.00
>>635
そんな処理系なら整数拡張もないんじゃね?
拡張どころか警告つきで切り詰められるだろこの例だと
640デフォルトの名無しさん:2011/08/19(金) 22:36:30.00
intが-128〜127なのはC++の規格に反する
641デフォルトの名無しさん:2011/08/19(金) 22:43:30.90
そういやそうだな
642デフォルトの名無しさん:2011/08/19(金) 23:12:15.22
>>634もC++コンパイラのような何かっていってるじゃないか
643デフォルトの名無しさん:2011/08/20(土) 02:04:19.63
short s = -1;
long l = -1;

if(s == l) // これはどうなの
644デフォルトの名無しさん:2011/08/20(土) 02:07:45.38
一部の人、基本わかってるか?整数リテラルは0か正の整数になるんだぞ
(たとえ8進や16進表記でも)(例えば-1234という表記は負符号演算子-と整数リテラル1234)
だから0xffffffffはunsigned int型の4294967295になる(intが32ビットの環境なら)。
それをint型にキャストすれば多くの処理系ではint型の-1になるってだけ(実装依存で-1にならない実装も仕様上はありえる)。
645!mokuton:2011/08/20(土) 04:01:29.44
!mokuton
646デフォルトの名無しさん:2011/08/20(土) 13:26:17.63
>>10

これポインタ
クリックすると10の中身見れるよね
647デフォルトの名無しさん:2011/08/20(土) 15:41:22.85
明日始まります。参加のご協力お願いします。

@『フジテレビ抗議デモ』
日程 8月21日(日)
時間 13:30〜
場所 お台場 青海北ふ頭公園 (船の科学館 となり)

A『国を売るメディア(フジテレビ)を糾弾する緊急国民行動』
日程 8月21日(日)
時間 15:00集合 16:00出発
場所 お台場シンボルプロムナード公園「滝の広場」
(ゆりかもめ「テレコムセンター」駅前)

注意事項:デモで使用可能な物は「日本国旗関連のみ」です。
それ以外での抗議は禁止です!マナー違反は注意を促してください。
ケガ人が出ないよう気持ちの良いデモを行いましょう。
648デフォルトの名無しさん:2011/08/20(土) 16:46:53.53
>>647
まず、その下らないスレ違いの抗議参加者を募集する愚行に抗議する
649デフォルトの名無しさん:2011/08/20(土) 22:16:25.75
ただの荒らしだからNGしとけ
650デフォルトの名無しさん:2011/08/21(日) 06:30:03.48
スコープを抜けたときにデストラクタが呼び出されるようにしたいのですが
変数受け取りを強制する事はできますか?
test_class(); //直後にデストラクタが呼ばれるのでエラーとしたい
test_class o(); //OK
651デフォルトの名無しさん:2011/08/21(日) 08:00:17.87
>>650
こんな感じか?

struct Hoge {};
#define Hoge() YouSuck()YouAreFired
int main() {
Hoge g(); // OK
Hoge(); // エラー
}

-- gcc
Hoge.cpp: In function 'int main()':
Hoge.cpp:5:3: error: 'YouSuck' was not declared in this scope
Hoge.cpp:5:3: error: expected ';' before 'YouAreFired'

-- vc
1>Hoge.cpp(5): error C2146: syntax error : missing ';' before identifier 'YouAreFired'
1>Hoge.cpp(5): error C3861: 'YouSuck': identifier not found
1>Hoge.cpp(5): error C2065: 'YouAreFired' : undeclared identifier
652650:2011/08/21(日) 08:56:20.46
>>651
おお!巧いですね
ありがとうございます
653デフォルトの名無しさん:2011/08/21(日) 23:27:35.83
void test() {
 hoge() // 1
 piyo() // 2
 // どちらの呼び出しもエラー・例外の確認を行わない
}

bool hoge() {
 if (条件式) {
  return true;
 else {
  return false;
 }
}

void piyo() {
 if (!条件式) {
  throw ex;
 }
}

@とAのどっちかが呼び出しの速かったり遅かったりする?
654デフォルトの名無しさん:2011/08/22(月) 00:19:42.64
>>653
処理系の実装による。
ただ普通は例外が実際にスローされなければオーバーヘッドは小さい
655デフォルトの名無しさん:2011/08/22(月) 08:59:22.89
条件式が真の場合はどちらも一緒。return falseよりthrow exはかなり遅い。
656デフォルトの名無しさん:2011/08/22(月) 17:07:06.22
::て名前空間参照ですよね
someNameSpace::func()みたいな
::の左側に何もない場合はどういう意味ですか?
657デフォルトの名無しさん:2011/08/22(月) 17:07:55.42
グローバル名前空間にあるって意味
658デフォルトの名無しさん:2011/08/22(月) 17:12:31.39
意図はつかめませんが意味はわかりました
心に停めてコード眺めてみます。どうも
65971:2011/08/22(月) 18:20:29.07
>>654-655
サンクス。参考にさせていただく
66071:2011/08/22(月) 18:21:33.69
あッ

まぁいいか
661デフォルトの名無しさん:2011/08/22(月) 18:48:49.02
Linux や Windows における静的ライブラリや動的ライブラリ
(lib*.a とか lib*.so とか *.dll)のフォーマットや作り方、
リンカの動作や解析の仕方について、何かよい解説書や Web ページを探しています

ご存知の方いらっしゃれば、ご教示下さい
662 ◆QZaw55cn4c :2011/08/22(月) 18:57:42.76
663デフォルトの名無しさん:2011/08/22(月) 19:58:09.30
664デフォルトの名無しさん:2011/08/22(月) 20:39:35.22
std::setって何に使ってる?
俺は、リスナーのポインター登録用とか、値の登録済みかの確認用ぐらい。
B木とかに使えるかと思ったけど、ランダムアクセス
イテレーター使えないから結局std::vector使う事になった。
なんか、もっと活用できる用途はないのかアレ?
665デフォルトの名無しさん:2011/08/22(月) 21:00:16.75
>>662
引っ込んでろ。カス。全然ダメじゃねーか。
http://www.oversea-pub.com/books/gnudevjp/gnudevjp_index_1st.pdf
666デフォルトの名無しさん:2011/08/22(月) 22:41:26.22
>>664
・uniqueするのが面倒なとき
・ユニークな要素が一定個数貯まったら処理をするというロジックを実装したとき
・優先順位付き待ち行列風にデータを扱うとき
667デフォルトの名無しさん:2011/08/23(火) 08:23:51.72
>>664
sequence containerに対するuniqueはコピーを伴うので、要素のコピーが重かったり、
イテレータや参照の無効化が困る場合はsetの方が有用。
また引数や戻り値のようなインタフェースとして中身に同じ値が入っていない事を
言外に保証したい時に使うこともある。
668デフォルトの名無しさん:2011/08/23(火) 10:48:07.53
構造体に配列みたいにデータを一度にコピーしたりする方法ってあったようなきがするけど
やり方忘れました。教えてください。
669デフォルトの名無しさん:2011/08/23(火) 10:52:04.41
memcpyすれば
それか、コピーと言うより初期化の話なら Foo foo = {値、値…} では
670デフォルトの名無しさん:2011/08/23(火) 10:53:00.30
>>668
struct Foo {
...;
};
Foo a, b = {...};
a = b; // ←これで一度にコピーできるよ。メンバにポインタを持つなら代入オペレータをオーバライドしてね
671デフォルトの名無しさん:2011/08/23(火) 10:53:31.17
>>669
memcpy()って、あんた馬鹿?
672デフォルトの名無しさん:2011/08/23(火) 10:55:02.16
たとえば、配列に音楽のデータが入っていて
配列から一瞬で構造体にヘッダーだけコピーするようなほうほうです。
673デフォルトの名無しさん:2011/08/23(火) 10:59:44.43
>>671
POD限定ならありだろw
674デフォルトの名無しさん:2011/08/23(火) 11:11:43.40
>>673
だから、代入で済むことをmemcpy()する理由がないだろ。
まさかと思うが、ansi以前のレガシーCのように構造体の代入ができないと思っているわけではなかろ?

>>672
その配列と言うのは、例えばファイルのバイナリイメージがchar配列に入っていると言うことか?
だとしたら、こんな感じ。
char buffer[AnySize];
struct Foo foo = * static_cast<Foo *>(buffer);
675デフォルトの名無しさん:2011/08/23(火) 11:13:46.75
>>674
はみ出てもいいんですか?
有難うございます。
676デフォルトの名無しさん:2011/08/23(火) 11:15:31.40
あーいけね、static_cast<>()じゃなくてreinterpret_cast<>()ね。
はみ出るって言うか、>674の例だとsizeof(Foo) <= AnySizeでないとダメ。
677デフォルトの名無しさん:2011/08/23(火) 11:17:13.32
>>662持ってるけど、>>661の文章からWindowsと言う単語を除けばマッチしてると思うよ。

あとはWindows含めるなら
http://www.amazon.co.jp/Linkers-Loaders-John-R-Levine/dp/4274064379
だけど、訳書版は評判悪いね…
678デフォルトの名無しさん:2011/08/23(火) 11:22:44.38
>>674
いや、一つ二つならそうだけど、POD型構造体配列のコピーとかもちょっと意識してただけ
679デフォルトの名無しさん:2011/08/23(火) 11:29:24.90
>>678
構造体配列のコピーと言うことなら納得。取り敢えず、std::copy()を使うけど。

>>674
アライメントの問題があるから、このケースこそmemcpy()の方が安全かもしれない。
逆に、アライメントの問題があるからこそバッファ自体をアライメント境界に置くようにするけど。
アライメントの問題がなくて、参照したいだけならポインタで持っててもいいかと。
struct Foo const * foo = reinterpret_cast<Foo *>(buffer);
680デフォルトの名無しさん:2011/08/23(火) 13:35:11.26
一般論として
 元の構造体データ -> (シリアライズ) -> 汎用データ -> (デシリアライズ) -> 復元された構造体データ
をやりたいときはもとの構造体データの内部表現とシリアライズ方法がわからなければ正しく復元できない
681デフォルトの名無しさん:2011/08/23(火) 13:46:19.79
C++0xはアスペクト指向が無いから駄目だ。
終わりだ。
682661:2011/08/23(火) 18:52:41.45
>>662
>>663
>>665
>>677

とても参考になりました。ありがとうございます
683デフォルトの名無しさん:2011/08/23(火) 20:17:34.61
お前がそう思うんならそうなんだろう
お前ん中ではな
684デフォルトの名無しさん:2011/08/23(火) 20:42:21.33
ごくたまにクラス定数を基本クラスにしているソースがあるのですが
これは正しい実装方法なのでしょうか?
685デフォルトの名無しさん:2011/08/23(火) 20:47:32.49
>>684
クラス定数を基本クラス、の意味がよくわからない
どういうこと?
686デフォルトの名無しさん:2011/08/23(火) 20:51:26.07
>>685

class ConstXXX {
public:
static const int aaa;
...
};

class XXXXX : public ConstXXX {
....
};

こんな感じです。
687デフォルトの名無しさん:2011/08/23(火) 20:57:41.30
>>686
あまりそういう実装が良いとは聞いたことがないし、
わざわざ継承する理由も見つからない。

javaで定数インターフェースという使い方はあるが、
悪い使い方と言われている。
688デフォルトの名無しさん:2011/08/23(火) 21:01:48.35
>>686
やはり良くない使われ方ですよね。
どうもありがとうございました。すっきりしました。
689デフォルトの名無しさん:2011/08/23(火) 21:20:17.47
ATLみたいなテンプレートライブラリで決められた名前の定数を用意したりとかはあるな
class Class : public Base<Class> {
enum { A = n };
みたいな。AはBaseの方で使われる
690デフォルトの名無しさん:2011/08/23(火) 21:24:01.04
あぁ非公開のままだった
protectedかpublicで捉えてね
691デフォルトの名無しさん:2011/08/24(水) 10:47:12.32
template<typename A, typename B>
struct is_same { static const bool value = false; };
template<typename A>
struct is_same<A, A> { static const bool value = true; };

template<typename T>
struct IsInteger: is_same<T, int> {};

たぶん別の話だが、こういうメタ関数を作ることはたまにある。
692デフォルトの名無しさん:2011/08/25(木) 08:35:54.70
実装はCで行う。
C++は使いたくない。
classは重そう。
VMコンパイル型じゃないので(+ 1 2)とかするたびにインスタンスが作られてしまう
処理系作成のときにオブジェクト思考の概念はいらない
宗教上の理由。
それに
Scheme内でのオブジェクトの表現用にScm_Numクラス, Scm_Stringクラスとか作って、そいつらはScm_Objectを継承して…とか馬鹿げてる(と思う)。
ていうかNLispでやって懲りた。
型安全じゃないキャスト(void*へのキャスト)を多用したい
693デフォルトの名無しさん:2011/08/25(木) 08:37:39.94
どこの誤爆だ
694デフォルトの名無しさん:2011/08/25(木) 08:40:52.76
てめーの日記帳にでも書いてろ
695デフォルトの名無しさん:2011/08/25(木) 08:41:21.03
classが重いとか
アホがデマばら撒くのやめてほしいわ
696デフォルトの名無しさん:2011/08/25(木) 08:46:06.75
わざわざC++スレでやるあたりアホが自分の無能を晒してるだけだな
697デフォルトの名無しさん:2011/08/25(木) 08:47:44.85
ぐぐったらどっかのブログのコピペっぽい
698デフォルトの名無しさん:2011/08/25(木) 09:21:04.95
イテレーターをつかうとバッファリングされなくて遅い
ストリームを使うと一般性が無くなる
このホコタテはどうしたら直りますか?
699 忍法帖【Lv=38,xxxPT】 :2011/08/25(木) 09:51:51.59
はぁ?
700デフォルトの名無しさん:2011/08/25(木) 09:52:22.97
お前には聞いてない。
他の方よろしく。
701デフォルトの名無しさん:2011/08/25(木) 09:57:06.29
ホタテおいしい
702デフォルトの名無しさん:2011/08/25(木) 09:59:38.41
人をおちょくって楽しいなんて最低の人間だな。
死ねよ。
703デフォルトの名無しさん:2011/08/25(木) 10:05:03.90
もう少し人にわかるように聞いた方がいいよ
704デフォルトの名無しさん:2011/08/25(木) 10:30:05.43
なんでプログラム板はID表示されないのん(´・ω・`)
705デフォルトの名無しさん:2011/08/25(木) 11:17:08.21
重そうってなんだよwww
706デフォルトの名無しさん:2011/08/25(木) 12:54:07.49
矛盾とは両立不能な命題が同時に真であるというものだな。
イテレータとストリームの関係のどこに矛盾があるのか?
707デフォルトの名無しさん:2011/08/25(木) 13:08:50.83
この板もレベル低くなったな
質問レベルも煽り耐性も
708デフォルトの名無しさん:2011/08/25(木) 14:48:24.16
相談しようとして2ch開いてついでにスレ巡回してたら質問内容忘れてしまいましたどうしたらいいでしょうか
709デフォルトの名無しさん:2011/08/25(木) 14:57:44.80
忘れるくらいなんだから大した質問ではないんでしょう
710デフォルトの名無しさん:2011/08/25(木) 15:01:14.99
相談するまでの人生をやり直せば思い出すのではないでしょうか
711デフォルトの名無しさん:2011/08/25(木) 20:38:20.66
クラス継承は遅いよ
712デフォルトの名無しさん:2011/08/25(木) 21:17:54.23
>>711
何と比べてどんな状況で?
713デフォルトの名無しさん:2011/08/25(木) 21:22:29.15
http://codepad.org/vk5y3IX0

36行目,hoge.doSomthing(5) を呼び出したいのですが
35行目で
Line 35: error: invalid initialization of reference of type 'CHoge&' from expression of type 'const CHoge'

となってしまいます.どうやればよいでしょうか?
714デフォルトの名無しさん:2011/08/25(木) 21:34:18.51
>>712
分からずに使ってたのか?
715デフォルトの名無しさん:2011/08/25(木) 21:40:18.19
>>713
CHoge const &hoge = *itr;
716デフォルトの名無しさん:2011/08/25(木) 22:16:09.82
>>715
doSomthing は const 修飾してないから、
それじゃ 36 行目でエラーになるだけ

>>714
素直に CHoge をコピーして

CHoge hoge = *itr;

とするか、クラス設計として妥当と判断できるなら
CHoge::x を mutable にする

@@ -7 +7 @@ class CHoge
- int x;
+ mutable int x;
@@ -15 +15 @@ class CHoge
- void doSomthing(int n)
+ void doSomthing(int n) const
717デフォルトの名無しさん:2011/08/25(木) 22:21:56.19
失礼、後者のほうに抜けがった

@@ -35 +35 @@ int main(void)
- CHoge& hoge = *itr; //
+ const CHoge& hoge = *itr; //
718デフォルトの名無しさん:2011/08/25(木) 22:45:53.08
コンテナ内の要素を直接変更することがあるならsetを使うのは妥当ではないな
>>713みたいな状況では不合理さもでてくるけど整列条件に関わる部分を変更させないために
set内の要素は参照しかさせず直接変更はできない
719デフォルトの名無しさん:2011/08/25(木) 23:16:20.42
>>713
setは大小比較の結果が変わると破綻するので、変更が許されていない。
変更しないならdoSomethingをconstにする。
変更するけど大小比較に影響しないなら
 for ( auto itr = c.begin(); itr != c.end(); ++itr )
  x &i = const_cast<x&>(*&*itr);
720713:2011/08/26(金) 04:03:43.70

>>715-719 回答ありがとうございます.

↓こんなやり方も考えましたが…,
http://codepad.org/oOAfxed8

今回は古いコードの保守なので class にあまり変更を加えたくなく, const_cast で対応したいと思います.

ありがとうございました.
721デフォルトの名無しさん:2011/08/26(金) 11:18:31.71
visualC++で
char *aargv[];
void p(char *c[]) {
}
int main (int argc, char *argv[]) {
 p(aargv);
 return 0;
}
と書くとリンク時に
error LNK2001: 外部シンボル ""char * * aargv" (?aargv@@3PAPADA)" は未解決です
といわれます。
どう書けばいいでしょうか?
722デフォルトの名無しさん:2011/08/26(金) 11:24:57.21
そんな馬鹿な書き方誰に習ったの
723デフォルトの名無しさん:2011/08/26(金) 11:29:45.90
え?簡略化してるので実際はTCHARのargvをcharのargvに変換してますが……
724デフォルトの名無しさん:2011/08/26(金) 12:01:09.47
>>723
aargvは宣言しかされてないだろ。
725デフォルトの名無しさん:2011/08/26(金) 12:04:57.76
このスレってCの質問も兼ねてるのかい
726デフォルトの名無しさん:2011/08/26(金) 13:22:06.47
まあCでコンパイルできるソースであってもC++でコンパイルしようとしてるなら許容範囲でいいんじゃないか

> char *aargv[];
これは配列の要素数が不明なので不完全型であって(ここでは)aargvは定義されない。
727デフォルトの名無しさん:2011/08/26(金) 14:02:25.17
スタック領域とヒープ領域の使いわけですが、
C++ではスタック領域をメインとして使うのがいいのでしょうか?
C#だとほとんどのクラスのインスタンスはヒープにおくようになっていたと思います。
728デフォルトの名無しさん:2011/08/26(金) 14:05:07.34
そうだったのですか。aargvにはmallocしたchar*のポインタ配列を入れてもどってくるけれども、宣言するときにダミーの配列を入れてみます。
くだらない質問だったみたいですが、答えてくださってありがとうございます。
729デフォルトの名無しさん:2011/08/26(金) 14:17:25.08
>>727
ヒープでなければならない理由がなければスタック
730デフォルトの名無しさん:2011/08/26(金) 14:28:01.35
char **aargv;
void convArgv(wchar_t *argv[], char *dst[], int argc) {
  std::wstring src;
  std::string tmp;
  dst = (char**)malloc(sizeof(char*) * argc);
  for (int i = 0; i < argc; i++) {
    src = argv[i];
    narrow(src, &tmp); //wstring→string
    if((dst[i] = (char*)malloc(sizeof(char) * (tmp.length() + 1))) == NULL)
      std::cout << "メモリ確保に失敗した。" << std::endl;
    strcpy_s(dst[i], tmp.length() + 1, tmp.c_str());
  }
}
int _tmain(int argc, _TCHAR* argv[]) {
  convArgv(argv, aargv, argc);
  if (argc > 1)
    free(*(aargv + 1));
  return 0;
}
と書いて実行すると、下から3行目のfreeで思いっきり落ちるけれども
同じ理由でしょうか?
731デフォルトの名無しさん:2011/08/26(金) 14:36:11.73
void convArgv(wchar_t *argv[], char**& dst, int argc)
ってやれば落ちないよ
732デフォルトの名無しさん:2011/08/26(金) 15:00:43.79
なんですと。書いてみます。
733デフォルトの名無しさん:2011/08/26(金) 16:39:42.00
void convArgv(wchar_t *argv[], char**& dst, int argc) {
  std::wstring src;
  std::string tmp;
  char* p;
  char** aap;
  dst = (char**)malloc(sizeof(char*) * argc)
  for (int i = 0; i < argc; i++) {
    src = argv[i];
    narrow(src, &tmp); //wstring→string
    if((p = (char*)malloc(sizeof(char) * (tmp.length() + 1))) == NULL)
      std::cout << "メモリ確保に失敗した。" << std::endl;
    strcpy_s(p, tmp.length() + 1, tmp.c_str());
    aap = dst + i;
    *aap = p;
  }
}
できました。こんなかんじです
ありがとうございます
734デフォルトの名無しさん:2011/08/26(金) 18:41:16.20
friend... 危険スグル... 多用の癖がある奴が入ってきた為に、OOPのプロジェクト壊滅... orz
735デフォルトの名無しさん:2011/08/26(金) 20:04:21.66
>>734
次からはJavaでやろうぜ。
つーかfriend制限とかの規約作ってなかったんかい…。

friendも実装の移譲程度の使い方しかしないんなら便利だと思うけどな。
Javaだとfriendもpartial classも無いからswingとか使うと1ファイルの中がごちゃごちゃしてたまらん…。
736デフォルトの名無しさん:2011/08/26(金) 21:55:54.97
悪用厳禁≠全面否定
goto 君だって throw になって名誉回復したし
禿の大嫌いな define だってバリバリ現役
737デフォルトの名無しさん:2011/08/26(金) 22:01:46.71
>goto 君だって throw になって名誉回復したし
gotoとthrowが同じに見えるなんてかわいそうだな。
throwは呼び出し元に飛ぶもので、コード書いた時点では飛び先が決まってないんだぞ。

>禿の大嫌いな define だってバリバリ現役
テンプレートとconstとインライン関数があるのに、バリバリ現役はまずいだろう。
738デフォルトの名無しさん:2011/08/26(金) 22:56:58.32
>>737
その意味では計算型 GOTO (FORTRAN ではなく BASIC の)なみのワルだよな
コード書いた時点で飛び先が決まってないのは関数ポインタや longjmp でも同じだし
C++ では template 内で多重定義解決させるときも飛び先は知るわけないよな

goto と throw が構造化定理における何者かという本質が見えてないおまえさんこそご愁傷様だよ
assert の代わりに dynamic_cast でも使っているのか?
739デフォルトの名無しさん:2011/08/26(金) 23:32:51.01
規格と実装をごちゃまぜにする馬鹿
740デフォルトの名無しさん:2011/08/27(土) 01:00:00.84
gotoは構造化を壊すが、常に構造化の上位に向けてスローされる例外は
構造化に反しない。
>>738はバカなの?死ぬの?
741デフォルトの名無しさん:2011/08/27(土) 01:32:21.20
>>740
おまえが死ねよ
カタカナ表記したからって構造化との関係は変わらないぞ
742デフォルトの名無しさん:2011/08/27(土) 01:51:10.62
寝落ちよろ
743デフォルトの名無しさん:2011/08/27(土) 01:51:46.04
構造化を壊す?gotoの使い方ってどんなのっすか?
744デフォルトの名無しさん:2011/08/27(土) 02:15:50.86
寝落ちる
745デフォルトの名無しさん:2011/08/27(土) 03:31:07.36
char* p;
char a[];
の違いってなに?
同じだよね
746デフォルトの名無しさん:2011/08/27(土) 05:09:04.83
上は定義
下は宣言
全く違う
747デフォルトの名無しさん:2011/08/27(土) 18:35:07.47
>>745
上はcharへのポインター(アドレス)を格納する変数の宣言および定義。
下はcharを複数格納する配列の宣言。要素数は決まっていない。
748デフォルトの名無しさん:2011/08/27(土) 23:49:33.89
多次元配列に関する質問です。

Nを自然数としてN次元配列を扱いたいとして、
二次元や三次元などNが事前に決まっている場合は
問題ないのですが、このN自体を変数として実行時に
N次元配列が二次元だったり三次元だったりするような
コーディングは可能でしょうか?

かなりテクニカルな実装になっても構わないので
もし可能でしたら教えてください。

よろしくお願いします。
749デフォルトの名無しさん:2011/08/27(土) 23:54:54.95
1次元配列を動的に確保して普通にインデックス計算するだけでおk
750デフォルトの名無しさん:2011/08/28(日) 00:01:29.32
>>748
float* array;
array = new float[3 * 4];
delete[] array;
もしくは、
std::vector<float> array;
array.reserve(3 * 4);
で、いいんじゃね?
751デフォルトの名無しさん:2011/08/28(日) 00:31:31.36
>>749-750
確かにそれも一つの解決ではあるのですが、
あくまでも目的は多次元配列として扱うということになります。

理由の一つとしては、多次元配列の構造を持っている1次元配列の
演算の手間があります。実際 M_1*M_2*... M_N というN次元配列を
1次元化する場合、インデックスの変換は

(m_1, m_2, ..., m_N) -> sum[n=1 to N] m_n product[k=n+1 to N] M_k

となりますが、こうやって作成した1次元配列の演算が非常に面倒になるため
各種演算の手間を軽減するために多次元のまま扱いたいのです。
752デフォルトの名無しさん:2011/08/28(日) 00:34:54.44
配列ラップしてoperator ()とか使ってカプセル化すれば?
753デフォルトの名無しさん:2011/08/28(日) 00:41:44.79
と、考えていましたが
もしかしたら高次元の場合でも
そんなに手間でもないような気もしてきました…

もう一度考え直してみます。
(ずっとageてしまってました。すみません)

>>752
それは配列要素を持つクラスを作成して、そのクラスに
利用したいオペレータを追加する、ということでしょうか?
これも検討してみます。
754デフォルトの名無しさん:2011/08/28(日) 00:45:16.86
次元が静的なのか動的なのか
755デフォルトの名無しさん:2011/08/28(日) 00:48:12.09
>>751
仮にちゃんと多次元配列作っても、大抵の処理系じゃ内部の
アドレス計算は一次元配列と同じになるのでは?
756デフォルトの名無しさん:2011/08/28(日) 05:39:15.65
>>751
> こうやって作成した1次元配列の演算が非常に面倒になるため

どこがどう「非常に面倒」なんだ?
757デフォルトの名無しさん:2011/08/28(日) 07:35:00.12
ツリー構造を作ればいいんじゃないの

template <typename T>
class Node {
public:
 virtual Node & GetChildNodeByIndex(size_t index) = 0;
 virtual T & GetValue() = 0;
};

template <typename T>
class ValueNode {
public:
 virtual Node & GetChildNodeByIndex(size_t index) { throw x; }
 virtual T & GetValue() { return this->value; }

private:
 T value;
};

template <typename T>
class ContainerNode {
public:
 virtual Node & GetChildNodeByIndex(size_t index) { return this->childNodes[index]; }
 virtual T & GetValue() { throw x; }

private:
 boost::ptr_vector<Node> childNodes;
};
758デフォルトの名無しさん:2011/08/28(日) 07:36:12.29
あ、NodeはValueNodeとContainerNodeのスーパークラスね
759デフォルトの名無しさん:2011/08/28(日) 09:33:46.15
イテレーターって下位互換性だと思っているひと多いですよね。
OUTPUT ITERATORはITERATOR同士を比べて終端を調べられないから下位換性無いですよね
イテレーターって互換性みたいなのは無いと考えるべきかOUTPUT ITERATORを例外とするのか
どう考えればいいですか?
760デフォルトの名無しさん:2011/08/28(日) 11:23:27.24
別物です
761デフォルトの名無しさん:2011/08/28(日) 12:02:44.86
>>748
超手抜きのn分木でやってみた
ttp://ideone.com/e0ZQq
762デフォルトの名無しさん:2011/08/28(日) 23:35:17.43
>>759
図にするとこんな感じ。OutputとInputがそれぞれ基底にあって、一本道の関係ではない。
┌→Input Iterator
├→Output Iterator
Forward Iterator

Bidirectional Iterator

Random Access Iterator

だから、Input Iteratorであればよいという状況ではOutput Iteratorがのけ者に感じるだろうけど、
逆にOutput Iteratorであればよいという状況であれば今度はInput Iteraotrがのけ者に感じる、ということだって起こる。
763デフォルトの名無しさん:2011/08/29(月) 00:44:51.53
>>759とか>>762とかイテレータをよく知らないやつが読んだら混乱しそう
764デフォルトの名無しさん:2011/08/29(月) 00:50:31.76
よくわからないからベン図で表してくれ
765デフォルトの名無しさん:2011/08/29(月) 02:37:08.32
ttp://www.dotup.org/uploda/www.dotup.org1958784.jpg
書いてはみたけど探せばどこかにあるだろ
766デフォルトの名無しさん:2011/08/29(月) 02:39:48.53
いいね!いいベン図だよ!
767デフォルトの名無しさん:2011/08/29(月) 12:06:22.25
outputだけ仲間はずれだな。
768デフォルトの名無しさん:2011/08/29(月) 14:36:28.77
そういえばイテレータって結局なんなのか把握できてなかったな
769デフォルトの名無しさん:2011/08/29(月) 14:38:39.06
発音するときもイテレーターって伸ばさないやつが出てきてうざいから
イテレータという書き方止めてくれる?
どうしても伸ばしたくないならイテレートルといえば?
770デフォルトの名無しさん:2011/08/29(月) 14:54:10.49
単にfor文のインデックスにオブジェクトを格納するというだけだろ
771デフォルトの名無しさん:2011/08/29(月) 14:55:29.78
いや、構造とデータの分離。
772デフォルトの名無しさん:2011/08/29(月) 15:02:11.84
>>769
いや止めない。
773デフォルトの名無しさん:2011/08/29(月) 15:06:54.60
メインはメーンな
774デフォルトの名無しさん:2011/08/29(月) 15:07:40.96
インデックスをインデクスというやつもウザイ。
775デフォルトの名無しさん:2011/08/29(月) 15:12:45.16
>>769
三音以上の(カタカナ)英語の語尾に長音をつけないのって、
JISでそう決められてるんじゃなかったっけ
776デフォルトの名無しさん:2011/08/29(月) 15:15:32.78
パソコン通信で情報量を減らすために語尾を延ばさないようにしたのが始まりだろ。
昔は一文字いくらとか決まってたらしいし。
777デフォルトの名無しさん:2011/08/29(月) 15:15:40.81
インデックシング
778デフォルトの名無しさん:2011/08/29(月) 15:21:12.58
>>774
インデクサは?
779デフォルトの名無しさん:2011/08/29(月) 15:28:09.91
メートルでもメーターでもなくメータというやつとか
テンソルでもテンサーでもなくテンサというやつとか
ブチ殺したくなる。
780デフォルトの名無しさん:2011/08/29(月) 15:37:22.41
知らんがな。
781デフォルトの名無しさん:2011/08/29(月) 15:44:14.30
インディクス
782デフォルトの名無しさん:2011/08/29(月) 16:21:37.96
>>776
最初は印刷すると棒だらけになって無駄だったからだったような
http://ja.wikipedia.org/wiki/%E9%95%B7%E9%9F%B3%E7%AC%A6#.E9.95.B7.E9.9F.B3.E7.AC.A6.E3.81.AE.E7.9C.81.E7.95.A5
まあ2chはJIS準拠じゃないけどな

自分が名乗るときはプログラマって言っちゃう。

>>779
沸点低すぎー。ワーニングとかでも怒っちゃう?

C++ってしーぷらぷらで良いの?
783デフォルトの名無しさん:2011/08/29(月) 16:35:34.40
784デフォルトの名無しさん:2011/08/29(月) 16:50:54.78
禁書 idx;
785デフォルトの名無しさん:2011/08/29(月) 18:49:21.55
無駄に「ヴ」を使ってる奴は後ろから頭を引っぱたきたくなる
786デフォルトの名無しさん:2011/08/29(月) 18:59:10.10
ヴぁーか
787デフォルトの名無しさん:2011/08/29(月) 19:40:19.79
クラスメンバvoidポインタって宣言できますか?
自分のクラス内のクラスメンバポインタを集めたコンテナをstaticで用意したいんだけど・・・
788デフォルトの名無しさん:2011/08/29(月) 19:41:35.42
できるよ
789デフォルトの名無しさん:2011/08/29(月) 22:29:47.77
余裕。
790デフォルトの名無しさん:2011/08/29(月) 22:32:23.16
素人には無理だ
怪我をしないうちにうちへかえんな
791デフォルトの名無しさん:2011/08/29(月) 22:40:25.10
自分のスキルより少し高いものをやる、
それが成長へのコツ
792デフォルトの名無しさん:2011/08/29(月) 22:57:04.62
自分でやればわかることをわざわざにちゃんで聞いてる時点で…
793デフォルトの名無しさん:2011/08/29(月) 23:07:42.48
C++のクラス設計 or 実装についての質問です。

汎用的な通信手続きを定義した抽象クラスAを継承して、
実際の通信を行う具象クラスB、具象クラスCを定義しました。

実際に通信を行う関数Dに
Aのポインタを引き渡して処理をさせようと思うのですが、
この場合、関数Dを呼び出す側が具象クラスBまたはCを知っている必要が
あると思うのですが、こういうものなのでしょうか?
実装の詳細を知りたくないために抽象クラスを使用して処理できるようにしたのに、
具象クラスの内容を呼び出し元が知っている必要がある事に違和感を感じたのですが。

794デフォルトの名無しさん:2011/08/29(月) 23:11:03.53
> 関数Dを呼び出す側が具象クラスBまたはCを知っている必要が あると思うのですが
いいえ
795デフォルトの名無しさん:2011/08/29(月) 23:15:50.06
class Hoge
{
private:
 int x, y;
 bool flag;

 class Statics
 {
 public:
  Statics()
  {
   this->members.push_back(&Hoge::x);
   this->members.push_back(&Hoge::y);
   this->members.push_back(&Hoge::flag);
  }

  std::vector<void Hoge::*> members; // 'void' 型が不適切に使用されています。
 } static statics;
};

できません><教えてください><
796デフォルトの名無しさん:2011/08/29(月) 23:26:05.71
>>795
むちゃくちゃなコード書きやがるなwwwwww

Hogeクラスのメンバをstaticメンバに保存しておきたいってこと?
797デフォルトの名無しさん:2011/08/29(月) 23:26:14.24
>>793
抽象化に失敗しています
設計からやり直しましょう
798デフォルトの名無しさん:2011/08/29(月) 23:27:12.57
>>793
ファクトリ関数Eがあるなら呼び出し側はA、D、Eだけ知ってればいんじゃない
799デフォルトの名無しさん:2011/08/29(月) 23:42:11.20
>>796
そうそう、staticなコンテナ(>>795ではHoge::staics::members)に追加するのは何時でもいいんだけどね
800793:2011/08/29(月) 23:44:47.50
回答ありがとうございます。考え方に問題がありそうなのはわかったのですが、
下記のようなコードに対してどんな形で対応すればよいのでしょう。
というか、そもそも具象クラスの情報はどこが持つのが
良い設計なのかわからなくなってきました。
class A {
  A();
  virtual ~A();
};
class B : public A {
  B();
  virtual ~B();
};
class C : public A {
  C();
  virtual ~C();
};
void D(class A *p) {
}
int main() {
  // Dを呼び出す際にはB or Cの型情報が必要?
  D(new B());
  return 0;
}
801デフォルトの名無しさん:2011/08/29(月) 23:53:12.12
>>800
DからみてB,Cは抽象化されてるからそれでいいよ
どこまで抽象化したいかは場合による
必ずどこかで具体的なクラスを生成しないといけない
802デフォルトの名無しさん:2011/08/29(月) 23:58:47.18
>>800
例えばの話、BとCの抽象クラスAが存在しなかったのなら、関数Dは
void D1(B * p)
void D2(C * p)
の2つ必要になる
処理内容がほぼ同じ関数を2つ記述しなければいけない
803デフォルトの名無しさん:2011/08/30(火) 00:00:13.54
>>799
保存しておきたいのはインスタンスのポインタ?値?
保存しておいていつそれらは削除するのか?
クラスがコピーされたときの挙動は?(コピーコンストラクタと代入)
このあたりで実装の仕方がかわるから、そこんとこkwsk
804デフォルトの名無しさん:2011/08/30(火) 00:05:49.52
>>803
クラスメンバであるインスタンスを指すポインタを保存したいのではなく、
クラスメンバであるインスタンスを保存したいのではなく、
クラスメンバへのポインタを保存したい

クラスstatic変数であるコンテナクラス(vectorなりlistなり)に保存しておき、削除は行わない

static変数に保存するので、コピー操作には関わらないはず
805793:2011/08/30(火) 00:07:16.51
>>801
>>802
ありがとうございます。
抽象化のやり方としては間違っていないのですね。
関数DにとってはAという抽象的なクラスで操作できるので抽象化できている、と。

となると、後の悩みはどこで具体的なクラスを生成するかのようです。
作ってるアプリケーションによってもやり方は違うようなので、
オープンソースのアプリでも見ながらちょっと考えてみます。

ありがとうございました。
806デフォルトの名無しさん:2011/08/30(火) 00:27:24.18
>>804
一度インスタンス化したオブジェクトが破棄されると
staticに無効なポインタが保持されたままになるが大丈夫か?

またメンバ関数へのポインタは、
クラスのポインタがあれば取得できるから、保存するならクラスのポインタかな
807デフォルトの名無しさん:2011/08/30(火) 00:28:22.22
こういうことがしたいんじゃねとエスパー

#include <stddef.h>
class Hoge
{
private:
 int x, y;
 bool flag;

 class Statics
 {
 public:
  Statics()
  {
   this->members.push_back(offsetof(Hoge,x));
   this->members.push_back(offsetof(Hoge,y));
   this->members.push_back(offsetof(Hoge,flag));
  }
  void* MenberToPointer(Hoge* p, size_t idx) {
   return void*(char*(p) + menbers[idx]);
  }

  std::vector<size_t> members;
 } static statics;
};
808デフォルトの名無しさん:2011/08/30(火) 00:40:08.82
>>806
> 一度インスタンス化したオブジェクトが破棄されると
> staticに無効なポインタが保持されたままになるが大丈夫か?
え、そうなる・・・のか?

参照: http://homepage2.nifty.com/well/Pointer.html

>>807
おー、そんな感じ。というか offsetof() なんていう関数知らなかったよ
この関数は Hoge クラスが実装クラスであったり、x や y の型が抽象または実装クラスであっても使える?
809デフォルトの名無しさん:2011/08/30(火) 00:55:18.94
>>808
書いただけでコンパイルもしてないからわからんが別にHogeが継承されてても使える気はする
てかこんなコードやめとけ考えなおせ
810デフォルトの名無しさん:2011/08/30(火) 00:56:44.51
offsetofを使って正しい結果が返ると保障されているのはPODの場合だけ
811デフォルトの名無しさん:2011/08/30(火) 01:07:24.78
>>809
だが・・・メンバ変数に・・・C#でいうところの"属性"を持たせたいッ・・・!
属性の1つとして"プロパティ名"を持たせて、ハッシュに保存したいんだ・・・ッ!
というか、これができると繰り返し記述しなければいけない部分が減って俺得になる

>>810
なるほど・・・
クラスメンバ全てにPOD性を強要することはできないから厳しいかな
812デフォルトの名無しさん:2011/08/30(火) 01:11:59.90
てかswitch〜caseでメンバのポインタ返しても同じ動作だと思うが
配列に入れたい理由をもう一度考えてみるべき
813デフォルトの名無しさん:2011/08/30(火) 01:32:04.63
なんか言ってることがずれてる人(たち?)、メンバポインタ・メンバ関数ポインタを勉強しとけ(普通のポインタとは違うぞ)
814デフォルトの名無しさん:2011/08/30(火) 01:32:43.59
うむ・・・説明している間に何かがおかしいことに自分で気付いた感
一旦構造を見直してみるわ
815デフォルトの名無しさん:2011/08/30(火) 01:37:52.71
the Bends
816デフォルトの名無しさん:2011/08/30(火) 01:55:34.57
>>795
できた・・・

template<typename T> void push_back_member(T (Hoge::*p)) { members.push_back(reinterpret_cast<char Hoge::*>(p)); }
template<typename T> T (Hoge::*nth_member(int n) const) { return reinterpret_cast<T Hoge::*>(members[n]); }

・・・できたが、 nth_member() の宣言に死相が出ている。
817816:2011/08/30(火) 01:59:14.85
ごめん抜粋しすぎた。
http://codepad.org/LJ5MqwEl
818デフォルトの名無しさん:2011/08/30(火) 03:26:03.73
>>817
なるほど、すばらしい
> members.push_back(reinterpret_cast<char Hoge::*>(p));
「pod型名 Hoge::*」にキャストしてまとめればよかったのか

自己流で少し整理&色々追加
インスタンス関数にプロパティ名をつっ込んで、インスタンス変数へのポインタを取得できるようにしてみた
http://codepad.org/O2ZCNV14
819816-817:2011/08/30(火) 03:40:29.25
>>818
あー、要らない括弧を付けすぎていたのか。
T Hoge::* ってわりと素直に使えるのね。
820デフォルトの名無しさん:2011/08/30(火) 03:45:01.48
>>818
> (p->*get_member_by_name_core<char>(name)
reinterpret_cast で作ったポインタは元の型に reinterpret_cast で戻してからじゃないと使えないよ。
これだと全部のポインタを char Hoge::* として使ってるから、元々 char のメンバ以外に使うと
未定義動作になっちゃう。
821デフォルトの名無しさん:2011/08/30(火) 03:55:48.07
>>820
ってことはどの道、どこまでも型名が必要になってくるのか
とりあえず template <typename T> T Hoge::* へのキャストを追加して、さらに参照として取得できるようにしてみた

http://codepad.org/wIBEffNK
822デフォルトの名無しさん:2011/08/30(火) 10:27:21.45
質問です。
下記のようなコードにおいて、test1 ってなにものになるんですか?

class CTest{
};

int main(int argc,char* argv[])
{
CTest test1();
return 1;
}
823デフォルトの名無しさん:2011/08/30(火) 10:33:34.19
CTestのインスタンス
824デフォルトの名無しさん:2011/08/30(火) 10:43:03.40
>>823
私もそう思ってたんですが、下記のコードはコンパイル通りません。
こんなエラーが出ます:
request for member `func' in `test1()', which is of non-aggregate type `CTest ()()'

以下コード:
#include <stdio.h>

class CTest{
public:
void func(){printf("func.\n");};
};

int main(int argc,char* argv[])
{
CTest test1();
test1.func();
return 1;
}
825デフォルトの名無しさん:2011/08/30(火) 10:44:45.46
void func(){printf("func.\n");};←' ; '要らない
826デフォルトの名無しさん:2011/08/30(火) 10:47:52.97
>>825
?

補足すると、
CTest test1;
と書いた場合はもちろん正常に動作します。
827デフォルトの名無しさん:2011/08/30(火) 10:57:35.58
CTest test1();はCTest型を返すtest1関数だと解釈されてしまってる
828デフォルトの名無しさん:2011/08/30(火) 10:58:16.90
824 ではないが、
CTest test1;
のような気がする、なぜなら
CTest test1 = CTest();
だとコピーコンストラクタが動くことになるが、そうならない方法もあったような。
829デフォルトの名無しさん:2011/08/30(火) 10:58:59.85
>>827
おおお、そうか、なんか引っかかってたんだそういうことかー!!?!!
ありがとうございますありがとうございます。
830デフォルトの名無しさん:2011/08/30(火) 13:59:38.16
改定新版 C++基礎講座 impress が間違ってるのか。8.6.2あたり
CTest test2(CTest test0);
// test2.func()
// test0.func();
831デフォルトの名無しさん:2011/08/30(火) 16:53:10.98
>>830
ユーザー定義型のせいでまどわされないようにCTestをintに置き換えてみよう
int test2(int test0);
832デフォルトの名無しさん:2011/08/31(水) 10:05:53.81
「C++で最も奇妙な解析」ってやつだっけ
833デフォルトの名無しさん:2011/08/31(水) 16:30:40.03
178 :名前をあたえないでください :2011/08/23(火) 02:49:19.37 (p)ID:IWpZ4iGT(2)
某メディアの人間だが、こんなお話が。

・フジの話は広告業界では大いに話題になっている。フジは火だるま状態。
 広告をまともに出せないんじゃないかというレベル。
・韓流問題も大きかったが、あのタイミングでセシウム米問題が出たのが致命的だった。
 あれでミキハウスがフジ系列から完全に手を引いた。
 他のスポンサーも一気にフジから逃げ始めている。
・セシウム米がなかったらここまで大きな広がりになっていなかったかも。
 韓流との合わせ技で、「このメディアはもう終わっているんじゃないか」という認識が広がった。
 やはり米という日本人の琴線に触れるところでやらかしたのが厳しかったのでは。
・収拾はつかないかも。落としどころがないから。
 それこそ全面謝罪して解社的出直しやるしかない。
834デフォルトの名無しさん:2011/09/01(木) 00:50:17.87
VS2010にて.
コンストラクタにサイズ渡したらそれで固定,
要素もそこで保持するだけで解体されるまでそのままなコレクションがほしいんだ

とりあえずunique_ptr<T[]>で保持してたんだけど,
どうせならbegin-endのiterationくらい使ってみたい(STL自体とC++11の新要素平行して学習中)

静的なサイズじゃないからスタックには置けない=arrayは使えないけど
可変でなくていいからvectorは十分にしても必要ではない気がする.

丁度必要十分なコンテナって(準標準くらいまでのイメージのライブラリで)存在する?
それとも,サイズ変動なければvectorより速くはほぼならないから要らないってことだろか.
835デフォルトの名無しさん:2011/09/01(木) 01:20:04.21
boost::array
836デフォルトの名無しさん:2011/09/01(木) 01:35:25.52
>>835
arrayってその意味合いのつもり.
…std::arrayとboost::arrayってできること変わってないよね?

arrayって生の配列の単なるwrapであって,
コンパイル時点でサイズ決定してなきゃだめだよね.
サイズはTemplate引数だったと思うし.

実行時に大きさ指定できるのであれば確かに理想.やり方知りたい
837デフォルトの名無しさん:2011/09/01(木) 01:40:57.30
boostでいいならunique_ptr<T[]>にboost::make_iterator_rangeかませればいいんじゃないか
まあ素直にvector使えよってかんじだけど
838デフォルトの名無しさん:2011/09/01(木) 01:45:02.26
俺はそれで悩んだ結果、std::vector<unsigned char>とかを使うことにした
839デフォルトの名無しさん:2011/09/01(木) 01:51:04.00
素直な方法がvectorでいいのならそれでよかったんだ
疑問に思えたのに知らないままにして,変な自己流通してたら勿体無いな,と.

折角だからmake_iterator_range調べてみる,ありがとう
840デフォルトの名無しさん:2011/09/01(木) 01:54:31.35
なんか書き方がうざい
841デフォルトの名無しさん:2011/09/01(木) 04:54:03.37
馬鹿の考え休むに似たり
842デフォルトの名無しさん:2011/09/01(木) 13:13:20.40
ネット上のファイルをダウンロードするにはどうしたら良いでしょうか?
環境は Linux、GCC です。
843デフォルトの名無しさん:2011/09/01(木) 13:29:31.11
「猫ネット」本にやり方書いてあった
844デフォルトの名無しさん:2011/09/01(木) 13:38:55.05
wgetでいいよ
845842:2011/09/01(木) 18:43:00.26
>>843
>>844
ありがとうございます。

現在Perlで行っている処理を高速化するためにC++で書き換えています。
Perlではネット上から取得したhtmlファイルなどを
直接変数にぶち込む手段(LWP::UserAgent)が用意されています。

C++で、system( "wget URL -P dest-dir") を行った場合
一度ファイルが生成されてしまうため、
ほぼ同じアルゴリズムのC++とPerlのプログラムを比較すると
HDDへのアクセスとメモリへのアクセスの差から
Perlの方がスクリプト言語ながら圧倒的に早い結果が出てしまいます。

何か対策は無いでしょうか。
できればLinux環境が良いですが、VC++で何とかならないか、とも考えています。
846デフォルトの名無しさん:2011/09/01(木) 18:46:51.93
vcならwininetでも使えば
これ以上はスレチ
847デフォルトの名無しさん:2011/09/01(木) 19:56:00.14
848デフォルトの名無しさん:2011/09/01(木) 21:43:10.14
>>845
curlとかでも使うと楽かもね
ネットワークのプログラムスレにでも行くといいよ
849845:2011/09/01(木) 22:07:11.23
>>846
>>847
>>848
ありがとうございます。
頑張って調べようと思います。
850デフォルトの名無しさん:2011/09/02(金) 00:05:39.86
>>849
C++なら、普通に boost::asio が真っ先に出るべき
ついでに、 boost::thread も使いたくなると思うので、合わせて見るべき
ダウンロードだけなら、30行も書かずに望みは叶うとおもうよ
特にスレチでもない
851デフォルトの名無しさん:2011/09/02(金) 00:06:50.18
ちなみに、WindowsでもLinuxでもUnixでもおk
852デフォルトの名無しさん:2011/09/02(金) 01:45:44.76
class Base {
// 仮想デストラクタを持たない
};

class Derived : public Base {
};

Base * p = new Derived();
delete p;

これは未定義動作のはずだけど、

Derived * p = new Derived();
delete p;

Q. これは許可されていますか?
853デフォルトの名無しさん:2011/09/02(金) 01:47:51.47
されてます
854デフォルトの名無しさん:2011/09/02(金) 02:26:04.31
おkありがとう
855デフォルトの名無しさん:2011/09/02(金) 10:59:42.56
国家公安委員会委員長に山岡賢次

何コレwwwwwwwwwwwww死ぬの?
http://ja.wikipedia.org/wiki/%E5%B1%B1%E5%B2%A1%E8%B3%A2%E6%AC%A1

山岡 賢次(やまおか けんじ、旧氏名:藤野 賢二、ふじの けんじ、旧氏名における旧姓:佐藤、金子、1943年4月25日 - )
は、日本の政治家。衆議院議員(5期)。パチンコチェーンストア協会政治分野アドバイザー[1]。健全なネットワークビジネス
を育てる議員連盟顧問。
民主党副代表、民主党広報委員長。民主党国会対策委員長、参議院議員(2期)を歴任。


パチンコチェーンストア協会政治分野アドバイザー
wwwwwwwww

吹いたわwwwwwwwwwwwww
856デフォルトの名無しさん:2011/09/03(土) 20:36:04.57
言語習得に役立つ本か資料を教えてください。

記述の方法とかはVBやってたんで分かります。
無数にある関数とかそれを使ったプログラムなど
自分でガリガリコーディングする題材になりそうなものないですか?
857デフォルトの名無しさん:2011/09/03(土) 20:43:15.34
禿本
演習問題てんこ盛りで「答えはこれ1つ」と押しつけてこない
858デフォルトの名無しさん:2011/09/03(土) 23:06:01.76
c++がわかったらc言語も理解できんの?
859デフォルトの名無しさん:2011/09/03(土) 23:09:40.17
なぜ未だに時代遅れのCなんか使っている人がいるのか
という点で理解できない
860デフォルトの名無しさん:2011/09/03(土) 23:41:53.27
ガベージコレクションがないとやっぱきつい
861デフォルトの名無しさん:2011/09/04(日) 01:55:36.25
>>859
CでかいたらC++より高速でサイズが小さい。
ライブラリが貧弱だけど、なんでも自作できるひとがCをつかうから問題ない
862デフォルトの名無しさん:2011/09/04(日) 02:37:29.09
>>861
CとC++で同じプログラムについて実行速度やバイナリサイズに差が出るわけないと思うんだけど、
なんかそんな差を生じるような違いってあったっけ?
863デフォルトの名無しさん:2011/09/04(日) 02:38:00.65
いつの時代の話してるんだよw
864デフォルトの名無しさん:2011/09/04(日) 02:40:28.90
C言語でC++の機能をより高速かつ軽量に実装できるのか?
865デフォルトの名無しさん:2011/09/04(日) 03:28:12.25
なぜC++の機能を実装する必要がある
実装したいのは作るプログラムの機能であって、C++の機能を実装したいのではない
目的と手段を入れ替えるのよくない
866デフォルトの名無しさん:2011/09/04(日) 03:39:03.47
C言語でC++の機能を(使うより)高速かつ軽量に実装できるのか?

括弧内が省力されてるだけでしょ
867デフォルトの名無しさん:2011/09/04(日) 03:39:14.44
STL使うより自分で自己参照型構造体使ってリストとか実装した方が早いし軽いだおr
868デフォルトの名無しさん:2011/09/04(日) 03:45:53.43
それC++でもできるでしょ?
869デフォルトの名無しさん:2011/09/04(日) 04:08:29.63
Cランタイムもサイズ大きくて邪魔だよな必要な部分だけ自分で書いた方が早いし
てかそもそもCコンパイラとか存在意義が不明だし
普通にバイナリエディタでEXEやELFファイル書けばいいし
870デフォルトの名無しさん:2011/09/04(日) 04:32:12.95
なら半田ごてで電子回路設計からやれや
871デフォルトの名無しさん:2011/09/04(日) 08:03:28.98
半田ごてで電子回路設計なんかできるかよ
872デフォルトの名無しさん:2011/09/04(日) 08:23:04.47
朝鮮人はミスを謝らない
873デフォルトの名無しさん:2011/09/04(日) 08:36:55.10
HDLでかいたらCより高速でサイズが小さい。
ライブラリが貧弱だけど、なんでも自作できるひとがHDLをつかうから問題ない
874デフォルトの名無しさん:2011/09/04(日) 12:57:46.93
何度も言っているけどC++の標準ライブラリですら使えない環境があるんだよ
875デフォルトの名無しさん:2011/09/04(日) 13:01:56.75
人が環境を変えるのを待つんじゃない
お前が環境を変えるんだ!
876デフォルトの名無しさん:2011/09/04(日) 13:02:05.83
それがどうかしたのか
877デフォルトの名無しさん:2011/09/04(日) 13:04:18.69
クラスの継承も使っちゃダメって言われるところもあるな
878デフォルトの名無しさん:2011/09/04(日) 13:10:00.16
そういう環境でならC風のクラス実装を使えばいい
C++の言語の継承機能はべつに使わなくてもいい
879デフォルトの名無しさん:2011/09/04(日) 13:17:32.68
それは底辺だね
880デフォルトの名無しさん:2011/09/04(日) 13:20:05.42
開発ツール売りたいところがC++を推してきたけどそれももう過去の話
ところがSI業界だけはいまだにC++が最先端だと思ってるという
881デフォルトの名無しさん:2011/09/04(日) 13:25:26.40
>>879
世間知らず
882デフォルトの名無しさん:2011/09/04(日) 13:30:01.05
継承の使い道がいまいちわからない
883デフォルトの名無しさん:2011/09/04(日) 13:35:46.63
大手でも底辺
884デフォルトの名無しさん:2011/09/04(日) 13:51:57.04
業務系ソフトを作るならC#(とくかく楽)
速度を求められるソフトを作るならC++(ゲーム開発はこれいったく←【なぜか変換できない】)
本当に資源が限られたファームウェア開発とかならC(保険の意もかねて)
885デフォルトの名無しさん:2011/09/04(日) 17:56:50.92
次のデモが決まったよー
平日に昼にビジネス街!
女性の参加が多いデモです
ナイトの参加求む!!!

【平日に】花王本社デモ part10【突撃】
http://yuzuru.2ch.net/test/read.cgi/offmatrix/1314978585/

◆開催日について
日程 : 9月16日(金)   
時間 : 11時集合 スタート11時30分
集合場所 : 中央区坂元町公園
解散 : 浜町公園
ルート: 後日発表(水天宮は通ります)
雨天決行  荒天中止
886デフォルトの名無しさん:2011/09/07(水) 01:24:51.21
C++の速度が問題になるのは仮想テーブルのポインタを参照するからだろ
stlで処理速度が気になるなら、自前でありきたりなデータ構造実装しなおして、
テンプレートメタなプログラムでも書けば早いんでねーの?
最近の新しい言語を色々と齧ったおかげでか、実はc、c++だけで良い気がしてきたぞ
887デフォルトの名無しさん:2011/09/07(水) 02:20:46.34
リファクタリングさえし易ければ・・・
構文解析さえし易ければ・・・
888デフォルトの名無しさん:2011/09/07(水) 02:40:28.46
clangに期待しましょう
889デフォルトの名無しさん:2011/09/07(水) 10:30:21.48
本当に倉田ら無い質問ですけど。
STLのスタックってベクトルみたいにサイズ超えたらゼンコピじゃなくて?
リストみたいに一個ずつくっつけていく形式ですよね。
言い換えるならpushの時間は常に不変ですよね?
890デフォルトの名無しさん:2011/09/07(水) 10:37:06.74
第2テンプレートパラメータに依る
891デフォルトの名無しさん:2011/09/07(水) 11:01:44.12
じゃあ、デフォでお願い致します。
892デフォルトの名無しさん:2011/09/07(水) 11:27:27.66
stackのデフォのコンテナはdeque
893デフォルトの名無しさん:2011/09/07(水) 12:06:26.66
dequeのpush_backは定数時間なので
dequeを使ったstackのpushも定数時間です
894デフォルトの名無しさん:2011/09/07(水) 15:51:02.62
すいませんGCCのマクロの使い方の説明してあるサイトおしえてください。
895デフォルトの名無しさん:2011/09/07(水) 17:32:34.46
※次のレス参照

@では const ポインタを渡されるような条件・場合では、渡されたポインタが指す先を変更しない
クラス Hoge はコンストラクタで渡されたポインタ(pTarget)を対象に何かしらの処理をするクラスなんだけど、const と 非 const のどちらでも受け取れるようにしたい
どうやって記述するのがおすすめ?
896895:2011/09/07(水) 17:35:40.42
@
class Hoge
public:
 Hoge(Piyo * pTarget)
  : pTarget(pTarget) {}

private:
 Piyo * pTarget;
};

Piyo p;
const Piyo pc;
Hoge(&p);
Hoge(const_cast<Piyo *>(pc));

A
class Hoge
public:
 Hoge(Piyo * pTarget)
  : pTarget(pTarget), pTargetConst(NULL) {}
 Hoge(const Piyo * pTarget)
  : pTarget(NULL), pTargetConst(pTarget) {}
private:
  Piyo * pTarget;
 const Piyo * pTargetConst;
};

Piyo p;
const Piyo pc;
Hoge h1(&p);
hoge h2(&pc);
897895:2011/09/07(水) 17:38:28.20
あ、>>896は目標を達成できる記述の例であって、他の方法があれば教えて欲しい
898デフォルトの名無しさん:2011/09/07(水) 17:44:53.92
どっちでも受け入れるならconst操作しかしないんだろうと考えて
struct Hoge {
Hoge(Piyo const * p) : p(p) {}
private:
Piyo const * p;
};
どっちも受け入れて非const操作をするならバグの元なので別の方法を考える
899895:2011/09/07(水) 18:09:21.81
いや、そういう回答は要らないんで

非 const ポインタを渡されるパターンでは、渡されたポインタが指す先を変更する
const ポインタを渡されるパターンでは、渡されたポインタが指す先を変更しない
900デフォルトの名無しさん:2011/09/07(水) 18:10:24.15
ポインタと同時に変更するかどうかのフラグ持つだけでいいじゃない
901デフォルトの名無しさん:2011/09/07(水) 18:21:39.44
>>889,893
vectorでもlistでももちろんdequeでも末尾での挿入・削除は定数時間。
ただしここでいう定数時間は計算量が要素数には依存しないという意味で
処理時間が常に不変という意味ではなく、規格では具体的な処理時間についてはなにも保証しない。
902デフォルトの名無しさん:2011/09/07(水) 19:16:25.08
>>899
人が親切に馬鹿なことやめろって忠告してやってるのにね
独学じゃアホなコード大量生産するだけだぞ
903895:2011/09/07(水) 20:16:45.14
>>902
>>898
> Piyo const * p;
これは未熟者の自分からみて比較的珍しい、カッコイイ記述ですね
904デフォルトの名無しさん:2011/09/07(水) 22:44:33.98
うわ…
905デフォルトの名無しさん:2011/09/07(水) 22:55:29.80
>いや、そういう回答は要らないんで

↑こういう一言が余計で、そして態度悪い。
他人に、案なり答えなり尋ねてるんじゃないの?って言う。 人間性疑うわ
906895:2011/09/07(水) 23:14:20.40
>>905
お前は揚げ足取って
> struct Hoge {
> Hoge(Piyo const * p) : p(p) {}
> private:
> Piyo const * p;
> };
みたいな馬鹿な回答した奴を擁護するつもりか?
態度が悪い回答者が質問者を弄るのはよくある話だ
俺はその回答(?)者をさらっと投げ捨てただけだし、何も問題はない

そして質問内容は事故解決したから、もういい
下らない論争も勘弁
907デフォルトの名無しさん:2011/09/07(水) 23:23:28.83
>>906
もういいんなら消えろよ、ゴミレスしてねえで
もうよくねえんだろ? 毒吐きてえんだろ? おい便所虫
908デフォルトの名無しさん:2011/09/07(水) 23:25:27.80
>>906
擁護とかどっちの味方みたいな話じゃなくて、
実際に目の前でこんな話してたら、普通は相手が例え馬鹿な回答したとしても、
「すみませんが、そうではなくて」 と、「意図の説明」 をするだろっての。
伝わってなかったのかなと。 解決させたくて話しかけてるんだから。
どっちの擁護とか、そういう発想やめなさい
909895:2011/09/08(木) 00:28:22.36
>>898の回答が「解決させたくてしたレス」に見えるのか?
俺には人をおちょくっているようにしか見えない

1. 自分がそのおちょくりに対してガッカリしてしまった
2. >>898 がアホなレスをした
ただそれだけの話

>>907
安価されないor話題に飽きたら消えるよ
実は>>899を書いた直後に達成してた。それはもういいです
910デフォルトの名無しさん:2011/09/08(木) 00:34:14.26
>>909
違う。解決させたくて話しかけてるんだから、伝わらなかったら意図の説明するだろってのは、お前の事。
「どっちがおすすめ」 か聞きたかったから、このスレの人間に話かけたんだろ?
それで望まない返答もらったんだろ? その時、伝わってなかったのかなと、
もしも目の前で話をしてたら、質問の意図をお前は説明して、解決に向かおうとするだろ?

他人のことじゃなくて、お前自身の事だよ。自省と会話の話だよ
911デフォルトの名無しさん:2011/09/08(木) 00:36:32.31
そして >>898 のレスは、別におちょくったんじゃなくて、彼はそう思ったんじゃないの?
それに対して無礼な態度を取ったのは >>895 の方に見えるよ。読み返してごらんなさい
まるで自己中な子供だ
912デフォルトの名無しさん:2011/09/08(木) 00:44:05.61
まだ夏休みだっけ?
913デフォルトの名無しさん:2011/09/08(木) 00:47:58.89
>>909
なるほど、安価しておちょくって欲しいのかマゾ野郎
便所の落書きとコーラスがそんなに楽しいかいw
914895:2011/09/08(木) 00:56:41.35
>>895
>@では const ポインタを渡されるような条件・場合では、渡されたポインタが指す先を変更しない
(また、Aでは const ポインタと非 const ポインタ 2 つを保存しようとしているので、const・非 const 操作どちらとも使用としていることは明白)

>>898
>どっちでも受け入れるならconst操作しかしないんだろうと考えて ...
>... どっちも受け入れて非const操作をするならバグの元なので別の方法を考える

const操作しかしないんだろうと → まず質問をよく理解してないか、天邪鬼なレス
別の方法を考える → 思考停止、または質問の投げ捨て
だから必要無いと答えたんだよ?
915デフォルトの名無しさん:2011/09/08(木) 00:58:55.07
>>914
型消去とoperator ->使えばいいよ
これで完結なのでもう寝ようね
916895:2011/09/08(木) 01:02:21.37
あぁ、よく見たら最初から質問に答える気が無かったんだな

>>902
>人が親切に馬鹿なことやめろって忠告してやってるのにね
だからそういう(>>898)レスをしたんだね

そしてそこまで目標じゃないだろうに、何で止めてくれたのかね
917デフォルトの名無しさん:2011/09/08(木) 01:04:03.49
>>914
> まず質問をよく理解してない

何か悪いのかよ?
理解して欲しいのは誰だよ?

おまえ努力の方向が間違ってるんだよ
コンパイルエラーするたびに規格票を破り捨ててるようなものだ、ただのキチガイ
918デフォルトの名無しさん:2011/09/08(木) 01:04:44.76
大体この糞クラスをどこでどう有効活用するのかが気になる
919895:2011/09/08(木) 01:14:30.72
質問した内容が分からないのであれば、そう言ってくれなければ質問者も分からない
アプリが動きません><→windows再インストールしろ と同じレベルの回答をしておちょくられたから、
「あ、これは相手にされてないし、相手するのも無駄だな」と思った
馬鹿にされたから馬鹿にし返した。それだけの低レベルな話だろ

>>918
お前は糞ライブラリ糞クラスの改修を手伝わされる気持ちがわかりますか?
920デフォルトの名無しさん:2011/09/08(木) 01:18:17.70
このレベルの人間にライブラリ任せるのはまずいだろ
あ、任せるような企業だから>>896みたいなコードになるのか
921デフォルトの名無しさん:2011/09/08(木) 01:27:08.75
なんだ底辺だったのか
それなら心が荒んでもしょうがない
かわいそうに
922デフォルトの名無しさん:2011/09/08(木) 01:33:00.89
>>919

おまえ、こう言っただろ
> まず質問をよく理解してない
> そう言ってくれなければ質問者も分からない
どっちなんだ?

矛盾した話が通じないのは、その話をした者以外の誰にも責任ないぞアホ
923895:2011/09/08(木) 01:44:27.92
む、矛盾・・・?
どの内容がどの内容と矛盾しているのか教えてくれ。語尾に色々付けたがる君
924デフォルトの名無しさん:2011/09/08(木) 01:45:35.32
通りすがりにエスパー

質問者の質問内容が理解出来なかったら、回答者は「日本語でおk」と返せ

と言ってるんだろう
925デフォルトの名無しさん:2011/09/08(木) 01:47:54.91
>>919はなんで逆切れしてるの?質問する人間の態度じゃないよね
926デフォルトの名無しさん:2011/09/08(木) 01:48:22.63
>>923
はははは、世の中みんな「天の邪鬼」ばっかりで気の毒だねー
927デフォルトの名無しさん:2011/09/08(木) 01:50:46.65
お前ら明日も仕事だろ寝ろ
おれは休みなんで夜更かし(^^)
928895:2011/09/08(木) 02:03:48.06
>>924
お前はそれで心が許すのかもしれないが、俺が何かしらの質問に応答するときはそんなことは言わないな
答えられる可能性があるのであれば分からない点を質問者に尋ねる
答えられそうに無いのならそもそもレスしない

>>925
誰もキレていない。既に論争ごっこの場になってるだろ
本当にキレてるか、単なる・・・まぁいいや。そういう奴が1人紛れてるがな

はー流石に疲れた
そろそろ俺は抜けますよ。逃げじゃないっすよ?俺を逃げさせたら大したもんですよ
929デフォルトの名無しさん:2011/09/08(木) 02:11:10.76
自意識過剰もここまでひどいと病的だな

どこの馬の骨とも知らんやつが、どう応答したかろうが、疲れようが、逃げようが、公衆にとってどうでもいい
よっぽど聞いて欲しかったんだろうな、もっと身近な人に言えばいいのに
駅前で不特定多数を叱り飛ばしてる危ないオヤジそのものじゃんw
930デフォルトの名無しさん:2011/09/08(木) 08:07:09.60
逃げじゃないけど疲れたって……
まぁいいや、今日は何をほざいてくれるのか楽しみに待っていよう。
931デフォルトの名無しさん:2011/09/08(木) 19:59:32.58
環境依存かもしれませんがテンプレートの特殊化って数に上限はあるのでしょうか。
極端な話、1万くらい特殊化したクラスを作れるでしょうか。
932デフォルトの名無しさん:2011/09/08(木) 20:33:51.91
メモリ許す限り問題なかったはず、
再帰的な特殊化ならデフォルトオプションのVC++2010で約500前後が限界。
933デフォルトの名無しさん:2011/09/08(木) 21:04:43.45
>>901
亀レスだがvectorの末尾に追加は要素数に依存するんじゃないか?メモリの確保にいった場合
平均すると同じくらいの時間になるようになってるとかはあった気がするけど
934デフォルトの名無しさん:2011/09/08(木) 22:43:11.23
要するにどのような保証もできませんてことだろ
935931:2011/09/08(木) 22:58:03.63
>>932
ありがとう。普通の特殊化なので少し安心しました。
使ってるのがBCBでまだちょっと不安なので問題が起きた時
対処可能に書いときます。
936デフォルトの名無しさん:2011/09/08(木) 23:10:36.17
vectorの末尾追加は償却定数時間だな
937デフォルトの名無しさん:2011/09/09(金) 22:39:23.24
キャパシティをオーバーした時ってコピーが走るから定数時間ってのも変じゃね。
938デフォルトの名無しさん:2011/09/09(金) 22:55:54.90
動的配列への追加コストはなぜ O(1)?
ttp://chasen.org/~taku/blog/archives/2007/02/_o1.html
939デフォルトの名無しさん:2011/09/09(金) 23:16:38.91
空きが足りなくなるたび1024要素の領域をリストとして追加、
読み出し時にリストを結合して1配列化。
結合した領域に空きがなくなると、また1024要素の領域を
結合した領域に続けてリストとして生成。
こんなコンテナ作ったらO(1)のvectorより、たやすく10倍以上の速度を出せた。
しかし、最適化を書けたstringの+=には全く勝てんかった。
アレはどうなってんだ?化物みたいにはええぞ。
940デフォルトの名無しさん:2011/09/09(金) 23:54:23.98
>>939
そういうのは等価でない処理を比較してて結局正当な比較になってないことがほとんど。
941デフォルトの名無しさん:2011/09/10(土) 12:40:10.03
>>940
char型ないしintを放り込むなら、
stringで+=もvectorでpush_backも条件は同じじゃん。
char[]を突っ込んだりするなら話は別だろうけど。
942デフォルトの名無しさん:2011/09/10(土) 12:43:49.15
>>941
実際に比較に使ったコードを曝して味噌。
ついでに、コンパイラとコンパイルオプションもね。
本人は気付いていないところで等価になっていないんじゃないかと私も思うよ。
943デフォルトの名無しさん:2011/09/10(土) 13:04:43.80
stringで思い出したけど、
std::stringとMFCのCStringでは、どっちが速いのでせう?
944デフォルトの名無しさん:2011/09/10(土) 13:36:42.75
知らないけどその2つは速さで使い分けるもんじゃないだろ
945デフォルトの名無しさん:2011/09/10(土) 13:43:26.03
i18nとl10nが関係ないなら、比較対象になるかと思ったんですがね。
946デフォルトの名無しさん:2011/09/11(日) 00:23:58.57
qsort() はコピーが発生する時 1 バイトずつコピーして遅いから
std::sort() を使いなさいって言われた 16 歳の夏
947デフォルトの名無しさん:2011/09/11(日) 00:30:45.74
コールバック呼び出しのオーバーヘッドもあるな
948デフォルトの名無しさん:2011/09/11(日) 02:27:49.43
>>940
要素の追加が多くて参照が少ない という条件下なら
vectorよりも>>939のコンテナが速そうだと思うけどな

測定後ボトルネックがわかったら
特定条件下で速くなるようなコンテナを作ることはたまにあるよ
949デフォルトの名無しさん:2011/09/11(日) 09:13:26.57
可変長引数による文字列生成処理を自前で書く際、
Cならvsprintf()(かその安全化版)のお世話になると思うのですが(例↓)
int custom_varstring(char* buf, size_t n, const char* fmt, ...) {
 va_list ap;
 va_start(ap, fmt);
 int r = vsprintf(buf, fmt, ap);
 va_end(ap);
 return r;
}
いまどき固定長のバッファ(上の例のbuf)を呼び出し元で用意するとかダサい気がします。
C++のostream風にすっきりstd::stringな世界だけで解決したいのですがどうすればよいのでしょうか。
950デフォルトの名無しさん:2011/09/11(日) 09:22:41.53
>>949
バッファの確保をしながら vsprintf() を呼び出す関数を作るとか、
boost::format 採用するとか。
951デフォルトの名無しさん:2011/09/11(日) 09:43:56.47
>>950
dクス
バッファを確保しながらvsprintf()を呼び出す方向でやろうかと思います
よく考えたら、printf()風の書式指定とか引数省略記号"..."とかはCの世界の遺産なので、
C++の世界にそんなもん持ち込むからにはコードがダサくなるのも仕方ないかなという気がしてきた、、

可変長引数一般の実現について言えば、ostreamの<<演算子みたいなものを自前で実装して
呼び出す人にもそれを使ってもらえば良いわけだし(boost::formtの%もこの方針ぽい)
952デフォルトの名無しさん:2011/09/11(日) 13:02:49.79
可変長引数テンプレートを使おう
953デフォルトの名無しさん:2011/09/11(日) 16:44:35.81
>>942
ごめん。古い話だからコンテナ部分しか残ってないわ。
コンテナ晒すから、自分の納得するようにベンチしてみて。
あと、コンテナの内部的に使うことを目的としてたから、
バイトデータがベースでジェネリックじゃない。
そのへんも納得するようにやってみとくれ。
http://codepad.org/enAH4P4O

>>948
そうだね。参照は頻繁じゃなく、散発的な追加が多い状況を想定して作ったよ。
ま、それにしてもstringの+=の速さは異常。
954デフォルトの名無しさん:2011/09/11(日) 16:55:19.11
>>949
ostringstreamの事いいたいんじゃないの?
955TreeBoa君:2011/09/11(日) 23:38:34.89
http://www.heroesofnewerth.com/
これC++で作ってるらしいけどお前ら作れないの?
やっぱりLLしかできないの?
ネットワークプログラミングとかできないの?
956デフォルトの名無しさん:2011/09/11(日) 23:50:43.07
そんなおもちゃは作ってないけど、
CADは仕事で作ったな。
957デフォルトの名無しさん:2011/09/12(月) 00:05:48.05
>>955
それC++で作ってるらしいけど、料理出来ないの?車磨けないの?って言った?
958デフォルトの名無しさん:2011/09/12(月) 00:22:57.12
>>953
ttp://ideone.com/rtHEM
ttp://ideone.com/SWb1S
誤差が多くはっきりしないが、少なくともvectorより10倍速いとかstringの+=が必ずしも速いとかはいえなかった。

ちなみに上記のソースをウチのローカルで最適化かけて実行した場合は
arraysizeが12のときはstringの+=が最速、arraysizeが1234のときはreserveしたvectorが最速、という結果だった。
959デフォルトの名無しさん:2011/09/12(月) 00:30:27.55
>>958
そういやうちのコンパイル形式書いてなかった。これだけ。
gcc -O3 source.cpp

そっちはVC?
960デフォルトの名無しさん:2011/09/12(月) 00:46:08.50
codepad:
BinalyPool; 90000
vector<Byte>; 120000
vector<Byte>::reserve(cnt); 130000
deque<Byte>; 110000
basic_string<Byte> 120000

//面倒なんで型名省略
g++:
time: 70000
time: 130000
time: 150000
time: 100000
time: 120000

clang:
time: 60000
time: 140000
time: 130000
time: 100000
time: 100000

なるほどね。
前見たときは、string最強だったんだけど
なんか条件が違うんだろうね調べてみるわ。
961デフォルトの名無しさん:2011/09/12(月) 02:04:22.87
> string最強
basic_string& operator+=( const charT* s);
に途中に'\0'を含む配列を渡してて途中までしかコピーしてないと推測
962デフォルトの名無しさん:2011/09/12(月) 02:19:15.14
>>958
coutへのバッファリングまで含めた時間を計測してないか?

あと短い文字列の場合フリーストアではなくクラス内部のバッファを使う事があるかも
http://ideone.com/ryYPH
963962:2011/09/12(月) 02:35:30.19
あっ、下のURLは忘れてくれ
c_str()は内部バッファへのポインタを返すメソッドだと勘違いしてた
964958:2011/09/12(月) 09:10:17.73
reserveの値が間違ってた。cnt*arraysizeでないと意味ないな
ttp://ideone.com/ab4Ny
965デフォルトの名無しさん:2011/09/13(火) 08:23:35.88
class Hoge
{
 static const int DefaultValue = 3; // 1.1
 static int GetDefaultValue() { return 3; } // 1.2

 static const std::vector<int> EmptyVector; // 2.1
 static const std::vector<int> & GetEmptyVector()
 {
  static const std::vector<int> v;
  retrn v;
 } // 2.2
};

1.1 と 1.2、2.1 と 2.2 は、それぞれどちらを定義するべき?
場合によるのであれば、どういう条件で使い分けるべき?
966デフォルトの名無しさん:2011/09/13(火) 08:49:19.35
別にどっちでもいいけど
メンバ関数にした場合は、あとで中身をいじれるってよく言われるね
967デフォルトの名無しさん:2011/09/13(火) 08:55:43.45
空のvectorをコピーする意味が判らん。
clear()が用意されているんだからそれで充分じゃないのか?
もし必要なら、初期化するメンバ関数を用意してその中でclear()を呼べばいいし。
968デフォルトの名無しさん:2011/09/13(火) 08:57:10.66
馬鹿は無理して発言しなくていいです
969デフォルトの名無しさん:2011/09/13(火) 09:35:20.32
2.1と2.2のような使い方に関しては、
初期化タイミングをコントロールできる/できないという違いが
選択基準になることがあるかな。
970デフォルトの名無しさん:2011/09/13(火) 12:22:24.94
constexprがない環境だと1.1はコンパイル時定数として使えるが1.2は使えないからその辺を気にするときとか
int i1[DefaultValue]; // 可
int i2[GetDefaultValue()]; // コンパイルエラー
971デフォルトの名無しさん:2011/09/13(火) 12:40:43.05
コンパイル時に必要なら1.1
それ以外なら1.2と2.2
初期化のタイミングがいつでもいいならその日の気分で良い
972デフォルトの名無しさん:2011/09/13(火) 17:31:19.01
だれか つぎすれ たのむ
973デフォルトの名無しさん:2011/09/13(火) 17:40:46.81
断る
974デフォルトの名無しさん:2011/09/13(火) 20:04:44.87
立ててくる
975デフォルトの名無しさん:2011/09/13(火) 20:09:34.01
と思ったら無理だった 誰かたのむ

C++相談室 part91

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part90
http://hibari.2ch.net/test/read.cgi/tech/1310885439/

このスレもよろしくね。
http://hibari.2ch.net/test/read.cgi/tech/1299218426/

ついでに壁紙にしてね。
http://www.research.att.com/~bs/Bjarne.jpg
976デフォルトの名無しさん:2011/09/13(火) 20:10:18.16
誰だこのはげおやじ
977デフォルトの名無しさん:2011/09/13(火) 20:32:01.66
Bjarne Stroustrupの悪口はそこまでだ
978965:2011/09/13(火) 21:00:29.81
レスありがとう
初期化順序がどうでもいい変数については 1.1 または 2.1 の記述を使うようにします
979 忍法帖【Lv=40,xxxPT】 :2011/09/13(火) 21:25:23.19
>>978
空のvectorを返す理由を、馬鹿な私にも分かるように説明プリーズ。
980デフォルトの名無しさん:2011/09/13(火) 21:40:50.11
そもそもデフォルト値をクラスのメンバーで表現する事が変だけどね。
普通は、デフォルト値を表すオブジェクトを用意すべき。
それをクラスでやるかファクトリーの形で提供するかは
好きにしたらいいけど。
981デフォルトの名無しさん:2011/09/13(火) 22:10:23.47
>>975
テンプレこのままでいいの?
二つ目のスレdat落ちしてるみたいだが
982デフォルトの名無しさん:2011/09/13(火) 22:53:48.99
>>981
【初心者歓迎】C/C++室 Ver.76【環境依存OK
http://hibari.2ch.net/test/read.cgi/tech/1312621728/
983デフォルトの名無しさん:2011/09/13(火) 23:00:20.76
んじゃちょっとだけ立ててくる
984デフォルトの名無しさん:2011/09/13(火) 23:03:47.65
985デフォルトの名無しさん:2011/09/13(火) 23:04:47.38
>>979
あれじゃね、constだし空のオブジェクトを単一にして節約みたいなことすんじゃね。
そこまで考えてないと思うけど。

map["key1"] = &Hoge::EmptyVector;
map["key2"] = &Hoge::EmptyVector;
map["key3"] = &Hoge::EmptyVector;
map["key4"] = &Hoge::EmptyVector;
map["key5"] = &Hoge::EmptyVector;

std::vector<int> instance;
map["key2"] = &instance;

みたいな。
986デフォルトの名無しさん:2011/09/13(火) 23:26:06.34
std::vector<int>を使うことを承知している(=Hogeに閉じ込めない)のなら、
std::vector<int> EmptyIntVector;
map["key1"] = & EmptyIntVector;
で何がいけないんだ?
やっぱり判らん。
987デフォルトの名無しさん:2011/09/13(火) 23:26:19.65
>>984
おつ
988デフォルトの名無しさん:2011/09/13(火) 23:33:48.23
>>986
間違えたconst std::vector<int> instance;ね。
参照しかしないならチビッと意味があるだろうね。
あとnullの代わりに&EmptyVector == map[key];って事が可能ではある。
俺ならそういう用途にvector自体を使うことはないけど。
なんらかのNullオブジェクトを用意するわ。
989デフォルトの名無しさん:2011/09/13(火) 23:36:39.73
単純にメモリを解放するためじゃね?
代入よりswapを使うことが多いと思うけど
990デフォルトの名無しさん:2011/09/14(水) 00:11:07.70
うめ
991デフォルトの名無しさん:2011/09/14(水) 00:18:55.00
例えとして空のヴェクたを出しただけで実際はなんか値が入ってるんだろ
サンプルコードのスミまでつついて揚げ足とろうとやっきになるのはム板住民の悪癖だ
992デフォルトの名無しさん:2011/09/14(水) 00:29:12.16
しゃあない。ヴェクた使いだらけのム板だもの。
993デフォルトの名無しさん:2011/09/14(水) 00:30:32.40
つか代入じゃメモリは解放されない気がしてきたから>>989は忘れてw
994デフォルトの名無しさん:2011/09/14(水) 00:33:06.37
>>991
そんな殺伐とした雰囲気が良いんじゃねえか。女子供はすっこんでろ。
995デフォルトの名無しさん:2011/09/14(水) 07:35:11.67
うめ
996デフォルトの名無しさん:2011/09/14(水) 10:27:44.68
ume
997デフォルトの名無しさん:2011/09/14(水) 11:23:06.35
うめ
998デフォルトの名無しさん:2011/09/14(水) 11:57:08.27
うめ
999:2011/09/14(水) 15:11:59.29
四十年勤め上げた会社を退職し早二十年、何やら張り合いの無い日々を送る内、大学生の孫に「退屈しのぎに行って見たまえ」と勧められた2チャンネル。
当初は「こんな電腦掲示板、何たる幼稚加減」と馬鹿にしていたものの、行って見ると存外に面白い。
華やかな色彩の髪と目を持つうら若き乙女に「ゆとり乙」と何度と無く罵られるにつけ、食うや食わずで慌しく過ぎ去った学生時代が自ずと思ひ返され、「戦争さえ無ければ、小生もこのような青春が送れたやも知れぬ」と独りごちることもしばしば。
すっかり虜となつた今では、孫の部屋から白銀色のノートパソコンをせしめては書斎に篭り存分に「祭り」を堪能する毎日を送っている。
同年代の友人達が痴呆や重い病に悩まされるなか、老いて尚矍鑠としてオフ会に向かう事が出来るのも、ひとえに2チャンネルのおかげかと思えば、再三に渡る「半年ROMってろ」の罵り文句も、何やら「まだまだ死ぬには早いよ」と言われているようで愉快極まりない。
ひとつ間違えれば自らが乗り込んでいた機体と同じ名前を持つコテハンに出会える日を樂しみにしつつ、今日もディスプレイに向かう。
それでは、壱千ゲット。「原文は.batスレ」
1000デフォルトの名無しさん:2011/09/14(水) 15:12:47.89
うめ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。