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


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

C++相談室 part44
251 名前:デフォルトの名無しさん :2005/10/17(月) 16:38:49
>>250

Nが整数で20程度ならテーブル参照がいい気がします

252 名前:デフォルトの名無しさん :2005/10/17(月) 17:51:59
>>250
何でもいいけどtypeじゃなくてvalueにしとけよ気持ち悪い

253 名前:デフォルトの名無しさん :2005/10/17(月) 18:58:23
スレ違いだけど、ウンコは苦いよ。

254 名前:デフォルトの名無しさん :2005/10/17(月) 19:00:13
>>253
既出

255 名前:デフォルトの名無しさん :2005/10/17(月) 19:28:24
>>250
それってコンパイルしなのでは。

256 名前:255 :2005/10/17(月) 19:43:54
このへんかな。
ttp://www.kuzbass.ru/docs/isocpp/class.html#class.static

257 名前:デフォルトの名無しさん :2005/10/17(月) 21:47:37
>>250
もういっそのこと
各型での結果をそれぞれ float.csv, double.csv, ldouble.csv にでも保存しといて

const float decimal_place_float[] = {
#include "float.csv"
};
const double decimal_place_doulbe[] = {
#include "double.csv"
};
const long double decimal_place_long_doulbe[] = {
#include "ldouble.csv"
};

とかってしたら?

258 名前:248 :2005/10/18(火) 00:34:50
>>250はマクロを使って定義自体はそれなりに簡潔に書けました。typeは糞ですなスマンコ
gccで-O3オプションをつければ、特殊化した1-20については
アセンブラファイルを見る限りコンパイル時に定数にしてくれるっぽいです。
テーブル参照も試してみます。
csvも面白いアイディアです。thxです。

259 名前:デフォルトの名無しさん :2005/10/18(火) 00:43:46
>>258

template <typename T, int N>
struct decimal_place {
static const T value = decimal_place<T, N - 1>::value / 10;
};

これってできない?
#今臥せっててコンパイラつかえないの。

260 名前:デフォルトの名無しさん :2005/10/18(火) 00:47:28
>>259
これでgccは通った(他は知らね)

template <typename T, int N>
struct decimal_place {
    static const T value = decimal_place<T,N-1>::value/10;
};
template <typename T> struct decimal_place<T, 0> { static const T value = (T)1; };

261 名前:デフォルトの名無しさん :2005/10/18(火) 01:39:45
最近のは整数値以外の定数もテンプレート展開されるのか。

262 名前:デフォルトの名無しさん :2005/10/18(火) 02:54:47
>>261
ヒント:テンプレート引数は整数

263 名前:248 :2005/10/18(火) 03:04:56
>>259-260
ウチのgccでもコンパイル通りました。
パフォーマンス的にも数字書く方式と変わらないです。
std::pow()で計算するより二桁ほど速く、十分なスピードです。
ありがとうございました。

264 名前:デフォルトの名無しさん :2005/10/18(火) 03:07:00
static const メンバ変数に初期化子を付けていいのは
整数型と enum 型だけだよ。

float 等に対応するには value を関数にすればいいんだろうな。
でも最適化されにくそうだな。

265 名前:デフォルトの名無しさん :2005/10/19(水) 14:41:49
inline指定した時に、展開されなくなる最低条件みたいなのありますか?

266 名前:265 :2005/10/19(水) 14:49:04
とりあえず、調べて

・ループ
・静的変数
・goto
・再帰
・switch

をやると展開されなくなるっぽいですね。
switchはなんか納得いきませんけど。

他にありますか?


267 名前:デフォルトの名無しさん :2005/10/19(水) 14:52:31
>>265
コンパイラに依存

268 名前:デフォルトの名無しさん :2005/10/19(水) 15:01:32
>>266
ここ逝け

【初心者歓迎】C/C++室 Ver.22【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1128872687/

269 名前:265 :2005/10/19(水) 15:02:22
確かに、そうなんですよね。
でも、なんかガイドラインというか、
だいたい、これをやるとだめだ、

みたいなのがあるのかな〜と思って。


270 名前:デフォルトの名無しさん :2005/10/19(水) 15:09:01
>>269
お前の脳内ガイドラインか?w
規格票ぐらい最低目を通しとけ。

271 名前:デフォルトの名無しさん :2005/10/19(水) 15:18:32
「あるのかなぁ」のどこが脳内なんだか。
あまり頭の悪い煽りすんなよ、寒いから。

272 名前:デフォルトの名無しさん :2005/10/19(水) 16:39:10
>>269
実際コンパイラによってかなり違うと思う。
g++3.2.3だと、gotoとforループを含む関数をインライン化した(static変数とswitchは試した範囲ではだめだった)。

273 名前:272 :2005/10/19(水) 16:46:43
static変数も単純な関数ならいけるね。

274 名前:デフォルトの名無しさん :2005/10/19(水) 17:34:41
>>270
英語が読めない馬鹿か。可愛そうに。氏んでいいよ。

275 名前:デフォルトの名無しさん :2005/10/19(水) 17:55:11
>>271
説明になってないから。寒けりゃ練炭でも抱いて寝れば?wwww

276 名前:デフォルトの名無しさん :2005/10/19(水) 18:26:21
>>275
練炭って、どこで売ってますか?


277 名前:デフォルトの名無しさん :2005/10/19(水) 20:38:01
激しくレベルが低い質問でとても恥ずかしいのですが教えてください。
Linuxでアプリケーション作っているんですけど、そのアプリケーションの
設定ファイルをそれぞれの一般ユーザーのホームディレクトリに作りたいと
思っています。プログラム自身は/usr/local/binに置くつもりです。

ofstream fout("hogehoge.txt");

でファイルを作ると実行ファイルと同じ場所に出来てしまいます。
というか、/usr/local/binではパーミッションで作れません。
ホームディレクトリはどのように指定してやればいいのでしょうか。
教えてください。お願いします。
FedoraCore4でフルインストール、フルアップデートな状態です。

278 名前:デフォルトの名無しさん :2005/10/19(水) 20:41:17
>277
環境依存な質問だから以下のスレで聞いたほうが良い

【初心者歓迎】C/C++室 Ver.22【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1128872687/

279 名前:デフォルトの名無しさん :2005/10/19(水) 20:51:22
>>278 ありがとうございます。行ってみます。

280 名前:デフォルトの名無しさん :2005/10/19(水) 23:03:50
>>275
もうちょっとマシな負け犬の遠吠えを期待したんだけどな。
練炭ねえ。やっぱり寒いわ、君のセンス。

281 名前:デフォルトの名無しさん :2005/10/19(水) 23:41:32
犬といっしょに泥んこになって遊ぶ子供みたいだな

282 名前:デフォルトの名無しさん :2005/10/20(木) 02:36:01
>>281
なんか心洗われるようなシーンだな。

283 名前:デフォルトの名無しさん :2005/10/21(金) 01:24:36
コンストラクタにconstはいりますか?

284 名前:デフォルトの名無しさん :2005/10/21(金) 02:25:48
>>283
メンバ関数の場合のconstの有無からの連想で質問しているとしたら、要らない。
何故ならばコンストラクタではインスタンスを初期化しなければならないため、常にconstではありえない。

285 名前:デフォルトの名無しさん :2005/10/21(金) 16:48:09
>>283
そもそもコンストラクタ(・デストラクタ)にconstはつけられない。

