[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/14 14:02 / Filesize : 217 KB / Number-of Response : 865
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part71



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

前スレ
C++相談室 part70
pc12.2ch.net/test/read.cgi/tech/1244942050/l50

57 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 02:30:41 ]
いやいや、SetPropとかSetWindowLongPtr使えってテンプレ回答では?

58 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 13:30:12 ]
>>57
そういうことか
メッセージループでswitch文書きたくないのかと思った

59 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 14:30:01 ]
 ある関数void foo(unsigned int num)内の出来事。
 引数numに格納された値を使って、
 char* array = new char[num];
 として確保して使いたい。
 ところが使用後(fooスコープを脱出後)には自動的に破棄されるようにしたい。

これを実現するのに一番簡単な方法は何でしょうか?
デストラクタを利用して出来そうな気がするのですが。
よろしくお願いいたします。

60 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 14:35:52 ]
std::vector<char> v(num);
char *array = &v[0];

61 名前:59 mailto:sage [2009/07/24(金) 15:01:42 ]
>>60
なるほど、vectorの内部の配列は連続していることが保証されているというのを使うわけですね。
ありがとうございました。

62 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 15:04:43 ]
#include <boost/scoped_array.hpp>

boost::scoped_array<char> s( new char[num] );
char *array = &s[0];

これだとダメかな?
知ってる人いません?


63 名前:62 mailto:sage [2009/07/24(金) 15:13:36 ]
char *array = s.get();
でしたね。
失礼。

64 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 15:56:38 ]
後でサイズ変更しないならいいんじゃねぇの

65 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 16:12:04 ]
int型のベクターの初期化で楽な方法ってありますか?
int配列はint a[]={1,2,3}みたいにかけるので
今は一時的にint配列をつかってこんな風にやってるんですが

vector<int> v;
int d[]={1,3,2,5,6,17,8,0,2};
copy(d,d+sizeof(d)/sizeof(d[0]),back_inserter(v));




66 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 16:17:38 ]
vector<int> v(&d[0], &d[sizeof(d)/sizeof(d[0])]);

67 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 17:03:00 ]
ありがとうございました

68 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 20:17:36 ]
boostにそれ用のコーポネントがある。
boost::assignでぐぐれ

69 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 20:55:51 ]
C++ code - 39 lines - codepad
ttp://codepad.org/6eGTAvJT

ここにある関数
call_display_1(&d);
call_display_2(d);
call_display_3(d);
のうち、call_display_1とcall_display_3はdisplay()が仮想関数として
定義されているので挙動は理解出来ます。
call_display_2(d);
は、引数をconst参照で受け取っていますが、これでも仮想関数は必ず有効で
標準出力に"Derived Class."が出力されると保証されていますか?

「参照はポインタを使って実装されている」
と聞いたことがありますが、こういった実装上の理由ではなく、
標準C++の仕様上確かに保証されていますか?


70 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 22:16:23 ]
はい

71 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:46:26 ]
色々やってみたけど結局templateでjavaジェネリクスのextends条件はできませんでした。

72 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:41:50 ]
こんなのどうよ
class A {};
class B : public A {};
class C {};
template <typename T> class X {
public: X(){
T *t = 0;
A *a = t; // Aの派生クラスでなければここでERROR
}};
int main() {
X<A> a; // OK
X<B> b; // OK
X<C> c; // ERROR
}

73 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:51:32 ]
>>71
じゃあJavaに変えると良いよ。
スレ違い。

74 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:56:28 ]
Boost.ConceptCheckのConceptAssertとTypeTraitsのisBaseOfでできるな

75 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:56:40 ]
// boostだとこうなる。参考書丸パクリだが
#include <iostream>
#include <typeinfo>
#include <boost/type_traits.hpp>
#include <boost/utility/enable_if.hpp>
template< typename sub_class, typename super_class, class = void >
class X{
public: X()    { std::cout << typeid(sub_class).name() << _T("は、") << typeid(super_class).name() << _T("の派生型ではありません。") << std::endl;}
};

template< typename sub_class, typename super_class >
class X< sub_class, super_class, typename boost::enable_if< boost::is_base_of< super_class, sub_class > >::type >{
public: X()    { std::cout << typeid(sub_class).name() << _T("は、") << typeid(super_class).name() << _T("の派生型です。") << std::endl;}
};

