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


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

C++相談室 part47
251 名前:デフォルトの名無しさん :2006/02/18(土) 22:54:11
>>250
多分問題ないと思う。

252 名前:デフォルトの名無しさん :2006/02/19(日) 00:14:28
>>250-251
動作に問題は無いだろうが、可読性に問題があると思う。

std::auto_ptr<Hoge> p(new Hoge);
Hoge& foo = *p;

こんなんじゃダメなの?

253 名前:デフォルトの名無しさん :2006/02/19(日) 00:18:37
>>248
g++ ではコンパイルできなかったので、よくない。
本題ではないが main() の戻り値を省略してるのもコンパイルエラーになった。

254 名前:248 :2006/02/19(日) 00:25:19
>>253
やはりそうですか。

main()はもちろん、貼り付けるための省略です。
return書くと、一行増やさないと読みづらいですし。


VC++どうなっているんだろう。
メンバの特殊化には、template<>を省略してもおk
クラスの特殊化には、省略できない(でも、ちゃんと意図を認識できているようなエラーメッセージを吐く)

template<>がなくても受け付けるような、
文法のルールを実装していそう。

なんでメンバでは省略を許しているのか不明ですが。

255 名前:248 :2006/02/19(日) 00:36:49
話は変わりますけど、main()でコンパイルエラーになるのはいいですね。
VCは以下が全部、問題なく通る……。

main() {} //まあ、K&Rだし
main() { return 0 ; } //これは、まあ、Cという歴史的理由で通るというのも分かるかな。
void main() {} //これはありえない。



int main() {}
ただこれは、禿の解説を見るに、問題なさそうなんですが。

ttp://www.research.att.com/~bs/bs_faq2.html#void-main

 >In C++, main() need not contain an explicit return statement. In that case, the value returned is 0, meaning successful execution. For example:

256 名前:デフォルトの名無しさん :2006/02/19(日) 00:48:23
>>255
戻り値の省略は規格で認められていない。 VC が緩いようだ。
return の省略は禿の言うように規格で認められていて、動作も決まっている。

257 名前:デフォルトの名無しさん :2006/02/19(日) 00:49:03
>>254
VC8.0 では、/Za で言語拡張をキャンセルすると、template<> のないメンバの特殊化体定義はエラー(C2906)になる。


258 名前:248 :2006/02/19(日) 00:55:48
>>257
VC7.0と7.1も同じなようです。
MS独自のものだったんですか……。

259 名前:デフォルトの名無しさん :2006/02/19(日) 00:57:36
Effective C++の第3版って日本語予定ありますか?


260 名前:デフォルトの名無しさん :2006/02/19(日) 01:02:41
>>259
今のところ無かったはずだが
まだ店頭在庫で改訂2版置いてるところ結構あるから探して買うが吉

261 名前:・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/19(日) 02:24:40
More〜の訳がマシなやつキボン