286 名前:デフォルトの名無しさん :2005/10/21(金) 17:50:01
つかぬことをお聞きしますが、
BoostのURLにある
hamaji _at_ nii.ac.jp / shinichiro.h
最後のhですが、niftyにおける「ハンドル名」は
花田なんてことはないですよね?


287 名前:デフォルトの名無しさん :2005/10/21(金) 17:58:03
template<template <class T> class U> とは書けるのに
template<template <typename T> typename U> と書けないのはなんでですか?
いままで template 引数の中の class と typename は同じだと思っていたのですが・・・。

288 名前:デフォルトの名無しさん :2005/10/21(金) 18:02:06
>>287
おそらくU<T>として使えるのはUがクラステンプレートの場合しかあり得ないからだろう。
ちなみにtemplate<template<typename T> class U>はできる。

289 名前:デフォルトの名無しさん :2005/10/21(金) 18:12:17
最近C++を始めてみようと、
「Visual C++.net Standard Version2003 アカデミック」
を購入しました。
6枚のCDを出したり入れたりして4段階のセットアップが完了し
早速起動してみました。

よくわからなかったのでとりあえず
ファイル⇒新規作成⇒プロジェクト
で「test」と名づけたプロジェクとを作成したところ
以後「既存のプロジェクトを開く」の一覧から「test」を左ダブルクリックで選択すると
選択した瞬間にエラーが発生してC++が強制再起動します。

また、その後に作成した「test2」というプロジェクトは
選択時はセーフなのですが
プロパティを見ようとすると同様に強制再起動します。

これの解決策をご教授くださいませ・・・

290 名前:デフォルトの名無しさん :2005/10/21(金) 18:13:49
>>289
スレ違い。

くだすれVisual C++(超初心者用)
ttp://pc8.2ch.net/test/read.cgi/tech/1118781438/

291 名前:287 :2005/10/21(金) 18:27:20
>>288
反例がtemplateな関数ポインタとかで作れないかと考えてみましたが、断念しました。
というわけで、U はクラスしか取り得ないということで覚えておきます。ありがとうございました。

292 名前:デフォルトの名無しさん :2005/10/21(金) 20:21:59
>>287

template<typename T> class U
でUという型名だとすると、これを

template<typename T> typename U
とは書けないからではなかろうか。

293 名前:デフォルトの名無しさん :2005/10/22(土) 00:07:07
簡単なインストーラを作りたいんですが、どなたか教えてください。
実際、やることは簡単で、myapp.exeを指定したフォルダにコピーするだけです。
で、myapp.exeをインストーラと同じフォルダに入れておけば、myapp.exeを
いったん読み込んで、指定したフォルダに書き込むプログラムはすぐできます。
しかし、そうではなくて、インストーラの中にmyapp.exeのデータを埋め込んで
しまいたいのです。ユーザから見えないように。
また、インストーラをファイル1つにするために。
とすると、バイナリのデータファイルの内容を、実行可能ファイル(今の場合、
インストーラ)にマージさせることなどが可能なのでしょうか?
そうでないなら、ファイル1つのインストーラはどのようにできているのでしょうか。
どなたか、教えていただけないでしょうか。

294 名前:デフォルトの名無しさん :2005/10/22(土) 00:11:26
できる

295 名前:デフォルトの名無しさん :2005/10/22(土) 00:11:52
win32質問スレに池
http://pc8.2ch.net/test/read.cgi/tech/1128951330/l50
あとヒントはリソースだ

296 名前:デフォルトの名無しさん :2005/10/22(土) 00:41:34
>>293
フリーなら、Nullsoft Scriptable Install System はどうか?
http://nsis.sourceforge.net/
結構色んなソフトで使われてる。
スクリプトの仕様も結構簡単。

297 名前:デフォルトの名無しさん :2005/10/22(土) 00:42:48
C++とどう関係が?

298 名前:デフォルトの名無しさん :2005/10/22(土) 18:15:35
staticクラスメンバについての質問なんですが
定義はどこでやるのがよいでしょうか?
今のところmain関数前にまとめて定義してたのですが
数が増えてきたり、初期化が複数行に渡ってるものがあったりで見づらくなってきました
staticクラスメンバ用のヘッダファイルとか用意したほうがいいのでしょうか

299 名前:デフォルトの名無しさん :2005/10/22(土) 18:26:08
>>298
クラスに対応したヘッダとソースを用意するのが一般的。
static メンバ変数の定義はそのソース側でやればいい。

ヘッダで変数の定義をするのだけはやめとけ。

300 名前:デフォルトの名無しさん :2005/10/22(土) 18:34:51
ありがとうございます!
ソースで宣言することにいたします

301 名前:デフォルトの名無しさん :2005/10/22(土) 18:44:27
定義な

302 名前:デフォルトの名無しさん :2005/10/22(土) 18:55:46
質問です
template でも void * でも同じ動きをする関数では、
普通はどっちを使ったほうがいいでしょうか?

template <class X> void funcTemplate_1 (X **p);
void funcPointer_2 (void **p);

みたいなやつなんですが・・
どなたかよろ m(__)m

303 名前:デフォルトの名無しさん :2005/10/22(土) 19:01:12
>>302
「いい」の基準がわからん。

まぁ template 版のほうが型を知っている分、
良い仕事してくれるんじゃないかな?

304 名前:デフォルトの名無しさん :2005/10/22(土) 19:05:49
テンプレートだと、型情報を失わないが、
型ごとに関数を作るからコードのサイズが大きくなりやすい。
ポインタだと、型情報を失うが、
関数が一つだからコードのサイズは小さく済む。

両方の利点を取るために下の関数を内部で呼び出すだけのinline関数を作るのが良いと思う。
そうすれば使うほうは型情報を失わないし、関数は一つしか作らずに済むから

void funcPointer_2 (void **p); 
template <class X>inline void funcTemplate_1(X **p){
    funcPointer_2(p);
}

305 名前:304 :2005/10/22(土) 19:09:11
あ、template関数の中でキャストするの忘れてた。

306 名前:302 :2005/10/22(土) 19:12:20
おおお、そんな技が!凄い!
さっそくためしてみまっす。

>>303 >>304 >>305
ことば足らずですみませんでした。
どうもありがとうございます〜 m(__)m

307 名前:293 :2005/10/22(土) 19:28:10
>>294
ありがとうございます。
わかりました。
>>295
ありがとうございます。
そちらのスレに質問を書きました。
>>296
ありがとうございます。
見てみます。

308 名前:デフォルトの名無しさん :2005/10/22(土) 19:37:20
質問です。

class X
{
 vector<int> v;
public:
 void show() const;
 ...
};

void X::show() const {
 for(vector<int>::iterator i = v.begin(); i != v.end(); i++) {
  cout << *i << endl;
 }
}

みたいなコードを書いたらコンパイルエラーになりました。それでiteratorをconst_iteratorに
するとエラーでなくなります。それは、たぶん、showがconstだからかなとも思うのですが、
ちょっと納得がいきません。この解釈でよいのでしょうか。
v自身はconst vector<int>ではないので、const_iteratorでなくてもいいような気もするのですが。

309 名前:デフォルトの名無しさん :2005/10/22(土) 19:43:36
>>308
constメンバ関数中では、変数はすべてconstと見なされる。
それが嫌なら、mutableと宣言すべき。

310 名前:デフォルトの名無しさん :2005/10/22(土) 19:53:25
↑変数とは、メンバ変数の事ね。ローカル変数には適用されない。

311 名前:デフォルトの名無しさん :2005/10/22(土) 20:22:47
>>304
アフォがいるよ

312 名前:デフォルトの名無しさん :2005/10/22(土) 20:52:26
VCで画像を使ったプログラミングをしていて
>>9の他ライブラリリンク集の
http://www.kmonos.net/alang/cpp/lib.html
に紹介してあったVIGRAを使いたいんですが
http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/(公式ページ)
日本語で使い方を解説してあるサイトってありませんか?
もしくはもっといい画像処理のライブラリってありませんか?

313 名前:デフォルトの名無しさん :2005/10/22(土) 20:53:56
つ[ImageMagick]
つ[LeadTool]
つ[google.com]

314 名前:初心者 :2005/10/22(土) 22:16:15
最近、C++で一つのプログラムを書きました。実行するときDOSの状態で日本語を入力
したいですが。どうすればいいですか?知ってる方是非教えてください。

315 名前:デフォルトの名無しさん :2005/10/22(土) 22:17:33
スレ違い

316 名前:デフォルトの名無しさん :2005/10/22(土) 22:17:59
ALT+半角/全角

317 名前:初心者 :2005/10/22(土) 22:18:40
最近、C++で一つのプログラムを書きました。実行するときDOSの状態で日本語を入力
したいですが。どうすればいいですか?知ってる方是非教えてください。

318 名前:デフォルトの名無しさん :2005/10/22(土) 22:21:50
config.sysを書き換える

319 名前:初心者 :2005/10/22(土) 22:24:50
デフォルトの名無しさん 、ありがとうございます。

320 名前:デフォルトの名無しさん :2005/10/22(土) 22:30:36
うほっイイ初心者

321 名前:デフォルトの名無しさん :2005/10/22(土) 22:57:27
#include <iostream>
#include <vector>
using namespace std;

class Base{
public:
 Base(const string& s) {}
};
class Derived : public Base{
public:
 Derived(const string& s) : Base(s) {}
};

int main(){
 vector<Base*> data;
 data.push_back(new Derived("D"));
}

をBorlandC++でコンパイルすると警告がでます。(上は全角空白を使ってます)

警告 W8030 vec_test.cpp 18: '__x' パラメータ(vector<Base *,allocator<Base *> >:
:push_back(Base * const &))のために一時変数を使用する(関数 main() )

どうしてだかわかる方いますか?頭が変になりそうです。

322 名前:デフォルトの名無しさん :2005/10/22(土) 23:01:59
そのままの意味だと思うが。

323 名前:321 :2005/10/22(土) 23:06:02
>>322
すみません。確かに一時変数を使っているのでそのままですが、
data.push_back(new Base("B"));
では警告がでません。また、コンストラクタを引数無しのものに変えると警告が消えます。
ということで何がなんだかわからないのです。

324 名前:321 :2005/10/22(土) 23:07:23
すみません。それで、一番知りたい事は、push_backの引数に一時変数を使うことが
警告されるような悪いことかということなんです。

325 名前:デフォルトの名無しさん :2005/10/22(土) 23:08:31
data.push_back( static_cast<Base*>(new Derived("D")) );
とか?
でもそれをsortとかしたらスライシングされるからやめとけ。

326 名前:デフォルトの名無しさん :2005/10/22(土) 23:10:49
つか軽くぐぐるだけで出ると思うが
ttp://www.tietew.jp/cppll/archive/7203
ttp://piza.2ch.net/tech/kako/980/980175292.html
(下は751から)

327 名前:デフォルトの名無しさん :2005/10/22(土) 23:10:52
>>324
まったく悪くない

328 名前:321 :2005/10/22(土) 23:12:19
>>325
レスありがとうございます。
でも、キャストしても警告は消えません。動作に問題ないようなので警告を無視してもいいのかも
しれませんが、なんだかものすごく嫌なんです。
それとsortでスライシングってどういう意味でしょう。スラインシングの意味がわからないのですが。

329 名前:321 :2005/10/22(土) 23:16:42
>>326-327
ありがとうございます。
Borlandの警告のバグということでしょうか。
>>326の下の752の「原則」は誤りだと思います。
一時変数をconst参照に渡しても問題ないと思うのです。


330 名前:デフォルトの名無しさん :2005/10/22(土) 23:16:52
325は知ったかだから

331 名前:デフォルトの名無しさん :2005/10/22(土) 23:17:15
>>325
いい加減な事を言うな

332 名前:デフォルトの名無しさん :2005/10/22(土) 23:24:08
じゃたぶん
v.push_back(static_cast<Base*>(static_cast<void*>(new Derived("hoge"))));
かもしくは
vector<Base*> v(0); //初期化

のどっちか、そんでv.sort()でスライシングってのは間違い、
だけども delete v.back(); ってやるとスライシングが起きる。
つまりBaseのデストラクタとBase用のdeleteが動くので、
new Derived で確保したデータが残ったりデストラクタが行うプロセスとか無視されたりする
ような気がする、、、

333 名前:デフォルトの名無しさん :2005/10/22(土) 23:26:21
>>332
それはス雷寝具とは言わない。

334 名前:デフォルトの名無しさん :2005/10/22(土) 23:27:31
>>332
もういい。バカは黙ってろ。

335 名前:デフォルトの名無しさん :2005/10/22(土) 23:28:01
>>332
ROMしてろ

336 名前:332 :2005/10/22(土) 23:30:40
ちくしょうメモリはかいされろ。

337 名前:デフォルトの名無しさん :2005/10/22(土) 23:31:01
総叩きワロス

338 名前:デフォルトの名無しさん :2005/10/22(土) 23:31:21
ワロタw

339 名前:321 :2005/10/22(土) 23:34:33
仮想デストラクタがないという話だったんですね。すみません。
(でも、>>321ではデータメンバがないので、問題ないような。
そうとも言えないのかな?)
それはそれとして、BorlandC++のバグということで寝ます。
みなさんありがとうございました。

340 名前:デフォルトの名無しさん :2005/10/22(土) 23:36:29
問題ないってw

341 名前:デフォルトの名無しさん :2005/10/22(土) 23:40:59
>>329
過去スレのほうはもうちょっと先を読め。

342 名前:デフォルトの名無しさん :2005/10/23(日) 00:31:37
W8038 定数メンバー 'member' は初期化されていない コンパイラ警告

(この警告の表示抑止用コマンドラインオプション = -w-nci)
この C++ クラスには定数メンバー member が含まれていますが,member は初期化子を持っていません。
定数メンバーの初期化は可能ですが,定数メンバーへの代入はできない点に注意してください。



343 名前:デフォルトの名無しさん :2005/10/23(日) 00:33:12
int n;
string s;
cin >> n;
getline(cin, s);
とすると、2行目の入力で3行目まで行っちゃう。
それは、cinで拾えなかった改行がgetlineで拾われるから?
その対策に、getlineの前に、cin.sync();を入れてみたんだが、それでいい?

344 名前:デフォルトの名無しさん :2005/10/23(日) 00:34:23
×2行目の入力で3行目まで行っちゃう。
○3行目の入力で4行目まで行っちゃう。

345 名前:デフォルトの名無しさん :2005/10/23(日) 00:35:19
>>343
「(入力が)3行目まで行っちゃう」の意味がわからない。

346 名前:デフォルトの名無しさん :2005/10/23(日) 00:47:06
>>345
cin >> n;
で入力待ちになるが、そこでint値を入力すると、次のgetlineで入力待ちにならない。
その対策にcin.sync();って、どこかのホムペで見たことがある。

347 名前:デフォルトの名無しさん :2005/10/23(日) 02:57:25
プログラムが長くなってきて修正がしんどいので
ソースファイルを複数に分けたいのですが
定義をメインのソースでして、中身を別のソースファイルに書いて
g++ メインのソース 別のソースって感じでいけますか?

348 名前:デフォルトの名無しさん :2005/10/23(日) 03:10:40
>>347
キーワードを教えてやるよ。あとは自分で考えな。
宣言と定義
分割コンパイル
ヘッダファイル

349 名前:デフォルトの名無しさん :2005/10/23(日) 04:22:32
C言語のスレかと思ったぜ

350 名前:デフォルトの名無しさん :2005/10/24(月) 12:21:07
勉強不足な貴方のためにスライシングの話を軽く。

struct Base { int val1; virtual ~Base(){} };
struct Derived : public Base { int val2; };
※sizeof(Base) == 8、sizeof(Derived) == 12 とする

Base * p = new Derived[5];
++p;

上記がスライシング。
++p だと、p から 8Byte しか進まないので、
p が指している場所は、次の Derived ではなく、
Derived の中途半端な位置を指していることになる。

std::vector< Base > vec(5) に対して、
vec.push_back( vec.begin() + 1, Derived() );
をやると、Derived の Base 部分しかコピーされないので、
これもスライシングの一種。

std::vector< Base * > vec2(4); に対して、
vec2.insert( vec2.begin()+1, new Derived() ); とするのは安全。


351 名前:デフォルトの名無しさん :2005/10/24(月) 13:21:15
ワロタ

352 名前:デフォルトの名無しさん :2005/10/24(月) 16:16:45


353 名前:デフォルトの名無しさん :2005/10/24(月) 17:19:35
>>350
元々は後者をスライシングと言い出したような気がするが俺の勘違い?

354 名前:デフォルトの名無しさん :2005/10/24(月) 18:06:10
部分的に切り出すことをスライシングっていうから、後者のほうが本来の意味だと思う。


355 名前:デフォルトの名無しさん :2005/10/24(月) 18:18:34
で、その心は?

356 名前:デフォルトの名無しさん :2005/10/24(月) 18:42:57
前者って、単にオブジェクトのsizeofが違うだけじゃないの?
別に継承は関係ないだろ。ま、ポインタを代入する時にエラー出るが。

357 名前:デフォルトの名無しさん :2005/10/24(月) 18:53:49
m9(^Д^)プギャー

358 名前:デフォルトの名無しさん :2005/10/24(月) 19:37:21
>>356
配列をポリモーフィックに扱うなってことだよ

359 名前:デフォルトの名無しさん :2005/10/24(月) 23:03:44
>>358
それは誰でもわかる。そのためにboost::ptr_vectorなんかがわざわざ
用意されたんだろ。

360 名前:デフォルトの名無しさん :2005/10/24(月) 23:21:46
>>350
前者はスライシングとは言わない。
勉強しろよ。

361 名前:デフォルトの名無しさん :2005/10/24(月) 23:23:37
んなことわからなくても、仕事は出来るから別にいいや。

362 名前:デフォルトの名無しさん :2005/10/24(月) 23:25:52
m9(^Д^)プギャー

363 名前:デフォルトの名無しさん :2005/10/25(火) 01:04:02
C++なら素直にstd::vector使っとけと言う事だよな……


364 名前:デフォルトの名無しさん :2005/10/25(火) 01:06:40
yes

365 名前:デフォルトの名無しさん :2005/10/25(火) 17:14:45
C++ではstructとclassは、デフォルトのアクセス権がpublicかprivateかの違いだけです。
そこで質問というか、他人はどう書くのか聞いてみたく。

1. 全メンバがpublicのとき
イ) struct X {
 int member;
};
ロ) class X {
public:
 int member;
};

2. 一部メンバがpublic、その他はprivateのとき
イ) struct {
 int pub_mem;
private:
 int pri_mem;
};
ロ) class {
public:
 int pub_mem;
private:
 int pri_mem;
};
ハ) class {
 int pri_mem;
public:
 int pub_mem;
};
大学の研究室向けコーディング規約を見直しているところで、
そこそこC++コード書いてる他の人はどうか知りたいのです。

366 名前:デフォルトの名無しさん :2005/10/25(火) 17:27:17
とりあえずデータメンバに対してpublicとprivate混ぜるのは非常に気持ち悪い
もちろん状況によるが

367 名前:デフォルトの名無しさん :2005/10/25(火) 18:01:14
より基底クラスかつ初期化と代入以外のメンバ関数を
定義しなさそうなやつはstructの傾向がある。


368 名前:デフォルトの名無しさん :2005/10/25(火) 18:07:50
templateでenumハックするときはstruct

369 名前:デフォルトの名無しさん :2005/10/25(火) 18:13:48
Cの時と同じようにデータをまとめる場合はstruct
何かをカプセル化する場合はclass

370 名前:デフォルトの名無しさん :2005/10/25(火) 18:18:44
ファンクタはstruct。あとはclass。

371 名前:デフォルトの名無しさん :2005/10/25(火) 20:22:59
>>366 private/publicの例示として書いたのでそこは無視していただきたいところです。

けっこうclass/structは意味で分けるのかな。

クラス定義の先頭には公開メンバーを書き、次にprotected、最後にprivateと
隠蔽するにつれて後ろにする書き方があって、そうすると定義の最初は
常にpublicということになる(2-イの書き方)。
こういう書き方の人はいないのかなあ?
もっともこの書式だと、ほとんどclassを使うことがなくなるのだが。

372 名前:デフォルトの名無しさん :2005/10/25(火) 21:41:18
classとstructのコード上の違いは確かにそれだけでしかないが、
意味としてのクラスと構造体は天と地ほどの差がある。

抽象データ型やポリモーフィズムを行うものにstructはおかしいし、
= {}の形式で初期化をするようなものがclassでもなんだか不自然。
まあ、関数オブジェクトや368のようなものはstructでも定石のようなものだから良い。

373 名前:デフォルトの名無しさん :2005/10/25(火) 22:01:26
>>372
>意味としてのクラスと構造体は天と地ほどの差がある。
おまえが勝手に異なる意味を見出してるだけだと思うが。

先行宣言に便利なように、どっちかに完全に統一するのがいいと俺は思う。

374 名前:デフォルトの名無しさん :2005/10/25(火) 22:35:44
よしわかったこれ使え
#define class struct
俺は使い分ける。

375 名前:デフォルトの名無しさん :2005/10/25(火) 23:00:59
オブジェクトならclass、データ構造でもコンストラクタ/デストラクタ以外の公開メンバ関数を持ったらclassにしている。
蔭でこそこそやるだけのデータ構造ならstruct。
例えば、↓はstruct。
struct foo {
int x;
int y;
foo() : x(0), y(0) {}
};
そして↓はclass。
class bar {
public:
int x;
int y;
bar() : x(0), y(0) {}
void set(int tx, int ty) {x = tx; y = ty;}
};
今悩んでいるのは、オペレータを持つデータ構造をclassにするかstructにするか。
例えば↓みたいな。
struct fooz {
int x;
int y;
fooz() : x(0), y(0) {}
operator double() {return hypot(x, y);}
};
#あくまで例なのでコード内容への突っ込みは勘弁。

376 名前:デフォルトの名無しさん :2005/10/25(火) 23:03:19
>>374
お前が使い分けるのは自由だが、そのルールを他の人も守ってるとは思わないでくれよ
俺はほとんど全てのメンバが公開されたとき意味を持つものを struct にして ほかは class にしてる

377 名前:デフォルトの名無しさん :2005/10/25(火) 23:58:09
ほとんど全てとはまた曖昧だな

378 名前:デフォルトの名無しさん :2005/10/26(水) 00:13:43
結論は、>>365に、C++はムリだと。

379 名前:デフォルトの名無しさん :2005/10/26(水) 00:17:35
ところで上のほうにあったスライシングだが、

class Base{ int val1; };
class Derived : public Base { int val2; };

で、

Derived d;
Base b = d; ←これだけだろ。

なんだかご苦労さんって話だよね。

380 名前:デフォルトの名無しさん :2005/10/26(水) 00:28:35
>>379のBaseに仮想デストラクタがないのはいいのか?

381 名前:デフォルトの名無しさん :2005/10/26(水) 00:29:53
いい

382 名前:デフォルトの名無しさん :2005/10/26(水) 00:38:41
>>381
もちろん>>379のコード内で問題はない。
しかし、派生クラスを作る以上、仮想デストラクタを書いておくべきではないのか、ということだが。

383 名前:デフォルトの名無しさん :2005/10/26(水) 00:42:08
べきではない。こんな下らんクラス1個につき4バイト多く消費する

384 名前:デフォルトの名無しさん :2005/10/26(水) 01:03:37
>>382
基底クラスのすべてに仮想デストラクタをつけるべきではありません。
基底クラスのポインタで派生クラスのオブジェクトを扱う場合にのみ必要となります。

385 名前:デフォルトの名無しさん :2005/10/26(水) 01:56:41
>384
C++ Coding Standardsにそのネタあるな。
 基本クラスのデストラクタはpubilc仮想かprotected非仮想にする
だって。

386 名前:デフォルトの名無しさん :2005/10/26(水) 02:01:37
あのさ、独習C++第3版でC++の勉強してるんだけど、
438ページに

template <class T, class Allocator = allocator<T>> class vector

ってあるんだけど、
class Allocator = allocator<T>の部分の意味がわからないんだけど・・・
Allocatorはクラス名で、allocator<T>ってのは何者?
クラス名(Allocator)にallocator<T>を代入?

387 名前:デフォルトの名無しさん :2005/10/26(水) 02:04:11
>>386
テンプレートvectorの第二パラメタAllocatorのデフォルトをallocator<T>に指定している。
このallocator<T>はstd::allocator<T>のこと。

388 名前:デフォルトの名無しさん :2005/10/26(水) 02:05:06
allocator<T>っていうのはクラス名?

389 名前:デフォルトの名無しさん :2005/10/26(水) 02:08:21
うん

390 名前:デフォルトの名無しさん :2005/10/26(水) 02:11:45
あ、なるほどわかった、トンクス!

391 名前:デフォルトの名無しさん :2005/10/26(水) 13:47:05
>>385
>基本クラスのデストラクタはpubilc仮想かprotected非仮想にする
そう言った端から、「そうでないこともある」と書いてあるような。
マレなケースとか書いているが。
ちなみに、Effectiveの方はもっとマイルドに、ポリモルフィックな
基底クラスには仮想関数を付ける。ポリモルフィックでないときは、
メモリ損するから考えろみたいに書いてある様子。英語なんで、
自信ないが。というか、読める奴の受け売りだが。
んで、>>383が正解な希ガス。

392 名前:デフォルトの名無しさん :2005/10/26(水) 15:00:42
>>373
この流れからすると、どう考えても
「異なる意味を見出す」という所行は>>372の勝手なものではないね。
どう言い訳する?

393 名前:_ :2005/10/26(水) 15:52:06
はじめまして、こんにちわ。
ニューラルネットネットワークのバックプロパゲーションの
プログラムってどんくらい難しいですか??
どなたか何か情報を教えてください。
よろしくお願いします。


394 名前:デフォルトの名無しさん :2005/10/26(水) 15:52:55
>>393
単純な実装なら簡単。

395 名前:デフォルトの名無しさん :2005/10/26(水) 18:17:18
>>392
俺が「勝手に」と言ったのは
「一般の慣行から離れて」という意味じゃなく
「処理系や言語仕様から離れて」という意味だから、
間違ってるとは思わない。

誤解を招く言いかたスマソ

396 名前:デフォルトの名無しさん :2005/10/26(水) 21:35:00
初心者なのですが
プログラムを起動させることってできるのでしょうか
たとえばテキストエディッタなどを起動するようなプログラムを
作りたいのですが。
お願いします。

397 名前:デフォルトの名無しさん :2005/10/26(水) 21:40:58
>>396
<cstdio>のstd::system関数。

398 名前:デフォルトの名無しさん :2005/10/26(水) 21:42:22
C++での質問です
void hoge(int i, char *str,...);
というプロトタイプ関数があるのですが
strの後ろの「...」とはどんな意味があるのですか?

399 名前:デフォルトの名無しさん :2005/10/26(水) 21:46:37
>>398
そもそもここでC++以外の質問されても困るけどな。
可変長引数でググレカレー

400 名前:デフォルトの名無しさん :2005/10/26(水) 22:28:11
可変長引数なんて捨てれ。それはCだ。



と言ってみたりみなかったり。

401 名前:デフォルトの名無しさん :2005/10/26(水) 22:40:19
>>399-400
C++にも可変個引数はあるということでいいではないか。

402 名前:385 :2005/10/26(水) 23:50:01
>391
>そう言った端から、「そうでないこともある」と書いてあるような。

どこに?この前出版された和訳本はそんなことないけど。

ちなみに要旨は
 「オブジェクトをどうやって破棄するかを考えてデストラクタを定義しろ」
つうことですな。


403 名前:デフォルトの名無しさん :2005/10/26(水) 23:55:29
javaにも採用されたし、まあアレだ

404 名前:363 :2005/10/27(木) 00:24:44
>401
C++なら素直にstd::vector使っとけと言う事だよな……

405 名前:デフォルトの名無しさん :2005/10/27(木) 00:37:19
>>404 いや、関係ない。

406 名前:363 :2005/10/27(木) 01:12:09
>405
関係なくはないよ。

407 名前:デフォルトの名無しさん :2005/10/27(木) 01:14:47
>>406 いや、関係ない。

408 名前:デフォルトの名無しさん :2005/10/27(木) 01:17:56
>>406まったく関係ないです。

409 名前:デフォルトの名無しさん :2005/10/27(木) 01:36:50
たまたまメソッドのみのクラスがあった時、コンストラクタ、デストラクタ
はやはり空関数として実装しておかないといけませんか?

410 名前:デフォルトの名無しさん :2005/10/27(木) 01:38:27
>>409
自分で宣言しなかったときはコンパイラが勝手に
空のコンストラクタ、デストラクタを定義する。
なので、必要ない。

411 名前:デフォルトの名無しさん :2005/10/27(木) 02:50:34
>407-408
へ?可変長の引数を渡すときは、可変長引数使わずにstd::vector使え
つうことだけど、なんで関係ないの?


412 名前:デフォルトの名無しさん :2005/10/27(木) 05:24:52
>>411
union types { int i, char c, double lf, std::string s; };
vector<types> args;
printf("%lf %d %c %s", args);
みたいにしろってこと?

413 名前:デフォルトの名無しさん :2005/10/27(木) 06:22:51
恐らく>>411が言いたいのは、
void func(...); の代わりに、
void func(std::vector<type> args);
こうしたらどうか?ってことなんじゃないかと。

実際やってみれば分かるけど、
これじゃ可変長に出来てもvectorに積める型が1種類だから、
>>412みたいにいちいちunionでラップしなきゃならなくなるのに気が付くはず。
こんなのいちいちやるのアホクサイ。

414 名前:デフォルトの名無しさん :2005/10/27(木) 07:39:41
でも実際に可変長引き数に積めるのはint, longとlong long, double, long doubleにポインタだけだがな。

415 名前:デフォルトの名無しさん :2005/10/27(木) 07:44:08
boost::ptr_vectorに、boost::anyへのポインタでも入れて渡せばいいだろ。

416 名前:デフォルトの名無しさん :2005/10/27(木) 07:54:29
要するに void* args を C++ でどう書くのが綺麗かって話になるんだな

417 名前:デフォルトの名無しさん :2005/10/27(木) 10:39:04
boost::formatみたいに演算子ーオーバーロードして繋げればええやん

418 名前:デフォルトの名無しさん :2005/10/27(木) 10:39:16
>>414 いや、なんでも入るよ。

419 名前:デフォルトの名無しさん :2005/10/27(木) 10:51:48
News 2005-10-24: C++ Standard Core Language Issues List (Revision 38) is available
News 2005-10-24: The C++ Standard Library Issues List (Revision 39) is available

420 名前:デフォルトの名無しさん :2005/10/27(木) 14:26:51
>>413
ユニオンなんて古代のCだから捨てろ。その発想がすでにだめなんだよ。
君はC++に向かない。と言うか、C++の勉強が足りない。


と言ってみたりみなかったり。

421 名前:デフォルトの名無しさん :2005/10/27(木) 14:36:48
>>420
反論できない->とりあえず煽る->予防線を張る

そんなビクビクするくらいなら黙っとけよ(笑

422 名前:デフォルトの名無しさん :2005/10/27(木) 15:55:33
実行ファイルのヘルプ表示(--helpオプションなどで表示する説明文書)について質問です。

ヘルプ表示はたいていの場合固定の(static constな)文字列で、かつ複数行から成り立ちます。
これをC++流で書くと(coutかcerrはともかく)

std::cerr << "hage program\n"
 << "usage: hage [option] target\n"
 << "options:\n"
 << " --ratio N scalp hair density" << std::endl;

のように書き連ねることになります。これを、perlのように

print <<END_OF_HELPTEXT
hage program
usage: hage〜

END_OF_HELPTEXT;

と改行を含めて書きたいのです。
テキストファイルをリソースとして取り込む方法も検討しましたが、Win32限定なら
容易にできるものの、標準C++だけでやる方法がわかりません。
こうしたテキストデータをうまく扱う方法はありませんか?


423 名前:デフォルトの名無しさん :2005/10/27(木) 16:52:55
>>422
無理。
素直に書き連ねるか、外部ファイルから読み込むか、プリプロセッサを自前で作れ。

424 名前:デフォルトの名無しさん :2005/10/27(木) 19:30:14
>418
promotion が入るからってことじゃね?
C++ でも確かにそうなってる。(5.2.2/7) 多分、C との後方互換性のためじゃないかと。

425 名前:デフォルトの名無しさん :2005/10/27(木) 19:49:02
>>420
C++ でも union は必要になるケースはある。例えばアラインメント解決やメモリをケチりたい場合など。
何の条件付けもせずに捨てろというあなたのほうがよっぽど C++ に向いてないとおもうが。

426 名前:デフォルトの名無しさん :2005/10/27(木) 20:07:04
union {
 _m128 v;
 float vec[4];
};

バリバリ使いますなぁ。

427 名前:デフォルトの名無しさん :2005/10/27(木) 20:27:10
そんなシビアな状況ならそもそもC++使わんだろって言う話なら分かる

428 名前:デフォルトの名無しさん :2005/10/27(木) 21:58:53
いや、C++はそういう状況でも使えるように作られている。

429 名前:デフォルトの名無しさん :2005/10/27(木) 22:33:59
C++でユーザープロセスソースを一から書くならunionなんかまず使わないでしょ

430 名前:デフォルトの名無しさん :2005/10/27(木) 22:42:54
機種依存の話をしてるのか。
それにしてもx86-64の64bitインラインアセンブラ禁止やめてくれ・・・・・
fp87の使用禁止もあり得ねー。

431 名前:デフォルトの名無しさん :2005/10/27(木) 23:02:12
class A
{
 static int m_counter;
 int m_num;

 A(){
  m_num = ++m_counter;
 }
}

int main(){
 A arr[100];
}

---

このとき、arr[0] == 1、 arr[1] == 2、 arr[2] == 3、、、 って保障される?
arr[99]の方から初期化される可能性もあるのかな?

432 名前:デフォルトの名無しさん :2005/10/27(木) 23:29:43
>>422
std::cerr << "hage program\n"
"usage: hage [option] target\n"
"options:\n"
" --ratio N scalp hair density" << std::endl;
ではいけないの?


433 名前:デフォルトの名無しさん :2005/10/27(木) 23:30:52
>>431
クラスオブジェクトの配列の初期化は添字順に行われることが決まっていたはずだから、
その場合は恐らく保証されている。
デストラクタは逆順。

434 名前:デフォルトの名無しさん :2005/10/27(木) 23:53:20
>>433
(12.6/3) ですな.

435 名前:デフォルトの名無しさん :2005/10/28(金) 00:00:20
>>434
そうですた。やっぱり定期的に見ないとあやふやになってていかんなぁ。
補足トンクス

436 名前:デフォルトの名無しさん :2005/10/28(金) 00:35:12
>>432
それでコンパイル通るんだ。g++3.4.2だと通るね。知らなかった。


437 名前:デフォルトの名無しさん :2005/10/28(金) 00:38:40
>>436
ちょいまちー。この書式はANSI-C89の時代から使えるぞ。

438 名前:デフォルトの名無しさん :2005/10/28(金) 00:46:45
文字列リテラルの連結はCからあるね

439 名前:406 :2005/10/28(金) 01:00:53
>413
そもそも可変長引数て、型安全て考慮されていたっけ?


手軽に逃げるならvoid*のvectorで、boost使えるならboost::anyか
boost::variantなんかが使えると思う。


440 名前:デフォルトの名無しさん :2005/10/28(金) 01:08:19
片瀬雪希とぽけっとチュッチュ♪

441 名前:デフォルトの名無しさん :2005/10/28(金) 01:23:46
今月は何月なのかを取得したいんですが、
どうやればいいのですか。

442 名前:デフォルトの名無しさん :2005/10/28(金) 02:03:41
>>441
カレンダーを見る。

あるいはここに逝く
【初心者歓迎】C/C++室 Ver.22【環境依存OK】
ttp://pc8.2ch.net/test/read.cgi/tech/1128872687/l50

443 名前:デフォルトの名無しさん :2005/10/28(金) 02:13:33
>>441
boost::gregorian使うと

date today(day_clock::local_day());
cout << today.month() << endl;

444 名前:デフォルトの名無しさん :2005/10/28(金) 02:38:37
>422
std::cerr << "hage program
usage: hage [option] target
options:
--ratio N scalp hair density" << std::endl;
これは?

445 名前:デフォルトの名無しさん :2005/10/28(金) 02:39:49
>>441
これだと標準じゃないのかな?

#include <iostream>
#include <ctime>
using namespace std;
int main ()
{
time_t now_ (time (NULL));
tm now;
gmtime_r (&now_, &now);
cout << now.tm_mon << endl;
return 0;
}


446 名前:デフォルトの名無しさん :2005/10/28(金) 08:52:42
>>445
×time_t now_ (time (NULL));
○time_t now_ (time (0));

447 名前:デフォルトの名無しさん :2005/10/28(金) 09:05:35
>>446
NULLじゃダメなの?
glibc-2.3.5では以下のようになってんだけど
time_t
time (t)
time_t *t;
{
struct timeval tv;
time_t result;

if (__gettimeofday (&tv, (struct timezone *) NULL))
result = (time_t) -1;
else
result = (time_t) tv.tv_sec;

if (t != NULL)
*t = result;
return result;
}


448 名前:デフォルトの名無しさん :2005/10/28(金) 09:30:26
boolをint等の整数型に代入した場合trueは1、falseは0になったのですが
これは言語で保証しているのでしょうか?

449 名前:デフォルトの名無しさん :2005/10/28(金) 09:36:43
してる

450 名前:デフォルトの名無しさん :2005/10/28(金) 10:07:34
ありがとう

451 名前:411 :2005/10/28(金) 10:25:55
>>442-447
ありがとうございます

452 名前:デフォルトの名無しさん :2005/10/28(金) 11:33:22
型キャストに関する質問です。

別のコンパイラで使っていたコードを VC++.net に持ってきたんですが、
型キャストで warning がでまくってしまいます。

void cHoge::Init( void *start ) {
unsigned int st;
st = (unsigned int)start;
}
: warning C4311: '型キャスト' : ポインタを 'void *' から 'unsigned int' へ切り詰めます。

こんな感じです。
C++自体、使い始めて日が浅いのでいまひとつ解決の仕方が見えてきません。
初歩的な事かもしれませんが、ご助力お願いします。

453 名前:デフォルトの名無しさん :2005/10/28(金) 11:37:27
>>452
本当はスレ違いなんだが一応答えておくと、
VC.NETではデフォルトでポインタが64bitサイズと仮定されてコンパイルされるから
unsigned intにキャストすると情報落ちが起こるぞ、とWarningを吐く。
押さえたければ、プロジェクトのプロパティのC/C++→全般にある
「64ビット移植への対応」を「いいえ」にすればいいはず。

454 名前:452 :2005/10/28(金) 11:44:01
>>452
即レスありがとうございます。
解決いたしました。
ポインタ類は 32Bit であると疑いもしなかったので・・。

スレ違いの質問でしたが、お答えいただきありがとうございました。

455 名前:デフォルトの名無しさん :2005/10/28(金) 11:49:37
C++的には、型のサイズは実装依存だから、void*を整数型にキャストするのは
あまりよくない希ガス。実際には多くのコードがやっていることだが。
可能ならば、クラス情報を持たないvoid*も使わない方がよいのでは。


456 名前:デフォルトの名無しさん :2005/10/28(金) 12:12:15
>>425
union使うとどうしてメモリけちれるの?
具体的に書いてみてちょ。

>>426
自分のコードを一度unionなしで書き直してごらん。
(1)できない → ヴォケ
(2)struct使いまくり → 無理せずC使えよ
(3)条件分岐だらけ → ここは爺さんの来るところじゃないよ

457 名前:デフォルトの名無しさん :2005/10/28(金) 12:15:32
>>456
もちろん426のコードが何を意図しているか理解したうえで煽ってるんだよな?

458 名前:デフォルトの名無しさん :2005/10/28(金) 13:13:31

可変長引数に対してアレルギーみたいなのを感じている人もいるようだけど、
boost::is_base_and_derived や、Loki::SuperSubClass は、
可変長引数がないと実装不可能だよ。


459 名前:デフォルトの名無しさん :2005/10/28(金) 13:16:46
>>456 簡単にかけるものをわざわざ面倒に書き直してなにがうれしいのボク?

460 名前:仲裁マン :2005/10/28(金) 13:33:52
まあまあ落ち着こうよ。
煽りあっても何も得るもの無いよ。

461 名前:デフォルトの名無しさん :2005/10/28(金) 14:57:07
>>458
unionはどうなの?

462 名前:デフォルトの名無しさん :2005/10/28(金) 15:47:10
可変長引数もユニオンも一切禁止ってのはないけど、
C++では無用の長物と化していることは事実でしょ。
妙なこだわりを持ってる奴は、なんちゃってCプラプラマ。
そんなことよりオブジェクト指向くらい理解しろよと。
それが無理なら引退しろよと。俺は愛を持ってそう言いたいっすよ。
「おじいさん。ご苦労様でした。次は僕たちの時代ですから、







                             どうぞ安らかに」

463 名前:デフォルトの名無しさん :2005/10/28(金) 16:15:11
煽ってどうするかなぁ。
union嫌厨はどうも、自分ができないものに蓋をしているようにしか見えないよ。
使いたい香具師は使えばいいし、使いたくない香具師は使わなければいいというレベルのものでしょうが。
まぁ、unionを含むような構造体はできれば公開して欲しくない(≒ラッパを公開して欲しい)とは思うけど。

464 名前:デフォルトの名無しさん :2005/10/28(金) 17:34:34
>>462
「無用の長物と化している」のはぜんぜん事実じゃあない.
boostやVC7のSTLとか見れば union が必要とされていて,きちんと使われてるのがわかる.

465 名前:デフォルトの名無しさん :2005/10/28(金) 20:07:31
>>462
君の中ではオブジェクト志向と共有体が相反する概念なのか?

466 名前:デフォルトの名無しさん :2005/10/28(金) 20:14:47
まあ可変長引数が不要(C++の仕組みでは使えない)というのには同意する。

467 名前:デフォルトの名無しさん :2005/10/28(金) 20:22:33
C++ の仕組みでは使えないからこそ使われる(boost::is_convertible)という皮肉

468 名前:デフォルトの名無しさん :2005/10/28(金) 21:21:08
ここの少し痛いプログラマの卵をどうにかしる

469 名前:デフォルトの名無しさん :2005/10/28(金) 21:26:20
http://gin-srv.ddo.jp/slowlylife/
ココね。アド書き忘れたわ。OTL

470 名前:デフォルトの名無しさん :2005/10/28(金) 21:34:36
>>469
内容がほとんどまだ無いサイトみたいだけど、どこが痛いの?
具体的には何をすれば?

471 名前:デフォルトの名無しさん :2005/10/28(金) 21:46:42
私怨乙

472 名前:デフォルトの名無しさん :2005/10/28(金) 21:59:39
私怨じゃない。
だれも見てる人いないのに助けてとか言ってるから
ここの住人で並みのプログラマにしてやろうではないかと。
まぁ本人にそのような意志があったらの場合だが・・・。
>>471
言い方悪かった。スマン。

473 名前:デフォルトの名無しさん :2005/10/28(金) 22:01:01
宣伝乙

474 名前:デフォルトの名無しさん :2005/10/28(金) 22:07:52
ブログには興味ないので、このスレに引っ張り出せばいいのでは?
ここがまずいんなら初心者スレとか。

475 名前:デフォルトの名無しさん :2005/10/28(金) 22:21:47
まず本人にやる気はあるかどうかでは?
だれか潜入してくれる香具師はいないですかね…。

476 名前:デフォルトの名無しさん :2005/10/28(金) 22:24:26
なぜわざわざそのような事をする必要があるのかワカラン。
このスレのURLでも貼っとけ。

477 名前:431 :2005/10/28(金) 23:52:17
>433-434
おおお、保障されてたのかー
ありがとうございました

478 名前:406 :2005/10/29(土) 00:45:49
>458
可変長引数の関数は実体化もされませんから!


479 名前:デフォルトの名無しさん :2005/10/29(土) 01:45:25
くあしく

480 名前:デフォルトの名無しさん :2005/10/29(土) 02:08:27
間違って宿題スレに一度出してしまったが、スレ違いなのでこちらに
出させてください。

あるソフトのバグ?を追求している過程で、問題を純化していったら
以下のC++コードの合法性が焦点となることがわかったのですが、規格書
見てもよくわかりません。誰か、これの規格合致・違反・未定義性を
指摘できませんか?

 <規格合致か違反か?>
 struct foo {} とした場合、foo::foo としてその型(struct foo)を
 表記してよい(foo でできるのは当然だが、foo::foo はありか?)

別の見方をすると

namespace foo { void hi(); }
class foo { static void hi(); }

があるとき、両方の hi() が共存することは可能か?それともエラーか?

どのコンパイラで通るって話ではなく(g++ で foo::hi() と
foo::foo::hi() で共存するのは確認済)、規格書の第何項の
どういう解釈によって合致・違反と定まるのか、という点で知りたいです。
そうじゃないと単なるコンパイラのローカル拡張とも思えるので。

規格上はクラス名は名前空間定義とほぼ等価なのだが、じゃあ
それなら上の foo::foo って foo class-scope の中の foo という
解釈になって、それは型名ではなくコンストラクタではないのかとか、
g++ が通しても本当に正しいのかちょっと悩んでます。



481 名前:デフォルトの名無しさん :2005/10/29(土) 03:17:17
>>480
一点目は残念ながら規格書ではないが。
プログラミング言語C++第3版 5.7 構造体(手持ちではP.141):

> Cの時代に遡る理由から、同じスコープに同じ名前のstructと非構造体を宣言することは可能になっている。
> たとえば、次の通り。
>
> struct stat { /* ... */ };
> int stat(char* name, struct stat* buf);

そして、規格書3.4 Name lookupの3:

> Because the name of a class is inserted in its class scope (clause 9), the name of a class is also
> considered a member of that class for the purposes of name hiding and lookup.

とあるので、class fooはfoo::fooとして参照できる。

よって、合法だと思う。


482 名前:デフォルトの名無しさん :2005/10/29(土) 03:27:10
質問お願いします。

#include <iostream>
using namespace std;

class Kitty {
public:
Kitty(bool , char *);
};

Kitty::Kitty(bool bo , char *str) {
if (bo) cout << str << '\n';
}

int main() {
Kitty obj[3] = {
Kitty(true , "Kitty on your lap") ,
Kitty(false , "Card Captor Sakura") ,
Kitty(true , "Di_Gi_Gharat")
};
return 0;
}

ってコードを見つけたんですけど、これはいいのでしょうか。
Kittyには引数を取るコンストラクタがないので、
Kitty obj[3];
とはできないわけですよね。
それなのに、上みたいに、初期値を与えて配列を作ってもよいのでしょうか。

483 名前:482 :2005/10/29(土) 03:28:42
すみません。書き忘れです。
>>482のKittyにはデータメンバがないんですが、それと何か関係あるんでしょうか?

484 名前:デフォルトの名無しさん :2005/10/29(土) 05:37:12
>482
暗黙のコピーコンストラクタ

485 名前:デフォルトの名無しさん :2005/10/29(土) 08:23:50
>Kittyには引数を取るコンストラクタがないので
あるじゃん。

486 名前:482 :2005/10/29(土) 08:49:02
>>485
すみません。
「引数を取らないコンストラクタがないので」の間違いです。
だから、「Kitty obj[3];」はできません。
それなのに、配列を作っちゃっていいのかってことなんです。

>>484
すみません。わかりません。

487 名前:デフォルトの名無しさん :2005/10/29(土) 08:59:39
>>482 コンストラクタとデストラクタとコピーコンストラクタはユーザが書いてない場合コンパイラが勝手に定義する。

488 名前:デフォルトの名無しさん :2005/10/29(土) 09:41:43
>>486
コンパイラは暗黙のうちにKitty::Kitty(const Kitty&)を定義している。(クラス内にこれが宣言されていない場合)
そしてobjの初期化では各要素毎にKittyの一時オブジェクトを作り、それを上記のコンストラクタに渡しているということになる。

489 名前:デフォルトの名無しさん :2005/10/29(土) 11:07:00
>>481
ありがとう!

結局 struct foo {} ってあったとき、

 struct foo *v = new struct foo();
 foo::foo *v = new foo::foo();

のどちらも有効なんだね。ということで hi() 問題も

 foo::hi(); // namespace foo の hi()
 foo::foo::hi(); // struct foo の hi()

で規格合致な形で識別可能ですね。

自分の手元には第二版しかないが、そのあたりがさっぱり見当たらない・・・
ページ構成から完全に違うし、さすがに買いなおすかな。


490 名前:デフォルトの名無しさん :2005/10/29(土) 11:24:40
複数種のクラスのメンバ関数のアドレスを格納する関数ポインタ配列を作ろうとしています。
メンバ関数の引数と戻り値の型は統一されています。
メンバ関数がstaticだったらうまくいくのですが、static以外だとコンパイルエラーになってしまいます。

staticではないメンバ関数を格納することは出来ないのでしょうか?

491 名前:デフォルトの名無しさん :2005/10/29(土) 11:28:29
multisetやmultimapでソートキーが同じものがinsertされた場合、どこに入れられるかは決められているのでしょうか?
例えば

struct A {
A(int x, int y) : a(x), b(y) {}
int a, b;
bool operator<(const A& r) const { a < r.a; }
};

std::multiset<A> hoge;
hoge.insert(A(1, 10));
hoge.insert(A(1, 20));

とした場合、後から追加されたA(1, 20)はA(1, 10)の前と後ろどちらに入るか、ということです。

492 名前:デフォルトの名無しさん :2005/10/29(土) 11:39:42
>>490
通常のポインタでstaticでないメンバは指せず、代わりにメンバへのポインタというのがある。
もちろんメンバへのポインタはクラスごとに別個の型。
というわけで490のようなことをやるのは結構面倒くさい。

普通はboost::functionの配列にboost::bindを使って格納することになると思う。

493 名前:デフォルトの名無しさん :2005/10/29(土) 11:44:01
>>491
ttp://www.tietew.jp/cppll/archive/7559
これが参考になるかな?
ちなみにぐぐるさんで「multimap キー 順番」の一番上。
今度からは頑張ろう。

494 名前:デフォルトの名無しさん :2005/10/29(土) 11:48:53
>>493
ありがとう。
正直言うと、2, 3回ググって面倒臭くなって訊いてしまった。

495 名前:490 :2005/10/29(土) 11:52:32
>>492
Thank!
と言うことは、boost::を使うか、staticメンバの引数にthisのポインタを渡して誤魔化すか
どっちかか。

496 名前:482 :2005/10/29(土) 11:53:01
>>487-488
ちょっと難しいですが、結論としては、>>482のコードに間違いはないということですね。
Kittyとかあるんであやしいと思ったのですが。
ありがとうございます。

497 名前:デフォルトの名無しさん :2005/10/29(土) 13:06:34
>>496 それはそのコードを書いた人がアレなだけだから気にしなくて良い

498 名前:デフォルトの名無しさん :2005/10/29(土) 18:48:53
>>497
あれとは失礼だぞ仮にも本を出版しているのだから

499 名前:デフォルトの名無しさん :2005/10/29(土) 18:52:09
「アレ」は中立表現に一票

500 名前:デフォルトの名無しさん :2005/10/29(土) 20:30:58
カタカナだから他意があるに一票


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