struct A{};
struct B : A{};
struct C{};

int _tmain(int argc, _TCHAR* argv[])
{
    X< B, A > x0;   // strect Bは、strect Aの派生型です。
    X< C, A > x1;   // strect Cは、strect Aの派生型ではありません。
    return 0;
}



76 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:17:15 ]
>>71
C++のtemplateは黒魔術だから、大抵何でもできる。
というか、お前釣りだろ?w
alfalfa.livedoor.biz/archives/51489493.html

最近、知ったか房みてるとどうしても↑に思える

77 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:43:04 ]
>>76
まさに真理だなw

黒魔術というか、テンプレートメタプログラミングはチューリング完全だから
効率を気にしなければ他のプログラミング言語で実現出来ることは何でも出来る。

78 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:04:03 ]
>>77
むしろ実行効率は良いという、恐ろしいことが証明されているんだよね。
ただし開発効率は発狂物だろうがww

79 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:11:28 ]
という事は超頑張ればコンパイル時にMP3を鳴らす事も!・・・

80 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:12:55 ]
>>79
本当にやってるヤツが世界にはいるのではないだろうかw


81 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:15:58 ]
C++ code - 169 lines - codepad
ttp://codepad.org/0JbIj2qe

ここにあるコードを
Windows XP HomeEd SP2
g++ (GCC) 3.4.5 (mingw special)
でコンパイルして実行したところ、
「実行時エラー」
になりました。
本来は上記のサイトにあるようにコンパイル時エラーになって欲しい物ですが、
どうして実行時エラーになってしまうのでしょうか?

ちなみに意図的にコメントアウトしてある
// friend bool operator == (const MyInt& lhs, const MyInt& rhs){return lhs.num==rhs.num;}
の部分をコメント解除すると問題無く動作するようになります。


82 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:07:19 ]
初心の者ですが、派生クラスのコンストラクタで悩んでいます。
派生クラスのコンストラクタをクラスを定義するスコープの外で定義することは可能でしょうか。

class Base {
private:
int x;
public:
Base(int x);
};
Base::Base(int x)
{
this->x = x;
}

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

Derived::Derived(int x, int y) : Base(x)
{
this->y = y;
}
ではコンパイラから叱られてしまいます。どのように書けばいいのでしょうか。

83 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:20:49 ]
public:
Derived(int x, int y);

84 名前:69 mailto:sage [2009/07/25(土) 20:14:00 ]
>>70
ありがとうございます。

85 名前:81 mailto:sage [2009/07/25(土) 20:16:29 ]
自決しました。

どうやらコンパイラ(g++ (GCC) 3.4.5 (mingw special))の仕様のようです。
バグって言い切っていいのかは分かりませんが。


自決方法
  Windows XP HomeEd SP2
  g++ (TDM-1 mingw32) 4.4.0
  この環境でなら問題無く動作するようになります。




86 名前:71 mailto:sage [2009/07/25(土) 20:30:16 ]
>>73すみません
>>74-76ありがとうございます。そしてごめんなさい。
使用コンパイラがbcc5.5なのですが、is_base_ofの中核部分だけを取り出して
コンパイルした結果、bccではうまく判別できず、VC2008ではうまく判別できました。
どうやらbccでは定数の初期化式に関数の呼出し等があると、コンパイルは通っても
値は0?とかになってしまうようです。だめですね…

87 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 20:39:40 ]
>>85
死ぬな死ぬなw

88 名前:82 mailto:sage [2009/07/25(土) 21:42:32 ]
>>83
ありがとうございました。

89 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 22:58:33 ]
std::maxのような関数テンプレートは
どの標準ヘッダに定義されていますか??

90 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:09:41 ]
algorithm

91 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:11:15 ]
>>85
いろいろ問題がありそうなコードだけど
コンパイルエラーになることが、
"問題無く動作する"ってことなの?

92 名前:85 mailto:sage [2009/07/25(土) 23:36:04 ]
>>91
> コンパイルエラーになることが、
> "問題無く動作する"ってことなの?
はい、g++としてはコンパイル時エラーで教えてくれる方が
正しい挙動だと思いまして。

> いろいろ問題がありそうなコードだけど
例えばどこが問題でしょうか?



93 名前:89 mailto:sage [2009/07/25(土) 23:37:04 ]
>>90
ありがとうございます!!