262 名前:デフォルトの名無しさん :2006/02/19(日) 12:08:23
>>261
原文(英語)のも買えば解決。もしくは(ry

263 名前:デフォルトの名無しさん :2006/02/19(日) 13:15:57
Effective C++の第3版はどうなってるか興味あるな
(Boostの紹介があるのがすげえとか見たけど
Boostとあろうものがそれくらいで歓喜するなよと)
C++すっかり変わってしまったから

264 名前:デフォルトの名無しさん :2006/02/19(日) 14:00:26
>>263
英語版を見る限り、boostに関する内容はないようだ。
templateに関する項目は確かに増えているが、これだけなら、
C++ Templatesの方がずっと詳細だし、やっぱりEffective
シリーズは初心者向けという色合いが強いように思える。

もちろん日本語版が出たらそれも買うつもり。

265 名前:デフォルトの名無しさん :2006/02/19(日) 21:31:20
・どうやって、C++で作ったプログラムをUNIXでシステム化するのか。
・クライアントがVCで、サーバがC++の時に、
 どうやってデータのやりとりを行うのか。
・なぜ、C++でOracleとの連携が取れるのか。

そういう情報が載っているサイトや本を教えて下さい。

266 名前:デフォルトの名無しさん :2006/02/19(日) 21:36:12
釣り?

267 名前:デフォルトの名無しさん :2006/02/19(日) 22:31:46
>>265
http://www.google.co.jp/search?hl=ja&q=visual+C%2B%2B+oracle&lr=

268 名前:265 :2006/02/19(日) 23:12:34
釣りではありません。
本当にわからないので、知りたいんです。
ですから、勉強できる本やサイトが知りたいんです。

269 名前:デフォルトの名無しさん :2006/02/19(日) 23:21:52
ネタにマジレスしてすまんな・・・

>>268
> C++で作ったプログラムをUNIXでシステム化
「プログラムをシステム化」って何だ?

> クライアントがVCで、サーバがC++の時にどうやってデータのやりとりを行うのか。
今まで一度も「クライアントがVC」なんて条件聞いたことないわけなんだが、
ま、普通にTCPとかUDPとかでいいんじゃない?

> なぜ、C++でOracleとの連携が取れるのか。
Oracleが外部にプログラムインタフェイスを公開してるからじゃない?

サイト調べるよりまずググり方学んできた方が・・・

270 名前:デフォルトの名無しさん :2006/02/19(日) 23:26:33
釣り臭いポイント

・質問が複数ある。
・どの質問も微妙にスレ違い。
・VCとC++を違うものとして扱ってる。
・一見、明確な質問のようだが、
 よく見ると自分がどの程度わかっていて、
 どういったことが疑問なのかさっぱりわからない。

271 名前:デフォルトの名無しさん :2006/02/19(日) 23:28:09
総合すると

      エンジニア視点ではなく、ユーザ視点で見てる

ってことかな・・・

272 名前:デフォルトの名無しさん :2006/02/19(日) 23:31:21
>>271
だね。

>>265
意地悪するつもりはないが、俺たちじゃ君の力にはなれそうにありません。
まずは、書店にでも行って自分がわかるレベルの書籍を探してください。

273 名前:デフォルトの名無しさん :2006/02/19(日) 23:48:56
全く同じtypedefを二度以上するのは問題ですか?
たとえばこんなの
typedef int Int;
typedef int Int;
VCだと全く何も言われないんだけど。

274 名前:デフォルトの名無しさん :2006/02/19(日) 23:53:02
typedef って宣言扱いだっけ?
宣言なら何度でもOK
定義なら一回だけ。

275 名前:265 :2006/02/20(月) 00:22:28
いや、基本はUNIXでC++で製造したプログラムがなぜ動くのかを知りたいんです。
自分は、ライブラリを作っているだけなのに、
何で動いているのかを知りたいんです。

276 名前:デフォルトの名無しさん :2006/02/20(月) 00:22:59
>>275
ktkr!!!!!!!!!!!11111111111
トリつけろ、お前面白いwwwww

277 名前:デフォルトの名無しさん :2006/02/20(月) 01:09:04
>>275
http://www.amazon.co.jp/exec/obidos/ASIN/4822281493/
http://www.amazon.co.jp/exec/obidos/ASIN/4822281019/
とりあえず、このへんの本でも読んどけ。

>>276
おちつけw

278 名前:デフォルトの名無しさん :2006/02/20(月) 01:12:25
>>275
そんなことも知らないでプログラム動かしてたのかよ・・
仕方ないから教えておいてやる
一回しか言わないからな、しっかり記憶しておけよ

これで動いています
ttp://www.amazon.co.jp/exec/obidos/ASIN/B000059HU5/qid%3D1140365474/503-1346873-8247132

279 名前:277 :2006/02/20(月) 01:16:16
マジレスした俺は負け組ですか?

>>275の様子からするとやっぱり俺は
負け組ってことになりそうな予感・・・orz

280 名前:デフォルトの名無しさん :2006/02/20(月) 01:16:38
>>275
まずはUNIXがなぜ動くのかから疑問に思え。

281 名前:デフォルトの名無しさん :2006/02/20(月) 01:35:05
こんな天然物は最近珍しいな。大切にしようぜ。

282 名前:デフォルトの名無しさん :2006/02/20(月) 03:19:54
複数のiteratorとかchar*とかをひとつのiteratorと見せかけれるものはありませんか?

std::vector buf;

void f(char* s, int n) {
 typedef std::istream_iterator<char> input_iterator;
 std::copy( input_iterator(source), input_iterator(), std::back_inserter(buf) );  // これと
 std::copy( buf.begin(), buf.end(), s );                          // これを一回で済ませたいです
}

がんばれば自分で作れなくもないと思うのですが、標準やboostとかで用意されてるものがあればそちらを使いたいです

283 名前:デフォルトの名無しさん :2006/02/20(月) 03:24:40
>>282
標準にはない。
Boostにもその機能そのものはなかったと思う。

284 名前:デフォルトの名無しさん :2006/02/20(月) 09:04:48
>>282
boostにzip_iteratorというのを見つけた

285 名前:デフォルトの名無しさん :2006/02/20(月) 09:09:44
>>282
std::vector<char> buf なら、別に char* にコピーする必要無いと思う。

286 名前:デフォルトの名無しさん :2006/02/20(月) 13:34:45
>>284
zip_iteratorは282がやりたいことには使えない

287 名前:デフォルトの名無しさん :2006/02/20(月) 16:19:44
>>282
その例ならそもそもsource.readを使ったら駄目なのか?

288 名前:デフォルトの名無しさん :2006/02/20(月) 17:16:25
複数のイテレータをメンバに持って、それらすべてに同じ操作を適用するような
multi_iteratorを書けばいいかもしれない。
boost/iterator_facadeあたりを使えば多少は楽に。

class multi_iterator : public boost::iterator_facade<...> {
 typename some::iterator& s;
 typename other::iterator& o;
 increment() { ++s; ++o; }
...
};

クラステンプレートにすれば任意のイテレータを複数持てる。
イテレータの数を任意にしたければ、mpl/BOOST_PPでの自動生成で。
dereference()等ではstd::map()で返すとか。問題多そうだが。

289 名前:デフォルトの名無しさん :2006/02/20(月) 17:18:45
質問者の最初の書き込みにすでにそういうことが書いてあった。駄レススマソ

290 名前:デフォルトの名無しさん :2006/02/20(月) 17:23:31
>>287
istream_iterator<char>は空白を読み飛ばすから、readじゃ代用できない。

291 名前:デフォルトの名無しさん :2006/02/20(月) 18:06:37
function_output_iteratorを使って書いてみた。使いかたに癖があってあまり便利じゃないかも。

template <typename T> inline void output(boost::tuples::null_type, const T &) {}
template <typename Cons, typename T> inline void output(Cons &c, const T &x)
{
  *c.get_head() = x;
  ++c.get_head();
  output(c.get_tail(), x);
}

template <typename Tuple> struct replicator
{
  replicator(const Tuple &t) : iters(t) {}
  template <typename T> void operator()(const T &x) const { output(iters, x); }
private:
  const Tuple iters;
};

template <typename Tuple> boost::function_output_iterator<replicator<Tuple> > make_broadcast_iterator(const Tuple &t)
{ return boost::function_output_iterator<replicator<Tuple> >(replicator<Tuple>(t)); }

int main()
{
  char *s = new char[1000];
  std::vector<char> v;
  typedef std::istream_iterator<char> iic;
  std::back_insert_iterator<std::vector<char> > ins(v);
  char *p = s;
  std::copy(iic(std::cin), iic(), make_broadcast_iterator(boost::tie(ins, p)));
}

292 名前:デフォルトの名無しさん :2006/02/20(月) 18:14:38
gccのgompはどこからダウンロードできるのでしょうか?

293 名前:デフォルトの名無しさん :2006/02/20(月) 19:15:52
branchの方に普通にあったと思ったけど?

294 名前:デフォルトの名無しさん :2006/02/22(水) 17:06:17
たとえば、

sql_alias x1, x2;

sql_expr expr =
select( x1["a"], "b", "c", "d" )
.from[ inner_join( x1 = "table1" ), ( x2 = "table2" ), x1["a"] == x2["a"] ]
.where( x1["a"] == _1 && between( "b", 1, 10 ) )
.order_by( desc( x1["a"] ) );

string sql4ora = gen_oracle( expr );
string sql4mssql = gen_sqlserver( expr );

みたいな、C++によるλライクなSQLジェネレータを作るとしたら
需要あるのだろうか?


295 名前:デフォルトの名無しさん :2006/02/22(水) 18:13:05
たぶん漏れが知らないだけだろうけど、対象SQLサーバによらず同じコードですむ
(PHPでいうPEAR::DBのような)フリーのC++用データベースライブラリはほしいな。

>>294お願い(*'-')人


296 名前:デフォルトの名無しさん :2006/02/23(木) 01:30:01
>>282
これでいいじゃんw

BOOST_FOREACH(char ch, boost::make_iterator_range(input_iterator(in), input_iterator()))
{
buf.push_back(ch);
*s++ = ch;
}

297 名前:デフォルトの名無しさん :2006/02/23(木) 01:51:30
>>282
これでもいいじゃん?

using namespace boost::lambda;
for_each(input_iterator(source), input_iterator()
, (bind(&std::vector<char>::push_back, &buf, _1), *var(s)++ = _1));

298 名前:デフォルトの名無しさん :2006/02/23(木) 03:26:56
>>296
foreach.hppはどこで手に入る?

299 名前:デフォルトの名無しさん :2006/02/23(木) 05:46:48
>>298
CVS の HEAD

300 名前:298 :2006/02/23(木) 06:19:08
>>299
thanx

301 名前:デフォルトの名無しさん :2006/02/23(木) 14:34:45
foreachのソースは言語オタクにはたまらないんだろうが
俺にはさっぱりわからんw

302 名前:デフォルトの名無しさん :2006/02/24(金) 23:20:48
テンプレートとかSTLとか全然使ってない。
std::sprintf()だけあればいいよ。って思うの俺だけ?

303 名前:デフォルトの名無しさん :2006/02/24(金) 23:22:28
>>302
お前だけじゃないだろうが、自分の知らないことが世の中には
たくさんあることだけは忘れないようにしよう。

304 名前:デフォルトの名無しさん :2006/02/24(金) 23:30:49
>>302
あなたがC++の何を使おうが、それはあなたの自由。
テンプレートやSTLを使う人間を否定さえしなければ問題ない。

305 名前:デフォルトの名無しさん :2006/02/24(金) 23:33:58
>>302
せめてboost::formatにしようぜ。

306 名前:デフォルトの名無しさん :2006/02/24(金) 23:39:28
>>304の訳

>>302
勝手にすれば?
ウゼェからとっとと消えろ

307 名前:デフォルトの名無しさん :2006/02/24(金) 23:49:36
再利用性考えまくったコードが一回でお蔵入りってのもあるけどな。

308 名前:デフォルトの名無しさん :2006/02/24(金) 23:49:40
テンプレートを使わせようと必死な>>305-306が見苦しく、大変失礼いたしました。

309 名前:デフォルトの名無しさん :2006/02/24(金) 23:54:59
いや寧ろ、テンプレートを使えない香具師が必死になっているようにしか見えないのだが。

それはさておき、いつも迷うのだが文字列処理する関数は次のどれを引き数にとるべきかな?
・const char *
・std::string
・const std::string &

310 名前:デフォルトの名無しさん :2006/02/24(金) 23:59:43
>>309
だれも必死になんかなってないだろ。

const std::string& がデフォルトだろうな。
std::string 渡すときもコストが低いし、
const char* のインターフェースを兼ねることもできる。
ただ、動的なメモリ確保に制限がある場合は const char* に
したほうがいいだろう。
std::string による値渡しは参照渡しに比べてメリットがあるとは思えない。

311 名前:デフォルトの名無しさん :2006/02/24(金) 23:59:45
>>309
公に晒すならconst char*以外に有り得ない。

312 名前:・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/25(土) 00:01:55
ここ最近WindowsのGUIベッタリなコードしかかいてない俺はLPCSTR

313 名前:デフォルトの名無しさん :2006/02/25(土) 00:08:48
どうしてもって時以外はconst char*じゃね?

314 名前:デフォルトの名無しさん :2006/02/25(土) 00:28:16
>312
最近というのならLPCTSTR(もしくはLPCWSTR決め打ち)じゃないのか?

つまり、
普通はconst std::wstring &
訳ありの時はconst wchar_t *

となる時代はいつの事やら。

315 名前:・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/25(土) 00:44:33
std::basic_string<TCHAR>

316 名前:309 :2006/02/25(土) 00:52:49
ふむ、考えてみたら文字列リテラル渡すこともあるからconst char *がいいのかな。
THX!

317 名前:デフォルトの名無しさん :2006/02/25(土) 01:13:26
const std::string& には文字列リテラル渡せますよ、と。

318 名前:デフォルトの名無しさん :2006/02/25(土) 04:36:08
そこでメモリの動的確保が問題になりますよ、と。
既に書かれているわけですな。

319 名前:デフォルトの名無しさん :2006/02/25(土) 08:52:22
どうしても気になるときにはこんなこともする。
void hoge(const char*);

inline void hoge(const std::string& s)
{
    hoge(s.c_str());
}

320 名前:デフォルトの名無しさん :2006/02/25(土) 10:05:58
class StringOrPtr
{
public:
StringOrPtr(const char* p) : p_(p) {}
StringOrPtr(const string& str) : p_(str.c_str()) {}
operator const char*() const { return p_; }

private:
const char* p_;
};

なんてのを作ったが、見た目が気持ち悪かったので使わなかった。

321 名前:デフォルトの名無しさん :2006/02/25(土) 11:42:03
>>320
stringの寿命がわからんところで使って死にそうなコードじゃね。

322 名前:デフォルトの名無しさん :2006/02/25(土) 13:56:09
>>320-321
こういう場面で必要。
http://www.tietew.jp/cppll/archive/8082
http://www.tietew.jp/cppll/archive/8098

323 名前:デフォルトの名無しさん :2006/02/25(土) 14:58:49
可変長引数辞退忌避してるからなぁ。

vargsって過去互換以外でつかうか?


324 名前:デフォルトの名無しさん :2006/02/25(土) 16:15:49
printf類自体は代わりにboost::formatもあるしな。

325 名前:デフォルトの名無しさん :2006/02/25(土) 18:05:31
以前Effective C++が欲しいと言ってたものです。
紀伊国屋のサイトで購入できました。(店舗から取り寄せ)
私の検索時であと3店舗、今はあと1店舗しか残ってなさそうなので
他に興味がある方はお早めに。

326 名前:デフォルトの名無しさん :2006/02/25(土) 18:26:48
boostは無駄が多い

327 名前:デフォルトの名無しさん :2006/02/25(土) 18:37:22
あれだけたくさんのライブラリが入っているのに
「boost は」なんて一括りにして評価するのは
バカか悪意を持ったものとしか思えない。

328 名前:デフォルトの名無しさん :2006/02/25(土) 18:40:18
可変長引数は必要が有れば使う
Javaでも後から追加になったくらいで
便利な機能だと思うけど・・

329 名前:デフォルトの名無しさん :2006/02/25(土) 18:46:17
boost厨って何で必死なんだろうね

330 名前:デフォルトの名無しさん :2006/02/25(土) 18:53:17
こちらへどうぞ。

Boostを語れゴラァ part2
http://pc8.2ch.net/test/read.cgi/tech/1139313234/

331 名前:デフォルトの名無しさん :2006/02/25(土) 19:05:56
BOOTSを語れゴラァ part2
http://pc8.2ch.net/test/read.cgi/tech/1139266461/

332 名前:デフォルトの名無しさん :2006/02/25(土) 19:10:17
わろすわろす

333 名前:デフォルトの名無しさん :2006/02/25(土) 19:34:32
グローバルで構造体を確保しています。
これをグローバルで確保せずにSTL使ってnewで確保しようと思ってます。
newの速度はどうなんでしょうか?

334 名前:デフォルトの名無しさん :2006/02/25(土) 19:43:31
どうなんでしょうね。

335 名前:デフォルトの名無しさん :2006/02/25(土) 19:48:22
new の評価結果の代入先がグローバルのポインタだったりしたらアフォだな

336 名前:デフォルトの名無しさん :2006/02/25(土) 20:15:55
STLとnewの文脈上の関連がわからないんだが

337 名前:デフォルトの名無しさん :2006/02/25(土) 20:20:28
new は言語の機能
STL はライブラリ
STL は new の応用例

338 名前:デフォルトの名無しさん :2006/02/25(土) 20:27:56
>>333
速度なんぞ気にせず使って良いと思う。
それが問題になることはまず無いはず。

>>336
newした構造体をvectorかなんかに突っ込むんでしょ。

…とすると
> STL使ってnewで確保しようと思ってます。
ってのは表現がおかしいな。

339 名前:デフォルトの名無しさん :2006/02/25(土) 20:37:24
IQが20くらい違ってくると会話に支障が出てくるらしいぞ
ってことできっと>>333は未曾有の大天才なんだろう

340 名前:デフォルトの名無しさん :2006/02/25(土) 20:55:57
クラス内のプライベート変数のポインタを外部に渡す関数を作ろうと思ってるんですが
そんなことするのって設計としてあり?

341 名前:デフォルトの名無しさん :2006/02/25(土) 21:00:05
NG。駄目駄目。ありえない。

342 名前:デフォルトの名無しさん :2006/02/25(土) 21:00:31
プライベートメンバのハンドルを返すなんて信じられないわ!

343 名前:デフォルトの名無しさん :2006/02/25(土) 21:10:14
constなポインタならOKなんじゃない?

344 名前:デフォルトの名無しさん :2006/02/25(土) 21:10:20
>>340
constなポインタならまあありかもしれん。

345 名前:デフォルトの名無しさん :2006/02/25(土) 21:21:54
const でも delete はできるからなあ・・・

346 名前:デフォルトの名無しさん :2006/02/25(土) 21:23:03
>>343
はらわた曝す設計になってる時点で外部でconst外しがされると思われ。


347 名前:デフォルトの名無しさん :2006/02/25(土) 21:25:50
ポインタ型の変数ではなく、「メンバ変数」へのポインタではないか?
(もちろんメンバへのポインタでもない通常のポインタ

348 名前:デフォルトの名無しさん :2006/02/25(土) 21:30:23
const外しの邪法を行う人間相手にはconst参照を返すメソッドも無力だからなぁ。
正直そんな腐った奴の面倒までは見なくて良いような気が。

349 名前:デフォルトの名無しさん :2006/02/25(土) 21:31:43
そういう奴は private 破りもあっさりやりそうだな

350 名前:デフォルトの名無しさん :2006/02/25(土) 21:31:53
constな参照返せば良いんでないかい?

351 名前:デフォルトの名無しさん :2006/02/25(土) 21:34:11
>>350
はらわた曝す設計になってる時点で外部でconst外しがされると思われ。

352 名前:デフォルトの名無しさん :2006/02/25(土) 21:36:13
こんな感じです。
class test {
private:
int test1[10];
public:
int *GetTest(){
for ( int i=0; i<10; i++)
{
if ( test1[i] == -1 ) return &test1[i];
}
return NULL;
}
}
どうでしょうか?

353 名前:デフォルトの名無しさん :2006/02/25(土) 21:37:56
参照のconstは外せないでしょ
わざわざポインタ取り出せば、外せるけど
それこそ、そんな奴の面倒まで見切れない

354 名前:デフォルトの名無しさん :2006/02/25(土) 21:38:27
話がループしてるって。

>340よ、誓うんだ。二度とそんなことはしないと!

355 名前:デフォルトの名無しさん :2006/02/25(土) 21:41:19
>>352
それだけなら別に可かと
test1[10]がお互いに・若しくは他のメンバと関係しあっているのなら不可

356 名前:デフォルトの名無しさん :2006/02/25(土) 21:44:47
>355
理解力不足ですいません。ほかのメンバと関係しあっているのならってのは
どういうことですか?

357 名前:デフォルトの名無しさん :2006/02/25(土) 21:46:18
>>353
残念ながら外せます。

#include<string>
#include<iostream>
class human{
    std::string name_;
public:
    const std::string&name(){return name_;}
    human(const std::string&name):name_(name){}
};
int main(){
    human a("test");
    const_cast<std::string&>(a.name())="a";
    std::cout << a.name();
}

まぁconst外しする奴は腐ってるから面倒見なくても良いと思うけどなー。


358 名前:デフォルトの名無しさん :2006/02/25(土) 21:47:37
>>352

>>355の言ってる以外にも、

「空き」を意味するために、NULLと-1の両方を使ってるのが邪悪。
半年もたったら自ら使い方を間違ってささりそう。


359 名前:デフォルトの名無しさん :2006/02/25(土) 21:50:10
constポインタを返すのは別にいいでしょ
それをconst_castする香具師がボケなのであって、クラス自身は問題なしなはず

360 名前:デフォルトの名無しさん :2006/02/25(土) 22:44:58
352です。
この使い方自体はconstでポインタを渡せば特に問題ということでいいでしょうか?
ちなみに-1とNULLを使ってるのは意味があります。
class test {
private:
int test1[10];
public:
const int *SetTest(int i_num){
for ( int i=0; i<10; i++)
{
if ( test1[i] == -1 )
{
test[i] = i_num:
return &test1[i];
}
}
return NULL;
}
}

Test test;
int *pNum;
pNum = test.SetTest(10);
if ( pNum != NULL )
{
// 操作するときはこんな感じ
}

のような使い方をしようと思っているのですがどうでしょうか?
この中のintをSTL・newとかを使って管理しようかなと思ってます。

361 名前:デフォルトの名無しさん :2006/02/25(土) 22:52:34
>>360
全体が分からないからなんだけど
その「操作」ってやつをTest内で実装すれば内部を晒すこともない

設計が良くない感じはするね


362 名前:デフォルトの名無しさん :2006/02/25(土) 23:00:02
いや、-1とNULLに意味があるのはわかる。
わかるけど、後々使い方を間違えやすい実装だよ、と言ってるわけ。

もし、test.SetTest(-1)ってやったらどーなるの?

悪いこと言わないから、せめて、アサーションくらい入れときましょう。

const int *SetTest(int i_num){
assert(i_num != -1);
for ( int i=0; i<10; i++)

もっと言うなら、空きがあるかどうかを記録するための配列を、
値を保持する配列とは別個に持った方が良いと思うよ。

そうすれば、使ってる側は、格納する値が-1かどうかは気にせずに済むから。




363 名前:デフォルトの名無しさん :2006/02/25(土) 23:00:23
int *pNum;
pNum = test.SetTest(10);
if ( pNum != NULL )
{
// 操作するときはこんな感じ
}
はどこでも行われる可能性があると思っていただいたほうがいいです。
Test testはシングルトンで扱っていろんなとこから値がセットされて
いろんなとこからいじる可能性があります。

364 名前:デフォルトの名無しさん :2006/02/25(土) 23:18:05
>>356
例えば、class testがメンバ変数「int a」を保持していたとして
aとtest1[10]が依存しあっているのなら・・・・の意です。

365 名前:デフォルトの名無しさん :2006/02/25(土) 23:21:42
>// 操作するときはこんな感じ
ここには具体的には何が入るの?

366 名前:デフォルトの名無しさん :2006/02/25(土) 23:38:08
class test {
private:
typedef struct {
int flag;
int point;
}T_TEST test1[10];
public:
const T_TEST *SetTest(int i_num){
for ( int i=0; i<10; i++)
{
if ( test1[i].flag == -1 )
{
test[i].point = i_num:
return &test1[i];
}
}
return NULL;
};
};

Test test; // これはシングルトンで扱う
// 以下はいろんなところで使う-----------
int *pTest;
pTest = test.SetTest(10);
if ( pNum != NULL ){ pTest.point++; }

いろいろ変更してこんなかんじにしましたがどうでしょう?

367 名前:デフォルトの名無しさん :2006/02/25(土) 23:38:40
>>360
素直に、vector<int>じゃダメ?

368 名前:デフォルトの名無しさん :2006/02/25(土) 23:44:07
全角托イ

369 名前:デフォルトの名無しさん :2006/02/25(土) 23:46:03
ウホ帰れ
うんこ臭いんだよ

370 名前:デフォルトの名無しさん :2006/02/25(土) 23:52:18
ちょ、ちょっとまて。
フラグを用意したのはOK。でも、なぜフラグまで外部にさらす?

あと、値を変更させるつもりならconstポインタは使えないから・・・
それと、pTestの型はどっちみち間違い。

俺に3行変えさせてくれ。
int *SetTest(int i_num){ ← ここ

return &test1[i].point; ← ここ。

if ( pNum != NULL ){ *pTest++; }

>>360
STLのvectorを使うなら、サイズ変更でメモリの再割り当てが起きたときのことも考えておかないとダメ。



371 名前:デフォルトの名無しさん :2006/02/25(土) 23:58:40
Σ(゚Д゚;)やべ。

3つめは
if ( pTest != NULL ){ *pTest++; }

の間違い。


372 名前:デフォルトの名無しさん :2006/02/26(日) 00:04:30
366と360は同一人物なのでよろしく、もう一度書きます。
class test {
public:
typedef struct {
int flag, point, money;
}T_TEST;
private:
T_TEST test1[10];
public:
T_TEST *SetTest(int i_point, int i_money){
for ( int i=0; i<10; i++) {
if ( test1[i].flag == -1 ) {
test1[i].point = i_point;
test1[i].money = i_money;
return &test1[i];
}
}
return NULL;
};
};

Test test;

T_TEST *pTest;
pTest = test.SetTest(10);
if ( pNum != NULL ){ pTest.point++; }

フラグまで外部に晒すのは構造体のメンバが複数あるので結果的にフラグも
見えてしまう状況はいたしかたないと思ってます。

373 名前:デフォルトの名無しさん :2006/02/26(日) 00:13:12
> 366と360は同一人物なのでよろしく、もう一度書きます。
すまそ。

> フラグまで外部に晒すのは構造体のメンバが複数あるので結果的にフラグも
> 見えてしまう状況はいたしかたないと思ってます。

いたしかたなくない。

typedef struct {
int point, money;
} T_TEST;

typedef struct {
int flag;
T_TEST data;
} T_DATA;

ついでを言えば、flagの型もintよりboolの方がよいとは思うが。


374 名前:341 :2006/02/26(日) 00:20:42
>>372
SetTestがダサい。メソッド名から
・未使用のT_TESTを検索する
・それにi_numをセットする
と二つのことをしていることが読み取りにくい。(Testをセットしているんじゃないし)


375 名前:341 :2006/02/26(日) 00:23:31

やるならせめて
class test { 
private: 
  typedef struct { 
    int flag; 
    void setPoint(int i_num){
      point = i_num;
    }
  private:
    int point;
  }T_TEST test1[10]; 
public: 
  const T_TEST *getTest(int i_num){ 
    for ( int i=0; i<10; i++){ 
      if ( test1[i].flag == -1 ){ 
        return &test1[i]; 
      } 
    } 
    return NULL; 
  }; 
}; 

Test test; // これはシングルトンで扱う 
T_TEST *pTest = test.getTest(); 
if ( pNum != NULL ){  pTest->setPoint(10);} 

くらいしなきゃ。コンパイルしてないしかなり詰めも甘いけど。

376 名前:341 :2006/02/26(日) 00:27:08
うわ、コピペ元間違ってんじゃん。

T_TEST *pTest = test.getTest();  
if ( pTest != NULL ){  pTest->setPoint(10);}  

だな。なんかいつの間にかパラメータも増えてるけど…。

377 名前:デフォルトの名無しさん :2006/02/26(日) 00:36:21
>375
private:
int point;
}T_TEST test1[10];
の部分なんですがこのところでメンバが多くなって10個ぐらい増えた場合に
単純にセッターを10個増やすことになると思いますがそれはC++では普通にやる
ことなんですか?

378 名前:デフォルトの名無しさん :2006/02/26(日) 00:37:04
リファレンサ・クラスを作るだな

379 名前:341 :2006/02/26(日) 00:46:19
必要なら作るべき。けど普通そこまでにはならないと思う。
外部からset、getとか頻繁にし過ぎるようだったら設計が悪い。

あまり多くのメンバが追加されるようなら
T_TESTがする仕事が多すぎないかとか、
分割した方がいいか検討しなきゃな。

380 名前:デフォルトの名無しさん :2006/02/26(日) 10:39:20
リファレンサ・クラスとはなんでしょうか?
検索でもあんまりひっかからないので教えて

381 名前:cccc :2006/02/26(日) 10:47:51
VC6.0

アドレス、A、Bが分かっていて、AからBまでをファイルに書き出す方法は、
ありませんか?



382 名前:デフォルトの名無しさん :2006/02/26(日) 10:57:28
>>381
copy((char*)A,(char*)B,std::ostreambuf_iterator<char>(stream));


383 名前:デフォルトの名無しさん :2006/02/26(日) 12:31:12
stream.write((char*)A, (char*)B - (char*)A);

384 名前:デフォルトの名無しさん :2006/02/26(日) 12:35:37
http://www.open-std.org/jtc1/sc22/wg21/
News 2006-02-26: The C++ Standard Library Issues List (Revision 41) is available (.tar.gz)
News 2006-02-26: C++ Standard Core Language Issues List (Revision 40) is available, also committee version

385 名前:デフォルトの名無しさん :2006/02/26(日) 16:41:15
>>382-383
なんでわざわざわかりづらいコード書くんだよ。
VCって言ってるんだからWin32のAPI使えばいいだろ。
WriteFile(fileHandle, A, B-A, &bytesWritten, 0);

複雑なマクロが書けるとかテンプレートが使いこなせるとか、
マニアックなコードで短い行数で書ける奴が偉いなんて時代は
2002年頃までに終わってるんだよ。

386 名前:デフォルトの名無しさん :2006/02/26(日) 16:46:22
ネタだよな?

387 名前:デフォルトの名無しさん :2006/02/26(日) 16:46:46
>>385
お願いだからスレタイと>>1を読んでくれ。


388 名前:デフォルトの名無しさん :2006/02/26(日) 17:13:32
>>385
たしかに382-383は不親切な回答だと思ったかもしれないが、
ここはC++のスレなんだからC++の標準ライブラリでの方法を答えるのが筋だろ。

389 名前:デフォルトの名無しさん :2006/02/26(日) 17:38:47
明らかに>>381>>1読んでないの分かってて書く>>382-383
荒れる原因作ってるだけだろ。どのヘッダをインクルードすればいいのかとか
また質問しに来たらどうすんだか

390 名前:デフォルトの名無しさん :2006/02/26(日) 17:55:43
何喧嘩してんだ
低能同士仲良くしろよ

391 名前:デフォルトの名無しさん :2006/02/26(日) 18:01:04
>>390
よそのスレで馬鹿にされたからって
八つ当たりすんなよw

392 名前:デフォルトの名無しさん :2006/02/26(日) 18:13:35
そうだね、仲良くしよう。>>390

393 名前:デフォルトの名無しさん :2006/02/26(日) 18:26:03
よそのスレで馬鹿にされた低能==>>391

394 名前:デフォルトの名無しさん :2006/02/26(日) 18:36:10
このスレもだんだん過疎化が激しさを増してきたからいいかげん

【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/

Boostを語れゴラァ part2
http://pc8.2ch.net/test/read.cgi/tech/1139313234/

今後、この2つをどうするか語らないか。

395 名前:デフォルトの名無しさん :2006/02/26(日) 18:36:28
C++のオブジェクトをP2Pのような相互通信するオブジェクトと捉えて
プログラミングしようと思ってるんですが、ナカナカ上手くいかないっす(涙

基本的には、
1. 各機能オブジェクト間で状態遷移を通知し合う。
2. 各機能オブジェクトは上位のオブジェクトに保持されるが、上位のオブジェクトがすることは、各機能オブジェクトに、さらに上位から送られてきた命令を分散するだけで一切実際の処理はしない。するとしても初期値設定ぐらい。

boost::signalあたりで実装はしてみたんですがイマイチスマートに書けないんですよね。



…わけわからんこと言ってすいません。

396 名前:デフォルトの名無しさん :2006/02/26(日) 18:42:41
>>394
STL スレは統合していいと思うけど Boost はなあ。
時期標準といっても案件によっては使わせてくれない場合も多いし・・・。

397 名前:デフォルトの名無しさん :2006/02/26(日) 19:06:12
>>395
もうちょい「上手くいかない」の内容とか
各機能がなんなのか書けば誰か助けてくれるかもよ。

>390みたいなやつも紛れ込んでるけどさ。

398 名前:デフォルトの名無しさん :2006/02/26(日) 19:17:43
class Aの中でclass Bのインスタンスを一個だけ使うような場合ってどうしてますか?

class A {
B b;
};
ってするか、
class A {
A() {b = new B:}
~A() {delete b;}
B *b;
};
ってするか。
上の方が簡単だけど、Bのコンストラクタに引数があると困る。

399 名前:デフォルトの名無しさん :2006/02/26(日) 19:20:27
はぁ?

400 名前:デフォルトの名無しさん :2006/02/26(日) 19:20:42
>>394
BOOTSを語れゴラァ part2
http://pc8.2ch.net/test/read.cgi/tech/1139266461/

401 名前:デフォルトの名無しさん :2006/02/26(日) 19:21:53
>>398
class A {
  B b;
  A() :b(...) { ... }
};

402 名前:デフォルトの名無しさん :2006/02/26(日) 19:26:53
とりあえず最初はBが
・値オブジェクトなら先の方、
・参照オブジェクトなら後の方
でやっちゃうかな。まぁケースバイケースだけど。

403 名前:402 :2006/02/26(日) 19:39:46
ところで俺>341なんだけど、
>352の彼は問題解決したのかなぁ。

どうなったか書いてくれんと落ち着かない…

404 名前:デフォルトの名無しさん :2006/02/26(日) 19:59:41
>>401
それってBがAの基底クラスじゃなきゃおかしくね?

405 名前:デフォルトの名無しさん :2006/02/26(日) 20:01:09
>>404
ただのメンバの初期化の構文だが。

406 名前:デフォルトの名無しさん :2006/02/26(日) 20:10:40
>>352
test1の定義を、int *test1にして
コンストラクタでtest1 = new int[10];すればOK。
インスタンス1つならstatic int test1[10];でもいい。
セッタなんてマンドクセ

407 名前:デフォルトの名無しさん :2006/02/26(日) 20:36:46
バリアント型を使用したあとの、
メモリの解放ってどうやればいいんでしょうか?
なんか呼び出すたびにメモリ使用容量が増えている気が・・


408 名前:デフォルトの名無しさん :2006/02/26(日) 20:39:16
#include <iostream>
#include <functional>
#include <boost/function.hpp>

struct SomeObject{
 void Do(int) { std::cout << "hogehoge" << std::endl; }
};

int main(){
 SomeObject t;
 boost::function<void (int)> g = std::bind1st( std::mem_fun(&SomeObject::Do), &t );
 g(0);
 return 0;
}

だとコンパイル通って、

struct SomeObject{
 void Do(void/* ここと */) { std::cout << "hogehoge" << std::endl; }
};

int main(){
 SomeObject t;
 boost::function<void (void/* ここと */)> g = std::bind1st( std::mem_fun(&SomeObject::Do), &t );
 g();/* ここを変更 */
 return 0;
}

だと通らなくなるんだけど…理由わかる人がいたら教えてもらえませんか?
環境はVC2005Express + boost 1.33.1です。

409 名前:デフォルトの名無しさん :2006/02/26(日) 20:54:41
>>408
std::bind1stは二引数の関数オブジェにしか使えない。

410 名前:デフォルトの名無しさん :2006/02/26(日) 20:55:01
bind1stは2引数の関数オブジェクトにしか使えないという糞設計だから。
boost::bindを使いましょう

411 名前:デフォルトの名無しさん :2006/02/26(日) 21:00:58
>>409-410
マジthxですm(_ _)m
bind1stは二引数関数オブジェクト専用だったんですね(汗

一応動いたコード

#include <iostream>
#include <functional>
#include <boost/bind.hpp>
#include <boost/function.hpp>

struct SomeObject{
 void Do(void) { std::cout << "hogehoge" << std::endl; }
};

int main(){
 SomeObject t;
 boost::function<void (void)> g = boost::bind( std::mem_fun(&SomeObject::Do), &t);
 g();
 return 0;
}

412 名前:デフォルトの名無しさん :2006/02/26(日) 21:10:52
>>411
-boost::function<void (void)> g = boost::bind( std::mem_fun(&SomeObject::Do), &t);
+boost::function<void (void)> g = boost::bind( &SomeObject::Do, &t);
でいいよ


413 名前:デフォルトの名無しさん :2006/02/26(日) 21:14:27
>>412
本当だ、普通にコンパイル通った…。
mem_funまでやってくれるんだ…すごい…。

414 名前:デフォルトの名無しさん :2006/02/26(日) 21:25:52
>409
オブジェワロタ

415 名前:デフォルトの名無しさん :2006/02/26(日) 22:16:26
同じクラスであればunionを使うのは問題ありませんか?
座標を示すx,y,zという値があり、場合によってはdata[0]〜[2]のように
配列っぽくアクセスしたい場合があります。
x,y,zはPOTではなく、関数なども持つクラスだとして、以下のように
unionを使うのはOKでしょうか?

union {
 {
  foo data[3];
 };
 {
  foo x,y,z;
 };
};

unionがメモリの内容を複数の解釈をするっていうものであるならば、
問題はない様な気がしますが。

416 名前:デフォルトの名無しさん :2006/02/26(日) 22:28:58
>>415
構造体の各要素の配置は規定されてなかったと思う。
だからおそらくだめ。

417 名前:デフォルトの名無しさん :2006/02/26(日) 22:34:52
>>415
配置以前に、規格上「コンストラクタを、デスクトラクタ、コピー代入演算子を定義したクラス型はunionのメンバにできない」となっているから、
基本的にはPOD型じゃないとダメかと。

418 名前:デフォルトの名無しさん :2006/02/26(日) 22:55:26
>>415
foo data[3], &x = data[0], &y = data[1], &z = data[2];
あるいは
foo x, y, z, *data[] = { &x, &y, &z };
*data[0] のように * がつくが、
「配列っぽく」という要求は満たす

419 名前:デフォルトの名無しさん :2006/02/26(日) 23:09:54
目的の為なら手段を選ばず。

struct
{
foo x,y,z;
foo& operator[](int i)
{
switch(i)/*以下略

420 名前:プリプロセッサ :2006/02/26(日) 23:27:26
次は俺の出番か?

421 名前:デフォルトの名無しさん :2006/02/26(日) 23:31:15
>>420
いや、俺だ。雑魚は引っ込んでろ。

422 名前:デフォルトの名無しさん :2006/02/26(日) 23:39:34
>419
わりと普通じゃんと思ってしまう俺はもうJavaには移れませんか、そうですか

423 名前:デフォルトの名無しさん :2006/02/26(日) 23:49:30
>>422
(・∀・)人(・∀・)

424 名前:デフォルトの名無しさん :2006/02/27(月) 00:24:48
>415
名前にちょっとかっこが付くけど、普通にこんなんじゃ駄目か?
struct bar
{
foo data[3]
foo &x() {return data[0];}


425 名前:デフォルトの名無しさん :2006/02/27(月) 00:30:34
俺なら>>424より>>419を選ぶ。

426 名前:デフォルトの名無しさん :2006/02/27(月) 00:36:08
C++なら424でも十分

427 名前:デフォルトの名無しさん :2006/02/27(月) 00:44:33
    〃〃∩  _, ,_ 
     ⊂⌒( `Д´) < だって括弧ヤダヤダ! 
       `ヽ_つ ⊂ノ 

428 名前:デフォルトの名無しさん :2006/02/27(月) 00:50:06
そこで#define x x()で(r

429 名前:デフォルトの名無しさん :2006/02/27(月) 00:59:28
ここで変態的なのを出してみる。

struct bar
{
foo x,y,z;
foo& operator[](int i)
{
static foo bar::* hage[] = {&bar::x,&bar::y,&bar::z};
return this->*(hage[i]);
}
};

430 名前:デフォルトの名無しさん :2006/02/27(月) 01:01:17
あやまれ!
ツルッパゲのオッサンにあやまれ!

431 名前:デフォルトの名無しさん :2006/02/27(月) 01:19:29
平成18年2月27日、2chム板C++相談室 part47スレッドを訪問した際、
ツルッパゲのオッサンの方に、私は不遜な対応をし、同氏の名誉を傷つけ、
またご迷惑をおかけしました。心よりお詫びいたします。

自身の軽率で傲慢な言動を恥じ、深く反省しております。

今後は、常に自分の立場をわきまえ、念頭に置いた行動をとりますことをお誓いいたします。
二度とこのような失態を招かない所存にございますゆえ、
このたびに限り、寛大なるご措置をお願い申し上げます。

432 名前:デフォルトの名無しさん :2006/02/27(月) 01:24:09
>>431 の潔さに感動した!

433 名前:デフォルトの名無しさん :2006/02/27(月) 01:28:21
>>429
const 忘れてるよ。付けても最適化してくんないみたいだけどね。

- static foo bar::* hage[] = {&bar::x,&bar::y,&bar::z};
- return this->*(hage[i]);
+ static foo bar::* const bjarne[] = {&bar::x,&bar::y,&bar::z};
+ return this->*(bjarne[i]);

434 名前:・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/27(月) 01:29:53
タブクリア吹いたwwww

435 名前:・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/27(月) 01:56:18
Cスタイルの初期化は出来なくなるがこんなのどう?

struct Point3D {
float &x, &y, &z;
float data[3];
Point() : x( data[0] ), y( data[1] ), z( data[2] ) { }
//以下略
};

436 名前:デフォルトの名無しさん :2006/02/27(月) 01:57:48
>>435 デカくて嫌。

437 名前:デフォルトの名無しさん :2006/02/27(月) 08:53:00
でも俺なら>>435にするけどなあ。
>>419, >>429のやつだと、
data[0], data[1], data[2]が順に等間隔で並ばない可能性があるから、
いつかハマりそう。


438 名前:デフォルトの名無しさん :2006/02/27(月) 09:33:59
static int hoge[60]
みたいにstaticを使って動的にメモリを確保できないのでしょうか?

つまり
x=60;
static int hoge[x];
みたいなことがしたいんですが

439 名前:デフォルトの名無しさん :2006/02/27(月) 09:45:35
>>438
staticがどの意味のstaticなのかわからん。


440 名前:デフォルトの名無しさん :2006/02/27(月) 13:41:57
>>438,439
どの意味でも無理。

441 名前:デフォルトの名無しさん :2006/02/27(月) 13:54:31
静的なのに動的とはこれいかに?

ソースコードを書き換え→コンパイラを起動→実行


442 名前:デフォルトの名無しさん :2006/02/27(月) 15:15:03
>>440
ほんとだ。

C99の
> static int (*p_sum_h)[h] = sum_h;  //OK static を使っているけどこれは OK
(http://seclan.dll.jp/c99d/c99d04.htmから引用)
と混乱してたよ。



443 名前:デフォルトの名無しさん :2006/02/27(月) 16:40:58
どうも動作がむちゃくちゃおかしいので、一応確認しておきたいのですが

typedef struct{
 char* txt[16];
}TS, *LPTS;

void testcode( void ){
 TS ts;
 char* smptxt = "abcdefghijklmn";
 ts.txt[0] = smptxt;
 ts.txt[1] = smptxt;
 ts.txt[2] = smptxt;
}

みたいなコードで、ts.txt[0]への代入後、どうもts.txt[1]以降の内容も変化
変化した内容は[1]が0x68676665、[2]が0x6c6b6a69とのことなので、
どうやらsmptxtの文字列が突っ込まれているようです
VC++2003の問題だとは思うのですが、もしかして何か俺の方でやっちゃってます?


444 名前:デフォルトの名無しさん :2006/02/27(月) 16:56:38
>>443
なんだかわかんないのだけれども、
[0]のところにブレークポイントしかけて、
その時点で[1]と[2]の中身も変化してしまうということ?

445 名前:デフォルトの名無しさん :2006/02/27(月) 17:02:16
>>443
そのテストコード、VC++2003で試してみたけど、正常に動作したよ。
(testcode(void)の最後にprintfで表示させてみた)
ts.txt[]の参照文字列を表示させても同じだし、ts.txt[]の指しているアドレスを
確認したけど同じだった。
別のところに問題があるんじゃないの?

446 名前:443 :2006/02/27(月) 17:23:29
>>444
その通りです
[0]への代入のところにブレークポイントを置いてチェックすると
[0]への代入時に[0]にはsmptxtのアドレス、[1]以降に変な値が入ってます
今確認してみたところ、[1]への代入、[2]への代入時には[1]以降のデータは変化してないっぽいです

>>445
うーん…
新しいプロジェクトで同じことやっても同じ結果が出てるんですよね…
(=ビルドオプションの類の問題じゃなさそう)
となると、バージョンか開発環境の設定?

447 名前:445 :2006/02/27(月) 17:38:38
>>446
ちなみに、コンパイラのバージョンは最適化コンパイラで13.10.3077(for 80x86)
コンパイルは、コンソールからなにもオプションつけないで、clでやっている。
(コマンドラインアプリとして、mainくっつけて実行)

448 名前:デフォルトの名無しさん :2006/02/27(月) 18:16:19
>>443
ts.txt[0]への代入直後、ts.txt[1], [2]の(初期化および)代入以前の状態だと
ts.txt[1], [2]の値は不定だから。

…なわけないよな…。
参考までに、g++3.4.2では、ts.txt[0]代入前後で[1], [2]の値に変化はなかったよ。

449 名前:415 :2006/02/27(月) 21:24:51
いろいろと参考になります。
クラスはunionにできないんですね。

x,y,zへのアクセスとdata[0]〜[2]へのアクセスのコストが等しくなる
方法がいいんですが、>>419ならインライン展開されると見て大丈夫ですか?

初期化の際に多少コストがかかるのは問題ないです。

450 名前:デフォルトの名無しさん :2006/02/27(月) 22:05:21
インライン展開されるかどうかなんて環境によるだろ

451 名前:デフォルトの名無しさん :2006/02/27(月) 23:15:55
俺はVC++8.0に __forceinline を指定して、極力
インライン展開を使用するようにして使っているが、例えば>>435
使っても使わない時と比べ5clockほどしか増えない。

452 名前:デフォルトの名無しさん :2006/02/27(月) 23:18:26
5clockw

453 名前:デフォルトの名無しさん :2006/02/27(月) 23:32:12
インライン関数はどうでもいいが、何でもかんでもvirtual付けたがる奴いるよな。
重いんだよ。絶対継承される自信があるときだけにしてくれ。

454 名前:デフォルトの名無しさん :2006/02/27(月) 23:44:16
何も継承していないし、
どこからも継承されていないクラスは、
コンパイラの最適化で、virtualを外せないものなのかな。


というか、デフォルトでvirtualで、必要のないものだけ、
コンパイラが判断してvirtualを外すという仕様はどうだろう。

Dが確か、そういう仕様だったはず。

455 名前:454 :2006/02/27(月) 23:45:00
もちろん、継承されていても、virtualを外せる場合は結構あると思うんだけど。

456 名前:・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/27(月) 23:47:28
問題はfloatごときに同じ数だけアドレス型の領域が増えるのが効率が悪すぎることだ。

457 名前:デフォルトの名無しさん :2006/02/27(月) 23:51:51
>>454
その D の仕様では virtual テーブルまで消えるのか?
単に呼び出し時に virtual テーブルを経由せずに呼び出すことを
「virtualを外す」って言ってるだけじゃないの?
もしそれだけなら、 C++ でも最適化の範囲内で可能。

458 名前:デフォルトの名無しさん :2006/02/27(月) 23:57:47
>>454
Dの仕様書ではこうなってた。
>コード生成時にDはクラス階層を全て把握していますので、
>オーバーライドされていない関数への呼び出しは全て最適化されて non-virtual になります。

こういう言語ではvtableは常に作るのかな。デストラクタは常にオーバーライドされるし。

459 名前:454 :2006/02/28(火) 00:26:42
C++は、やはり速度優先といった感じがしますね。

自分の考えとしては。

vtableがあるというだけでは、vtable分のサイズと、
vtableへの参照だけなので、

int型のメンバ変数ひとつのクラスを何十万と作るわけじゃなければ、
別に気にしなくてもいいんじゃないか、などと思えてしまいます。


それでも、JAVAや.NETまで、思い切ることができない性格ですが。

460 名前:デフォルトの名無しさん :2006/02/28(火) 01:37:56
はじめまして、現在VC++2003を用い開発をしているのですが、
Win32コンソールアプリケーションからWin32DLLを動的に明示リンクした際に、
なぜかReleaseでのみ問題が発生します。

DLL側は
__declspec(dllexport) int LL_OpenArchive(LPCTSTR szFilePath)
{
return s_osaArcEx.OpenArchive(szFilePath);
}
の様に宣言しており、もちろん定義ファイルでエクスポートを定義しております。

アプリケーション側は
typedef int (__stdcall *LL_OpenArchive)(LPCTSTR);
の様にプロトタイプ宣言を行いLoadLibary, GetProcAdressを用い関数のアドレスを取得しています(そこまでは問題有りません)

取得した関数に引数としてchar s[512]の様な固定長CHAR配列にgetsで文字列を取得したものを当てています。
が、Releaseビルドでその処理を行うと、sのアドレスが4バイト引かれるのです。Debugではおこりません。
ためしにDLL側の関数の中身をreturn 0;のみにしたりもしましたが状況は変わりませんでした。
このようなことはあり得るのでしょうか?
またどう対処すればよろしいのでしょうか? ご教授お願い致します。

461 名前:デフォルトの名無しさん :2006/02/28(火) 01:43:29
>>460
よくある。対策は↓
コンパイラの、プログラム全体の最適化 (/GL) を一回はずしてリビルド。
終わったらもう一回有効にして再度リビルド。

462 名前:デフォルトの名無しさん :2006/02/28(火) 03:54:49
誰かが言わなくちゃいけないから俺が言う。
>460
回れ右して初心者スレかWin32APIスレにGo!

463 名前:デフォルトの名無しさん :2006/02/28(火) 03:59:37
>454
お前のちっぽけな価値観だけで、
偉大なるC++をどうこうしたいと妄想するなんて片腹痛い。

464 名前:デフォルトの名無しさん :2006/02/28(火) 05:45:17
宣言だけが記述されたヘッダと、(実装をコンパイル済みの)オブジェクトファイルしかない状況でも
virtualは付け外しできるのかな。
そのオブジェクトファイルは、他の(CやFortranなどの)言語でも使用される一般的なツールでリンクできるという条件で。
可能なら、継承されててもnon-virtualにできる選択肢を残した上で、virtualは自動化してもらえれば便利だね。


465 名前:デフォルトの名無しさん :2006/02/28(火) 07:03:11
>>463
そういうのは北朝鮮でやってね(プ

466 名前:デフォルトの名無しさん :2006/02/28(火) 08:02:45
C++の本でいいのはどれでしょう?
ASCIIの「C++言語入門」は持ってますが古い規格なので
最近新しく探しているのですが、これはと思ったのは分厚く
7000円もするので買うのを躊躇しています。
リッチー&カーニハンの「プログラミング言語C」のような
解説書を探しています。
よい本がありましたら教えてください。

467 名前:デフォルトの名無しさん :2006/02/28(火) 08:12:18
>>466
プログラミング言語C++がC++版K&Rと言われてる

俺が他にお勧めするのは、Accelerated C++
後はもう店頭在庫のみだがEffective C++

468 名前:デフォルトの名無しさん :2006/02/28(火) 09:10:58
>>466
古い規格での標準C++の勉強は終わっていて、7000円は高すぎて禿げてしまうというのなら
標準規格はIS、FDIS(>>5)を参照するという手もある。


469 名前:デフォルトの名無しさん :2006/02/28(火) 09:14:23
>>460
スレ違いだがあえて答えてやろう。
エクスポートしてる関数にも_stdcall付けやがれ。

470 名前:460 :2006/02/28(火) 11:04:01
スレ違いだったにもかかわらず教えて頂きありがとうございました。
結果的には__stdcallのつけ忘れでした
初歩的orz
相談室と書いてあったので早とちりしてしまいましてご迷惑おかけしました。
ありがとうございました。


471 名前:デフォルトの名無しさん :2006/02/28(火) 12:16:14
>>454
多くの C++ コンパイラはコンパイル単位でしか最適化しないので
そーゆー、複数のコンパイル単位間での最適化は
望むべくもなく。

472 名前:466 :2006/02/28(火) 21:12:31
>>467-468
ありがとうございます。
教えていただいたタイトルを頼りに本屋を渡り歩いてみます。

レスが遅くなりましてすみませんでした。(今帰宅しました)
International Standard は詳しくて良さそうですね。
あんまり英語得意じゃないんですが、日本語版の本を購入
するまでは頑張ってこちらで勉強してみます。

473 名前:デフォルトの名無しさん :2006/02/28(火) 22:40:46
>>472
標準規格を見るだけならhttp://www.jisc.go.jp/のJIS検索から規格番号X3014でいける。

474 名前:デフォルトの名無しさん :2006/02/28(火) 23:31:34
C++でBCDを使うためのノウハウみたいなのが紹介されてる本やサイトってありますかいね?

475 名前:デフォルトの名無しさん :2006/03/01(水) 01:11:46
Google からたどり着いたこのアドレス
http://www.open-std.org/jtc1/sc22/wg21/prot/
規格とかダウンロードできて、便利だなーとか思ってたんだけど、
よく見るとトップに "members' pages" って書いてある。

これ、ダウンロードしてもいいの?

476 名前:デフォルトの名無しさん :2006/03/01(水) 01:20:26
>>475
内部向け ってだけで「会員専用」の意ではない。

477 名前:デフォルトの名無しさん :2006/03/01(水) 02:26:40
根っからのtemplate hackerの俺としては今後コンソールアプリを作るとき以下のようにmainを書こうと思うのですが、おまえらやC++規格的にはアリですか?
とりあえずVC++2005EE的にはアリのようです

#include <iostream>
#include <typeinfo>

template<class char_t> int main(int argc, char_t* argv[])
{
  std::cout << typeid(char_t).name() << std::endl;
  return 0;
}


namespace startup{
//int main(int argc, char* argv[]) コメントアウトとかして切り替える
//{
//  return main<char>(argc, argv);
//}

int wmain(int argc, wchar_t* argv[])
{
  return main<wchar_t>(argc, argv);
}
}

mainとかwmainをnamespaceとかにいれてイイノカナー

478 名前:デフォルトの名無しさん :2006/03/01(水) 02:39:51
>>477
#if defined(UNICODE) とかで切り分けろバカw
あと、main や wmain はnamespaceいれちゃダメ。

479 名前:デフォルトの名無しさん :2006/03/01(水) 10:06:07
>>478
UNICODEって標準じゃなくてWindowsSDKで使われてる識別子じゃなかったっけ?

480 名前:デフォルトの名無しさん :2006/03/01(水) 14:12:17
>>479
そうだけど、_UNICODEだって独自のものだから、どっちもどっち。

481 名前:デフォルトの名無しさん :2006/03/01(水) 16:14:49
UNICODE も _UNICODE も何のことだか分からない俺。

482 名前:デフォルトの名無しさん :2006/03/01(水) 19:35:23
てか、windows 以外で wchar_t ベースの main に対応してる環境なんてあんのか?

483 名前:デフォルトの名無しさん :2006/03/01(水) 19:53:32
struct base {
 base() {}
 virtual ~base() {}
};

template <typename T> struct derived : public base {
 typedef T member_type;
 T value;
 derived(T value) : value(value) {}
};

template <typename T> base* derived_generator(T value) {
 return new derived<T>(value);
}

base* tmp = new derived_generator(1);

このとき、tmpからmember_typeがintであることを知る方法はないじゃろうか…。

int value = dynamic_cast<derived<int>*>(tmp)->value;

とすればvalueはとれるんじゃが、型がintだと明示したくないのじゃ。

TYPE obtain() const { return dynamic_cast<derived<TYPE>*>(tmp)->value; }

このTYPEはderived<TYPE>::member_typeと等しいのじゃが、どうにかして取り出せんもんかのう。
爺にはとんと見当がつかんのじゃ…。

484 名前:デフォルトの名無しさん :2006/03/01(水) 19:54:54
base* tmp = derived_generator(1);
じゃった。書き写さずコピペすればよかったのう…。

485 名前:デフォルトの名無しさん :2006/03/01(水) 19:58:51
爺さん,無理だと思うよ.
member_typeの型情報が必要な処理はderivedの中に入れるしかないよ


486 名前:デフォルトの名無しさん :2006/03/01(水) 20:02:38
>>483-484
それができないからこそ、boost::anyにはany_castがあり、次期C++にはautoが導入される

487 名前:デフォルトの名無しさん :2006/03/01(水) 20:06:38
あるいは型情報を外に出すとか
typedef int My_Type;
struct base {
base() {}
virtual ~base() {}
};
template <typename T> struct derived : public base {
typedef T member_type;
T value;
derived(T value) : value(value) {}
};
template <typename T> base* derived_generator(T value) {
return new derived<T>(value);
}
typedef derived <My_Type> My_Derived;
int main ()
{
base* tmp = derived_generator(1);
My_Type value = static_cast<My_Derived*>(tmp)->value;
return 0;
}
爺さんこんなのはどうだい?


488 名前:デフォルトの名無しさん :2006/03/01(水) 20:13:19
>>486
これはautoで解決できる問題じゃないと思う。

489 名前:デフォルトの名無しさん :2006/03/01(水) 20:22:00
autoで思い出したんだが、auto型のメンバ変数は許可されるのだろうか?
その辺詳しい人いたら教えてけれ(´・ω・`)

struct Hoge {
  auto value_;

  template <class T>
  Hoge(T v) : value_(v) {}
};

こんな構造体を書いた時、
Hoge h(int(10)), h(double(1.0));
な風に使ってしまうと、テンプレートのようにHogeに複数の実体が作られるのかどうか…

490 名前:デフォルトの名無しさん :2006/03/01(水) 20:24:51
暗黙の型変換付のboost::anyとか

struct base{
    struct inner_base{
        virtual inner_base*clone(){return new inner_base;};
        virtual ~inner_base(){}
    };
    template<typename T>
    struct inner_derived : inner_base{
        typedef T member_type;
        T value;
        inner_derived(const T&value):value(value){}
        inner_derived*clone(){return new inner_derived(value);}
    };
    inner_base*value;
    template<typename T>base(const T&value):value(new inner_derived<T>(value)){}
    base(const base&value):value(value.value->clone()){}
    base&operator=(base b){swap(b);return *this;}
    base():value(new inner_base){}
    ~base(){delete value;}
    void swap(base&b){inner_base*p=value;value=b.value;b.value=p;}
    template<typename T>operator T&(){return dynamic_cast<inner_derived<T>&>(*value).value;}
};
#include<iostream>
int main(){
    base tmp=1;
    int value = tmp;
    std::cout << value;
}

491 名前:デフォルトの名無しさん :2006/03/01(水) 20:46:37
>>485-490
爺に教えてくれて感激じゃ…。じゃが、やはり標準C++では無理なことかのう。

>>487のようにしてしまうと、

derived_generator(1);

この関数テンプレートは、引数の型を判別して derived<int> のインスタンスを生成するのに
別の場所でintだと明示しないとならないのは厳しいのう。

と思うたら

>>490
これはすごいことじゃ…天狗じゃ…天狗が現れおった…!!
爺の用途には暗黙の型変換でも十分じゃ。じっくり読むだえ。

492 名前:デフォルトの名無しさん :2006/03/01(水) 21:09:45
>>489
要らないと思う。
クラステンプレートとそれを生成するテンプレート関数でいいだろ。

493 名前:デフォルトの名無しさん :2006/03/02(木) 18:45:41
class HogeState;
void change( HogeState* new_state );

class HogeState{
 int ahe, uha;
public:
 void foo(){
  change( new HogeState );
  ahe = 777;
 }
 void foo2(){
  ahe = 888;
  change( new HogeState );
 }
};

HogeState* state = 0;
void change( HogeState* new_state ){
 if( state ) delete state;
 state = new_state;
}

int main(){
 HogeState hoge;
 hoge.foo();
 hoge.foo2();
 return 0;
}
foo()では、自分がdeleteされた後にaheに代入し、しかもエラーが出ませんが、これはOKなんでしょうか?
foo()が駄目だとしたら、foo2でも危うい気がするのですが、実際どうなんでしょう。

無理矢理1ファイルに書いたら意味のないコードになってしまいました。ご容赦を。

494 名前:デフォルトの名無しさん :2006/03/02(木) 18:54:01
>>493
> change( new HogeState );
newで新しく確保して、それを渡しているだけ。hoge関係なし。
> if( state ) delete state;
deleteにNULL渡しても問題ないからif(state)は意味ない。
deleteで開放しているのはさっき新しく確保したHogeStateであってhogeではない。
> state = new_state;
仮引数に代入した所で意味はない。

なんか大混乱コードだなぁ。

495 名前:493 :2006/03/02(木) 19:18:19
本当だ、なんだこれは…。申し訳ないです、元はこんなのでした。
class Hoge{ //Hoge.h--------------------------------
 HogeState* state;
public:
 Hoge(){ state = new HogeState; }
 void changeState( HogeState* new_state ){ delete state; state = new_state; }
 void foo(){ state->foo( this ); }
 void foo2(){ state->foo2( this ); }
};
class Hoge; //HogeState.h---------------------------
class HogeState{
 int ahe;
public:
 void foo( Hoge* hoge );
 void foo2( Hoge* hoge );
};
#include "HogeState.h" //HogeState.cpp---------------
#include "Hoge.h"
void HogeState::foo( Hoge* hoge ){
 hoge->changeState( new HogeState );
 ahe = 777;
}
void HogeState::foo2( Hoge* hoge ){
 ahe = 888;
 hoge->changeState( new HogeState );
}
#include "HogeState.h" //main.cpp--------------------
#include "Hoge.h"
int main(){
 Hoge hoge;
 hoge.foo(); hoge.foo2();
}

496 名前:デフォルトの名無しさん :2006/03/02(木) 19:24:20
>494
仮引数?

> さっき新しく確保したHogeState
ちがわね?

497 名前:デフォルトの名無しさん :2006/03/02(木) 19:44:44
>>495
> ahe = 777;
deleteされたインスタンスに対してメンバ変数に変更を加えてるのでダメ

> ahe = 888;
deleteされる前に触ってるからOKだけど
直後のchangeStateで触ったインスタンスはdeleteされるので意味なし

じゃないかな?


498 名前:493 :2006/03/02(木) 19:50:12
497さんレスありがとうございます。
デリート済みインスタンスの関数であっても、
メンバにアクセスしなければ大丈夫、という結論でよろしいのでしょうか。

メンバ関数であっても、所詮は関数という感じでよさそうなのですね。

499 名前:デフォルトの名無しさん :2006/03/03(金) 03:24:13
エラー・例外が出ないから大丈夫、というのは個人的にはあんまり好きではないな。
メンバ関数にはthisポインタが渡されるだけで、あとは確かに通常の関数とほぼ同じだが
thisポインタが無効になった時点でそれ以上そのクラスオブジェクトは仕事を続けるべきではないと思う。

500 名前:475 :2006/03/03(金) 03:43:39
今アクセスしたら認証要求が出たよ・・・
やっぱりダメだったんだろうな。


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