94 名前:85 mailto:sage [2009/07/25(土) 23:41:38 ]
>>91
> いろいろ問題がありそうなコードだけど

#define OPERATOR_MY〜〜
などのマクロが登場していることや
public :
int_t num;
の様にメンバが丸裸のpublicアクセス指定されている事

以上2点はサンプルコードだからです。
さすがにこんなクソコードは実務では書きません。

なんか後出しじゃんけんみたいになってしまって恐縮です。
申し訳ありません。

95 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:18:43 ]
自決でビール吹いたw



96 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:52:39 ]
>>87を見るまで気づかなかったw

97 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 03:51:31 ]
自決やべー後からくるわ。

98 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 10:11:31 ]
自決しました
より
自決方法
にじわじわくる

XPとg++でどう死ぬんだと

99 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 14:57:26 ]
未定義動作とか使うんだろうかw

100 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:15:11 ]
鼻から出てきた百足に目を食い破られて死ぬんじゃないかなぁ

101 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:27:56 ]
それ自決じゃない
自決といえばdelete thisだろ

102 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 13:27:12 ]
>>101
うちの会社でよく見るコードだわ
なんとか動いてるけど恐ろしい・・・

103 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 13:28:30 ]
delete thisは使い方さえ間違わなければ合法だよ

104 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 18:47:24 ]
>>103
そうなんだけど、よくわからんやつが適当にいじると
そのあとメンバ触ってあぼんぬとかよくあるからさ
おまけにそのデバッグやらされるの俺だし

105 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 19:22:22 ]
今ならコンストラクタをprivateにして、shared_ptr返すファクトリ関数作る
delete thisは過去の遺物だな



106 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 21:55:34 ]
delete thisって何だ?
初めて知ったんだが。

ファクトリメソッドやshared_ptrなどは知っています。
delete thisは俺が新参者だから知らないだけか?

107 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 22:13:43 ]
delete p;
とかと一緒
thisを削除

108 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 22:20:01 ]
delete thisは、COMみたいに自分で寿命を管理するときに使う。
まぁ、前時代的な実装だね。

109 名前:106 mailto:sage [2009/07/27(月) 22:53:58 ]
ふーん。
そうなんだ。
思い返してみたけどやっぱ見たこと無ねぇな。

まあ理解しなくても良いよね。
どーも。

110 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:00:07 ]
boost::intrusive_ptrの使用例を検索してみると、
delete thisを見られるよ。

111 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:39:11 ]
Stateパターンで遷移後状態を返す直前に自状態を始末する際に
delete thisすることが多かったかな。最近はsmart pointerを
使うことが多くなったが。

112 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:53:21 ]
delete this じゃないが
デストラクタを明示的に呼ぶコードってのはたまーに使うな。
まあ大半の人が、STLコンテナの内部で使われているのを利用しているが。

113 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:56:11 ]
>>112
そうそう、デストラクタって明示的に呼べるんだよね。
いつ使うのか全然しらない。

114 名前:112 mailto:sage [2009/07/28(火) 12:00:42 ]
つながりの無い事柄みたいになっちゃったが、
要は

void T::reconstruct() {
 this->~T();
 new (this) T();
}

から連想したんだ。許してくれ。

115 名前:デフォルトの名無しさん [2009/07/28(火) 13:30:04 ]
C2227のエラーが出て解決できないのですが、どういうことが理由なのでしょうか



116 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 13:43:42 ]
>>115
たぶんVCなのだと思うが、だとすれば、間接参照不可能なポインタ変数を
間接参照しようとしているから。
これ以上はソースを見ないと言い様が無い。

117 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:28:43 ]
間接参照不可能なポインタ変数を間接参照することは問題ないだろ。
問題なのは、間接参照不可能なポインタ変数を使って間接参照することだ。

118 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:33:09 ]
日本語でおk

119 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 15:04:59 ]
>>118
じゅうぶんわかる。
間接参照不可能なポインタ変数を間接参照することは問題ないね。

120 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 16:32:18 ]
いやまて
間接ポインタ変数を間接参照不可能な参照で間接参照にすることは問題なんじゃないか?

121 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 16:52:12 ]
間接参照不可能なポインタ変数ってvoidポインタのことでしょ?
->演算子でアクセスできないことも間接参照不可能っていうの?

122 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 17:25:55 ]
>>121
じゃあやっぱり>>117でいいよね

123 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:39:08 ]
MyClassクラスのテンポラリオブジェクトを返す関数の戻り値は
const MyClass& temp
で受け取って束縛しても大丈夫ですよね?
そのスコープから外れるまでは有効ですよね?


124 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:44:51 ]
テンポラリオブジェクトを返す関数のスコープを抜けるまで有効です。

125 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:55:30 ]
関数の戻り値をconst指定しておけば、参照変数が生きてる間束縛される



126 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:57:08 ]
>>125
> 関数の戻り値をconst指定しておけば
おかなくてもだろ?

127 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:16:15 ]
え、まじで?無知ごめん

128 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:17:44 ]
っていうか、そうだよね。constは関係ないね。
ちょっと考えれば分かる話でしたorz

129 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:21:30 ]
>>113 placement new したオブジェクトを消すとき

130 名前:123 mailto:sage [2009/07/28(火) 19:53:50 ]
みなさんありがとうございます。

131 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:57:50 ]
>>129
placement deleteじゃだめなの?

132 名前:デフォルトの名無しさん [2009/07/28(火) 20:02:53 ]
λ式ってブースト使わないと利用不可?

133 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:03:33 ]
placement deleteはデストラクタを呼ばないから、自分でデストラクトする必要がある。

134 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:12:21 ]
>>132
Visual C++ 2010
msdn.microsoft.com/ja-jp/library/dd293608(VS.100).aspx

135 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:14:55 ]
>>132
Intel C++ 11
www.xlsoft.com/jp/products/intel/compilers/




136 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:31:30 ]
ラムダ式なんてオタのオナニー道具です
使っちゃいけません

137 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:45:26 ]
>>134-136
俺の明日はどっちだ…

138 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:57:23 ]
>>132
ラムダはちょっとしたところで使うなら便利。
あまり多用すると自分が困るかもしれないがね。

結局は使いようなんだが。

139 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:58:46 ]
>>133
そうなのか。
ありがとう。



140 名前:132 mailto:sage [2009/07/28(火) 21:02:17 ]
あり^^

141 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:33:50 ]
データを出力するときにn行おきに空行を入れたいのですがどうすればいいですか?

142 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:39:22 ]
繰り返しつかえばあ

143 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:58:48 ]
>>141
帰れ。
バカ過ぎる。

144 名前:デフォルトの名無しさん [2009/07/28(火) 22:23:37 ]
for(int i = 0; i < num; i++)
{
cout << line[i] << endl;
if(i % n == n-1) cout << endl;
}

145 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:34:37 ]
>>144
やってみます



146 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:41:16 ]
なんかもっと初心者向けのスレに行けば?
たぶん宿題だろうし

147 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:58:31 ]
あっそ

148 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:22:02 ]
そういう態度は失礼だってママに言われなかった?

149 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:32:48 ]
ママは彼が物心つく前に鬼籍に入りまして。。。

150 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:43:08 ]
今日からパパがママよ!

151 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:50:33 ]
>>150
ぎゃ^

152 名前:デフォルトの名無しさん [2009/07/29(水) 08:51:51 ]
struct Point
{
int x;
int y;

Point(int x, int y) : x(x), y(y) {}
};

struct Size
{
int width;
int height;
};

Size Hoge()
{
Point point;
...
return *reinterpret_cast<Size *>(&point); …(1)
return *reinterpret_cast<Size *>(Point(0, 0)); …(2)
}

例が良くないかも知れないのですが、
この書き方ってC++におけるインスタンスの
生存期間的に問題はあるでしょうか?

153 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 09:10:29 ]
>>152
(1)はダメ
Hoge()を抜けた途端にpointのインスタンスが消滅してしまう

154 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 09:12:08 ]
あほくさ

155 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 09:29:33 ]
>>152
(1) はコピー返しなので問題ない
(2) は生存期間以前にポインタでないものをポインタにキャストしてるから滅茶苦茶なことが起きるだろう




156 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 13:00:03 ]
>>126
いやいや、一時オブジェクトを束縛して寿命を延ばす効果があるのはconst参照だけだろ。

157 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 13:44:20 ]
戻り値がconstである必要は無いというお話






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<217KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef