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


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

C++相談室 part52
501 名前:デフォルトの名無しさん :2006/09/11(月) 12:17:45
long に NULL 代入しようとしたら void* は long にキャスト出来ませんというエラーが・・・

502 名前:デフォルトの名無しさん :2006/09/11(月) 12:19:42
それはよかったじゃない。

503 名前:デフォルトの名無しさん :2006/09/11(月) 20:13:27
#define NULL 0 の実装は C++ でしか見た事無い。
C でわざわざ 0 に定義する利点も無いし。

504 名前:デフォルトの名無しさん :2006/09/11(月) 20:27:42
>>503
修行が足りません。

505 名前:デフォルトの名無しさん :2006/09/11(月) 20:49:06
NULL と '\0' の違いについて

506 名前:デフォルトの名無しさん :2006/09/11(月) 20:54:38
>>498
「可能」 って表現に違和感を持たれてるんじゃないか?

たとえば

#undef NULL
#define NULL ((char *)0)

が不能でなければ規格合致処理系ではないということではなかろう

507 名前:デフォルトの名無しさん :2006/09/11(月) 20:59:57
まぁCの話はスレ違いなんだけどね。

508 名前:デフォルトの名無しさん :2006/09/11(月) 21:37:56
char型の配列の中身をダンプしようと16進数で表示する様に
char buf[20];
cout << hex << buf[0];
とやってみたんですが、文字として表示されてしまいます。
intでキャストすれば正の数なら表示されるんですが、負の数になると
0xFFFFFFF と表示されてしまいます(intにキャストしているので当たり前なんですが)
buf[0] = 0xFF;
cout << hex << buf[0]; //FFと表示させたい

509 名前:デフォルトの名無しさん :2006/09/11(月) 21:44:49
>>508
signed charにキャストすればいいのでは?

510 名前:デフォルトの名無しさん :2006/09/11(月) 21:47:19
いや、unsigned intの方が良くないか?

511 名前:デフォルトの名無しさん :2006/09/11(月) 21:49:51
cout << static_cast<unsigned>(buf[0]);

512 名前:508 :2006/09/11(月) 21:57:19
>>511

char buf=0xFE;
cout << hex << static_cast<unsigned>(buf);

でやってみたんですが、fffffffeと表示されてしまいます
ちなみにVC++2005でやってます

バイナリエディタの様に 00 23 BE FE
みたいな表示はみなさんどうやって出力してます?
printfなら余裕なんですが・・iostream難しい

513 名前:デフォルトの名無しさん :2006/09/11(月) 22:00:21
char c = '\xab';
cout << hex << static_cast<unsigned>(static_cast<unsigned char>(c));
バイナリデータはunsigned charで扱う癖をつけておいたほうがいいと思う。

514 名前:デフォルトの名無しさん :2006/09/11(月) 22:00:25
static_cast<unsigned>(buf) & 0xffu

515 名前:デフォルトの名無しさん :2006/09/11(月) 22:01:43
おめーら、整数格上げの規則ぐらい覚えとけよ。

signed charをunsignedにしたって駄目
unsigned charにしてからintに代入しろ。

516 名前:デフォルトの名無しさん :2006/09/11(月) 22:04:06
>>513
>>514
おぉできますた!

ポイントはunsigned charで扱う事なんですね
ありがとうございました



517 名前:デフォルトの名無しさん :2006/09/12(火) 00:48:31
C++というより設計の質問かもしれないんですが、
インターフェースクラスをテンプレートクラスにするのはありですか?

template <class T> class Foo
{
public:
virtual voie Hoge(const T&) = 0;
};

template <class T> class Bar : public Foo<T>
{
public:
void Hoge(const T&);
};

って感じにして使うと、コンパイル時に好きなように
インターフェースを決定できるので汎用的に使えると思うのですが、
一方でインターフェースは型も含めて明示しないと他人が使いづらいかとも思うのです。
みなさんはどう思いますでしょうか?

518 名前:デフォルトの名無しさん :2006/09/12(火) 00:49:29
>>517
デフォルトの型を入れておけば?

519 名前:デフォルトの名無しさん :2006/09/12(火) 01:16:51
>>517
言語的にはもちろんアリ。
設計の是非については、それだけの情報では検討不能。

520 名前:デフォルトの名無しさん :2006/09/12(火) 01:20:34
何でも入るインターフェイスなんて、結局何にも定まってないようなもんだしなー。

521 名前:デフォルトの名無しさん :2006/09/12(火) 01:36:58
メソッドのシグネチャ固定したいだけだろ?
たぶんそのメソッド名を仮定したvisitorとかがあるのでは。

522 名前:デフォルトの名無しさん :2006/09/12(火) 02:06:23
>>517
例えばCOMのIEnumXXXなんていうインタフェイスはそういう感じのが似合ってるような気がする。

template <class T> class IEnumGeneric
{
public:
virtual void Reset(); // 先頭に戻す
virtual bool Next(T* &pNextItem); // 次の1つを取得
};

てな感じか。

あとは C# で多用されてるような ICollection<T> のようなコンテナを抽象化したインタフェイスとか。

「好きなようにインターフェースを決定できる」というよりは、Generic なコンテナが実装/提供
するインタフェイスなので必然的にGenericになってるだけのような気もするけど。

523 名前:デフォルトの名無しさん :2006/09/12(火) 02:27:27
ちなみに手元にあるC++CodingStandardって本には
「静は動を助く:静的ポリモフィズムを使って動的ポリモフィズムのインターフェースを実装しよう。
たとえば抽象基本クラスCommandがあり、様々な実装を
template</*...*/> class ConcreteCommand : public Command
として定義するとしよう。」
って書いてあるが、いまいち意味がわからん。
複数の型に対して同一のアルゴリズムを提供するつもりでインターフェースをテンプレートクラスにしてるならアリで、
全然違うアルゴリズムに対してインターフェースが似てるからって理由でテンプレートクラスのインターフェースを使うのがナシだと
個人的には思う。

524 名前:デフォルトの名無しさん :2006/09/12(火) 09:17:27
Return-Path: <maki@stalag13.com>
Received: from kiyesrbuetekiotlreitbtiorne571671867716.com
(OFSfa-02p5-5.ppp11.odn.ad.jp [61.209.164.5])
Message-ID: 20060911234553.19067mail@mail.kiyesrbuetekiotlreitbtiorne571671867716.com
From: maki@stalag13.com

このメールは指名女性のご希望により※再配信※させていただきました。

20歳になったばっかのまいこ姫でしゅ。。
優しい優しいご主人様がほしくて噂のココに辿り着きましたぁぁ★
まいこ姫は見た目はオコチャマだけどぉ一生懸命、ご主人様を満足させるんでお返事下さいなぁ♪
ご主人様の大好きなコスプレで甘い甘いエッチがしたいなりィ★★
恥かしがりやなまいこ姫をリードしてくれる優しいご主人様からのメッセージ待ってましゅ!!

525 名前:デフォルトの名無しさん :2006/09/12(火) 09:44:19
そんなことより、一駅毎に説教たれる車掌をナントカしてくれ。
ラッシュアワーでぎゅうぎゅう詰めでいらいらしているのに、
一駅ごとに延々としゃべり続ける。同じことを。周りの乗客もうんざり顔。

「毎度ご乗車ありがとうございます。次の停車駅は○○です。車内混み合いまして大変ご迷惑おかけしておりますが、ご了承下さい。
 当社では現在、土日祝日もご利用いただける2dayチケットを発売しております。沿線施設の割引入場券としてもご利用いただけますので、
 行楽シーズンに、ぜひご利用下さい。なお、各車両にはに優先座席を用意しております。体の不自由な方、体調のお悪い方、妊婦の方、
 その他座席を必要とされる方がおられましたら、ぜひお譲り下さい。この列車の前から4両目は女性専用車両となっております。
 男性のお客様はご利用いただけませんので、ご了承下さい。あやまってお乗りの男性のお客様がおられましたら、隣の車両にお移り下さい。
 また、車内での携帯電話は電源をお切りになるか、マナーモードにしていただき、通話はご遠慮下さい。優先座席付近では、医療機器への
 影響のおそれもありますので、必ず電源をお切り下さい。この列車の一番前、および一番後ろの車両は携帯電話終日電源オフ車両です。
 座席位置にかかわらず、携帯電話の電源はお切り下さい。なお、車内および駅構内、駅ホームは全線禁煙となっております。
 おタバコはご遠慮下さい。当社ではただいまさわやかマナーキャンペーンを実施中です。快適な車内空間作りに皆様のご協力をお願いいたします。
 まもなく○○に到着します。お出口は進行方向右側です。ホームとの間が広くあいている場所がございますので、お足下にご注意下さい。
 お降りの際は傘などお忘れ物の無いよう、お気をつけ下さい。本日も○○電鉄をご利用いただき、誠にありがとうございました。まもなく○○です。」

これが全駅続く。延々と。もうね、アホかと。うんざり。

526 名前:デフォルトの名無しさん :2006/09/12(火) 17:29:33
本日も桃太郎電鉄をご利用いただき、誠にありがとうございました。

527 名前:デフォルトの名無しさん :2006/09/12(火) 20:36:32
下記コードの実行結果が"ab"ではなく"aa"となってしまうのは何故なのでしょうか?
ポインタと同じように、ベースクラスの参照に色んなサブクラスの参照を代入して処理を切り替えられないのでしょうか?

#include <iostream>
#include <string>

class Iface
{
public:
 virtual ~Iface() {};
 virtual void method() = 0;
};

class Impl : public Iface
{
public:
 Impl(const std::string& s) { s_ = s; }
 virtual void method() { std::cout << s_; }
private:
 std::string s_;
};

int main()
{
 Impl a("a");
 Impl b("b");
 Iface& c = a;
 c.method();
 c = b; // ここで何が起きているのかいまいち分かりません。
 c.method();
 return 0;
}

528 名前:デフォルトの名無しさん :2006/09/12(火) 20:38:56
暗黙的にアレ

529 名前:デフォルトの名無しさん :2006/09/12(火) 20:41:33
スライシング

530 名前:527 :2006/09/12(火) 21:05:39
>>528,529
ありがとうございました!勉強し直して来ます。

531 名前:デフォルトの名無しさん :2006/09/13(水) 00:52:13
>>527
参照はポインタと違って一度設定された参照先を後から変更することはできない。

つまり例文のc = b;はcの参照先aを(cがIface型と宣言されているので)
Ifaceにキャストして、暗黙の代入演算子(operator=(const Iface& rhs))
を呼んでいるのと同じ事をしている。
そしてIfaceにはメンバフィールドが無いので代入演算子は何もしない。

参照先の変更が禁止されているので代入演算子が呼ばれるというのが
>>528の言う暗黙的にアレ。
cがIface型と宣言されているので何もしない代入演算子が呼ばれるというのが
>>529の言うスライシング(による弊害)。

532 名前:デフォルトの名無しさん :2006/09/13(水) 08:59:33
スマートポインタ使え

533 名前:デフォルトの名無しさん :2006/09/13(水) 11:57:01
std::ifstream とか std::ofstream って、
ファイルが開けないときに例外出したりします?
そもそもストリームって何らかの操作に失敗したとき、
フラグで表現するだけ?例外を出すときもある?

534 名前:デフォルトの名無しさん :2006/09/13(水) 12:13:05
>>533
ストリームライブラリはC++に例外機構が取り入れられる前から広く
使われていた。従ってデフォルトでは例外を送出しない。

しかし、メンバ関数exceptions()を適宜設定する事により、ある状態
フラグが立った時に例外を投げさせる事は出来る。投げる例外は
std::ios::failureである。

後は適当に調べてちょ。

535 名前:デフォルトの名無しさん :2006/09/13(水) 12:16:25
http://www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/loc_io/8_3.htm

ここ辺りが参考になるかも。他にも"exceptions ストリーム"でぐぐればいろいろ
ヒットする。

536 名前:デフォルトの名無しさん :2006/09/13(水) 12:42:26
>>534-535 THX

537 名前:デフォルトの名無しさん :2006/09/13(水) 15:38:45
lokiって本当に役立つライブラリーなのでしょうか?
勉強する価値ありますか?

skypeのアドオンを作るための
++skypeとかいうライブラリーがlokiを使っていて
どうしようかと思ってる

538 名前:デフォルトの名無しさん :2006/09/13(水) 15:42:46
>>537
イディオムとしては面白いライブラリだけれど、
もはや古臭くて、モダンではない実装をしている。
これからはBoostを学ぶべき。

539 名前:デフォルトの名無しさん :2006/09/13(水) 15:59:22
>>537
そりゃ学んだ方がskypeのアドオン作りやすいと思うけど、
lokiがどんな風に実装されているかは学ぶ必要ないでしょ。
そんなこと知らなくても実装できるようになっているはずだから。

<loki/AssocVector.h>
<loki/Functor.h>
<loki/Singleton.h>
<loki/SmartPtr.h>
<loki/TypeTraits.h>
<loki/Typelist.h>
<loki/static_check.h>

使っているのはこれだけだね。

まあコンパイラのエラーメッセージを理解するのに、
ちょっと実装を知る必要もあるけどw

540 名前:539 :2006/09/13(水) 16:00:24
ざっと見た感じ、lokiをaddon作成者が利用することはないみたい。

541 名前:デフォルトの名無しさん :2006/09/13(水) 22:40:35
>>409
> それはそうと、 const だけで3杯くらいご飯食えるよな。
昔そんな名前のスレがあったな…

542 名前:デフォルトの名無しさん :2006/09/13(水) 23:15:57
>>537
Lokiというか、Modern C++ Design読んだことないなら読む価値はあると思う。
日本語でC++メタプログラミング系の本って他に出てないよね…。

543 名前:デフォルトの名無しさん :2006/09/14(木) 01:36:26
>>541
typedef enumのためなら死ねるってスレもあった気がする。

その結果立ったのが「わたしとC++とどっちが大事なの!?」スレだったりもするわけだが。

544 名前:デフォルトの名無しさん :2006/09/14(木) 17:46:15
try - catch以外で呼び出し元の特定の位置に移動する方法ってありますか?

void test()
{
while(1){
...
if( flag ) throw 0;
}
}

void main()
{
try{
test();
}catch( int e ){
... // 特定の位置
}
}

545 名前:デフォルトの名無しさん :2006/09/14(木) 17:52:23
意味分からん

546 名前:デフォルトの名無しさん :2006/09/14(木) 18:02:40
>>544 longjmp とか。
もう10年くらい使ってない気がする。
goto は一年に数回使ってるのに。

547 名前:デフォルトの名無しさん :2006/09/14(木) 18:08:36
戻り値で判断すればいいんじゃね?

548 名前:デフォルトの名無しさん :2006/09/14(木) 18:21:36
C++じゃsetjmp/longjmpは使わないほうがいいよ。(何もかも承知で使うのはかまわないけど)
リソースリークが起こりやすい。

549 名前:デフォルトの名無しさん :2006/09/14(木) 19:30:22
引数つきコンストラクタから引数無しコンストラクタを呼ぶと、
引数無しコンストラクタの動作がおかしくなってしまいます。
仕様的にできないようなかすかな記憶もあるんですが、
gcc4.1ではwarningも出さないし、(おかしいけど)一応実行はされているようです。
再帰的にコンストラクタを呼ぶのは規格&GCC拡張的にダメなんでしょうか?
それともバグでしょうか?


550 名前:デフォルトの名無しさん :2006/09/14(木) 19:35:34
>>549
引数無しコンストラクタを呼ぶ、とはどう記述するんですか?
CHoge::CHoge(int)
{
this->CHoge();
}
みたいに書いてみたってこと?
単なるCHoge();は一時オブジェクトを作っておしまいだしなあ

551 名前:デフォルトの名無しさん :2006/09/14(木) 19:47:36
>>550
ぐは。思いっきりCHoge();でよびだしてました。。
基底クラスのコンストラクタはそれでいけるので、いけると思ってました。。

552 名前:デフォルトの名無しさん :2006/09/14(木) 21:46:57
classが勝手に呼ぶやつは
printfかOutputDebugString使って
挙動調べるなりして自分で勉強した方がいいと思うよ
virtualなデストラクタ関連も

553 名前:デフォルトの名無しさん :2006/09/14(木) 21:53:25
>>549
引数無しコンストラクタを呼ぶなら、new 使わないと駄目だ。

CHoae( Arg arg )
{
 new (this) CHoge;
 this->member = arg;
}

ただ、デフォルトコンストラクタを持つメンバ変数が合った場合、
なんか微妙なことになりそうな気はする。

554 名前:デフォルトの名無しさん :2006/09/14(木) 22:01:24
*this = CHoge();

でもいいらしい。ケースバイケースだけど。

555 名前:デフォルトの名無しさん :2006/09/14(木) 22:06:17
デフォルトコンストラクタをだけを行うpimpl作ればいいんじゃないの。
class CHogeImpl{CHogeImpl(){...}};
class CHoge : private CHogeImpl {
    CHoge(){}
    CHoge(int n){}
};


556 名前:デフォルトの名無しさん :2006/09/14(木) 22:11:41
>>554
コンストラクタ内では、thisは const T *this ではなく、T *this なの?

557 名前:556 :2006/09/14(木) 22:12:40
あ、ごめん、俺の勘違い。
T * const thisだね。
だから文法的には問題ない。

558 名前:デフォルトの名無しさん :2006/09/14(木) 22:13:24
>>556
const属性は付かないよ。やってみ。

559 名前:デフォルトの名無しさん :2006/09/14(木) 22:15:04
どちらにしろコンストラクタからコンストラクタを呼び出すのは、
例外安全などを考えるとあまり好ましくないね。

何も考えないと結果も残らないしw

560 名前:デフォルトの名無しさん :2006/09/14(木) 22:16:23
>>553
そんな絶対に使っちゃダメな糞コードを晒したらダメだろバカか。

>>551
>基底クラスのコンストラクタはそれでいけるので、いけると思ってました。。
基底クラスだってそれでいけねーよ。

561 名前:デフォルトの名無しさん :2006/09/15(金) 01:26:36
C#ならpublic CHoge(int i) : this() {}と簡単なんだが、
C++なら引数なしコンストラクタの実装を
privateメンバ関数にするとかが一般的じゃね。

562 名前:デフォルトの名無しさん :2006/09/15(金) 02:03:22
ちょっとまて。
お前らコンストラクタ内からコンストラクタ呼び出すのを
本気で正気なコードだと思ってるのか??
煽りでなくマジで。

組み込み型しか使ってない単純クラスなら
特に問題になることは無いのかもしれんが、
それでも普通は各コンストラクタで共通の初期化部分を
関数としてくくりだして、使いまわすのが普通だろ?
それとも俺の気が狂ってるのか???

563 名前:デフォルトの名無しさん :2006/09/15(金) 02:23:08
仕様を確認してるだけで
是非を話し合ってるわけじゃないっしょ

564 名前:デフォルトの名無しさん :2006/09/15(金) 02:25:41
Javaでいえば、
TestClass(int a)
{
this.val=a;
}
TestClass() {
this(32);
}

>>562
ってことじゃないか?

565 名前:デフォルトの名無しさん :2006/09/15(金) 02:32:41
>>562
もちろんまともなプログラミングとは思っていない。作法としても
間違ってる。
ただ、こんな書き方ができるというだけで。お遊び程度。

566 名前:デフォルトの名無しさん :2006/09/15(金) 02:42:53
ネタ的に遊んでただけなんだよね。
いや、よかった。
俺の気がフれたのかと思って激しく動揺しちまったよ。

567 名前:デフォルトの名無しさん :2006/09/15(金) 03:33:25
質問なのですが、以下のようなコードでCharTがcharまたはwchar_tを表すときにCharTタイプのヌル文字を関数内で取得したいのですが何か良い方法はありませんでしょうか?

template <typename CharT>
void hoge(){
  // ここで CharT タイプのヌル文字を取得したい
}

568 名前:デフォルトの名無しさん :2006/09/15(金) 03:46:41
CharT c = CharT(0); で、大抵は大丈夫だと思うけど

569 名前:デフォルトの名無しさん :2006/09/15(金) 09:07:55
CharT()

570 名前:デフォルトの名無しさん :2006/09/15(金) 09:17:16
あ....なるほどorz
どうもありがとうございましたorz

571 名前:デフォルトの名無しさん :2006/09/15(金) 10:28:59
厳密にやるなら
  std::char_traits<CharT>::eos()
かね


572 名前:デフォルトの名無しさん :2006/09/15(金) 13:54:58

  可愛い女子高生の彼女の家に夕食お呼ばれされて彼女と妹さんとお父さんとで話してた
  「○○くんは毎日インターネットしすぎだよ」
  「うわ、おにいちゃんやらしい!」
  「ほほう、なんでネットがやらしいんだ?」
  「だってアダルトサイトとか」
  「そんなサイトばかりじゃないだろ。というかネットと聞いてすぐそんなサイトを
  思い浮かべるおまえのほうが怪しい」
  「なっ!……」
  「ところでブラウザって閲覧の履歴が残るんだけどさ」
  「それがどうしたってわけっ?」
  「俺がいない間に勝手に部屋にきてPCいじるのは許すとしても、
  ネットの巡回履歴は消しとけよ。特に『あの手』のサイトをみた後くらい」
  「ひっ!?ち、違っ、わたしはただその下着の通販サイトを…見てたら…」
  「下着……必要なの?おまえの大きさで? ああ補正用とか?ビッグにみせるアレとか?」
  「もう!○○くん、女の子にそんな事いっちゃ駄目だよ。でも…まあトップを隠すだけなら
  ばんそうこうでも…」
  「もうおねえちゃん!! おとうさん何かいってやってよ!」
  「下着を買うより牛乳を飲みなさい」
  酷い家族だ 助けて(;´Д`)



573 名前:デフォルトの名無しさん :2006/09/15(金) 23:43:07
調子に乗ってtemplate使いまくってたら、参照の参照をやってしまってエラーを出してしまいました。
C++でもJavaみたいに参照の参照もただの参照のように扱う方法を教えていただけないでしょうか。
またもしC++でそれが実現できないなら、オブジェクトのやり取りはポインタで行うようにしていくべきですか?

574 名前:デフォルトの名無しさん :2006/09/15(金) 23:44:38
>>573
そうでもない。

575 名前:デフォルトの名無しさん :2006/09/15(金) 23:47:06
>>573
template<typename T>
struct ref{typedef T&type;};
template<typename T>
struct ref<T&>{typedef T&type;};

576 名前:デフォルトの名無しさん :2006/09/16(土) 00:13:58
ゲームのイベントシーンの文章を返す関数で
char* text(int eventsyurui){
switch (eventsyurui){
case 0:
return "(イベントシーン一つ分のメチャ長い文字列)";
break;

}
}
なんてのを作ったんですがC2026エラー(文字列が長すぎて後ろが切り捨てられる)の壁にぶち当たりました。
いい解決法あったら教えてください。

577 名前:デフォルトの名無しさん :2006/09/16(土) 00:16:53
プログラムに直接書くのは止めようぜとしか言えない。


578 名前:デフォルトの名無しさん :2006/09/16(土) 00:18:03
全部が1行ってことはないだろうから
改行毎に分けて配列にでもしたら

579 名前:デフォルトの名無しさん :2006/09/16(土) 00:45:02
そんなプログラムを書く奴は氏ねばいい

580 名前:デフォルトの名無しさん :2006/09/16(土) 01:08:26
どうでもいいが具体的にどんなアプリケーションに使うコードなのか
書くのってなんか恥ずかしくない?特に>>576とかどうみてもエロゲ

581 名前:デフォルトの名無しさん :2006/09/16(土) 01:10:35
return "(イベントシーン"
 "一つ分の"
 "メチャ長い文字列)";
って感じで一応回避可能。
あと、戻り値はconst char *にしる。

582 名前:デフォルトの名無しさん :2006/09/16(土) 01:15:50
>>580
むしろエロゲでこんな作り方はしないだろ。
こういう実装でなんとかなりそうなのは、RPG辺りかと。
……RPGのエロゲ、というのは無しの方向で。

583 名前:デフォルトの名無しさん :2006/09/16(土) 01:24:20
>>573
つremove_reference

584 名前:576 :2006/09/16(土) 01:56:18
あ、いえエロゲではないです…ということで。

>>578
以前それやってたんですが
strcpy(text[0],"今日は");
strcpy(text[1],"いい天気だ");
と書いてから気が変わって行を追加したり逆に行を削ったりとかするの
とっても面倒なんです。(特に追加時は以降の全部の行の配列を+1しないといけない)

585 名前:576 :2006/09/16(土) 02:00:11
>>581さんありがとうございます。
とりあえずそのやり方でやってみます。

586 名前:デフォルトの名無しさん :2006/09/16(土) 02:47:32
>>584
分かっててネタで釣ってるんだろうけど
ここは初心者も見てるだろうし混乱防止のため言って置く。
きみの考え方はかなりVBに影響を受けて毒されている。

char *text[] = {
"今日は",
"いい天気だ",
"イベントシーン",
"一つ分の",
"メチャ長い文字列",
"" /* 終端 */
};

これなら気が変わっても大丈夫だ。


587 名前:デフォルトの名無しさん :2006/09/16(土) 02:53:45
Lつけなくてよかったっけ

588 名前:デフォルトの名無しさん :2006/09/16(土) 06:17:22
そりゃwide charにする場合だろ > L

ところでさ、終端ってNULLにしない?

なんかC++というよりCっぽいな・・・

589 名前:デフォルトの名無しさん :2006/09/16(土) 09:00:41
>586だと空行作れなくて不便だとかいろいろあるから、普通はNULLだろうなぁ。

590 名前:デフォルトの名無しさん :2006/09/16(土) 09:01:16
つーか、std::vector<std::string>返すようにすれば終端要らないけど。

591 名前:デフォルトの名無しさん :2006/09/16(土) 09:05:42
>>590 激しくコピーが発生しそうだな。
あ、でも string の実装によっては、
ポインタだけのコピーですむのか??

592 名前:デフォルトの名無しさん :2006/09/16(土) 09:37:23
無駄が多いな

593 名前:デフォルトの名無しさん :2006/09/16(土) 09:50:06
>>591
( ゚д゚)ポカーン

594 名前:デフォルトの名無しさん :2006/09/16(土) 09:54:43
>>593 え?なんか間違ってたっけ??
string の実装ってまちまちだとおもうんだけど、
リファレンスカウントとかCOWとか使ってるんじゃないの?

595 名前:デフォルトの名無しさん :2006/09/16(土) 10:17:22
string の値渡しって、文字列丸ごとコピーしてるんだよね?違ったっけ?

596 名前:デフォルトの名無しさん :2006/09/16(土) 10:18:56
>>595
基本的にはそう。
>>594みたいな実装はマルチスレッドが絡むとパフォーマンスの低下が著しいので近年ではあまりやらない。

597 名前:デフォルトの名無しさん :2006/09/16(土) 10:18:57
あってる

598 名前:デフォルトの名無しさん :2006/09/16(土) 10:19:53
1秒違いで負けたww

599 名前:デフォルトの名無しさん :2006/09/16(土) 10:36:39
std::vector<std::string>ってだけで、
> 激しくコピーが発生しそうだな。
にポカーンですが…
使い方によるでしょ…

600 名前:デフォルトの名無しさん :2006/09/16(土) 10:40:22
>>596 そういうものなのか、実は恥ずかしながらいままで
マルチスレッドというものを意識したことがなかった。
ファイルやDBのロックはマルチプロセスの話だしね。

string 自体がリファレンスカウントの機能を持たず、
言語としてガベコレの機構を持つ場合にはマルチスレッド
性能の低下は招かないの?たとえばC#とか。

C++ では std::auto_ptr とか boost::sahred_ptr
なんかで受け渡すべき?

601 名前:デフォルトの名無しさん :2006/09/16(土) 10:41:43
>>599 std::vector<std::string>返すっていうことなので、
一時オブジェクトが生成されてコピーが発生しそうだな、
と思いました。RVO がうまく働くのかもしれませんが。

602 名前:デフォルトの名無しさん :2006/09/16(土) 10:46:49
たとえ無駄が生じることが予想できようと、
それが実際に問題になるまでは気にすることはない。

こういう考えはだめか?

603 名前:デフォルトの名無しさん :2006/09/16(土) 10:49:24
ま、最終的にはバランス感覚の問題でしょうな。
パフォーマンス周りは実測を基本とする考え方からしたら間違っていないし、
かといって確実に無駄といえる状況を放置するのは感心しない。

604 名前:デフォルトの名無しさん :2006/09/16(土) 11:31:52
> string 自体がリファレンスカウントの機能を持たず、
> 言語としてガベコレの機構を持つ場合にはマルチスレッド
> 性能の低下は招かないの?たとえばC#とか。

ちょっとチラシの裏借りますね

C#(というか.NET)やJavaの最近の実装は、若いオブジェクトのための
ヒープのようなものをスレッドごとに持つ。
ガベコレが動作しない間はこのヒープ状のものはロックされない。
だからstringを作って足してコピーして・・・なんかを繰り返しても、
他スレッドの動作を(同期機構を使わないという点で)妨げることはない。
ただし、live objectが超大量になると、ガベコレ期間が悲惨なことになる。
大規模アプリ、Eclipseなんかが苦労してる。

一方、C/C++は通常はヒープがスレッドごとじゃないから、new/delete/
malloc/freeするたびにヒープのロックが発生する。複数スレッドが
new/deleteをガンガンやるとひどいことになりかねない。
std::mapをコピーすると結構起こってそうなんだがどうだろう。
スレッドごとに独立していることが保証されているなら、カスタム
アロケータの利用を考えてもよいかもしれない。でも、スレッド間で
安全に受け渡すのが難しくなるという諸刃の剣。素人にはおすすめしない。

オブジェクトのサイズや個数、ライフサイクルなんかに依存しまくる話だから
一般的にこうすべし、というのは言いにくいんだよね。
逆にいうとC#やJavaが取っている手法法は「使いすてオブジェクト多杉」
という一般的な傾向から導かれたものだから、参考にしてもよいと思う。

2年以上前の知識ゆえ間違ってたら指摘夜露死苦

以上、チラシの裏でした。

605 名前:デフォルトの名無しさん :2006/09/16(土) 15:12:18
>>602
最初の相談を見る限りじゃ絶対やらない方がいい希ガスw

606 名前:デフォルトの名無しさん :2006/09/16(土) 16:09:50
質問です

class abc
{
public:
 virtual void uuu()=0;
}

class def:abc
{
public:
 void uuu();
}

abc *po;
def hoge;

po=&hoge;
hoge->uuu();

こんな感じのプログラムなんですが、エラーが出ます
親クラスのポインタが子クラスを示すことはできないんですか?
ttp://d.hatena.ne.jp/kenmo/20050705
このサイトを参考にしたんですが、ここではできてるみたいなんです

607 名前:デフォルトの名無しさん :2006/09/16(土) 16:11:40
>>606
とりあえずエラーメッセージを晒そうな、な?

608 名前:デフォルトの名無しさん :2006/09/16(土) 16:14:16
>>607
'type cast' : 'class def *' から 'class abc *' の変換は存在しますが、アクセスできません。

609 名前:デフォルトの名無しさん :2006/09/16(土) 16:28:41
>>606
class では継承関係もデフォルトで private だよ。
public 付けないと、クラス外からは継承関係を利用できない。

610 名前:デフォルトの名無しさん :2006/09/16(土) 16:29:40
>>606
そのサイトは間違っている。
コンパイルしてないんだろう。よくあるこった。

class def : public abc

とすればいい

611 名前:デフォルトの名無しさん :2006/09/16(土) 16:30:39
>>606
class def: public abc {


612 名前:デフォルトの名無しさん :2006/09/16(土) 16:35:08
>>609-611
ありがとうございました

613 名前:デフォルトの名無しさん :2006/09/16(土) 16:44:27
もう話終わってるみたいだけど

po=&hoge;
hoge->uuu();

これ意味あんの?

po=&hoge;
po->uuu();

こうじゃないの?


614 名前:デフォルトの名無しさん :2006/09/16(土) 16:48:07
>>613
書き間違えてました
その通りです。すみません

615 名前:デフォルトの名無しさん :2006/09/16(土) 17:19:02
すみません、また質問です。
class Cdote
{
public:
Cdote();
void run();
};

class Cmain
{
private:
static Cmain singleton;
static Cdote *pdote;
Cmain();

public:
static void cont()
{
Cdote dotei;
pdote=&dotei;
pdote->run();
}
};

int main(void)
{
Cmain::cont();
return 0;
}

さっきのコードの別の部分みたいな感じなんですが、エラーが出ました
外部シンボル ""private: static class Cdote * Cmain::pdote" (?pdote@Cmain@@0PAVCdote@@A)" は未解決です

616 名前:デフォルトの名無しさん :2006/09/16(土) 17:25:18
( ゚д゚) ポカーン

617 名前:デフォルトの名無しさん :2006/09/16(土) 17:33:03
Cmain Cmain::pdote = うんたらかんたら;

618 名前:デフォルトの名無しさん :2006/09/16(土) 17:33:41
間違えた
Cmain* Cmain::pdote =
つまりstatic変数はクラス外での定義が必要。

619 名前:デフォルトの名無しさん :2006/09/16(土) 17:43:47
>>618
'private: static class Cdote * Cmain::pdote' : 再定義されています。異なる基本型です。
またエラーが出たんですが、どうすればいいんでしょうか

620 名前:デフォルトの名無しさん :2006/09/16(土) 17:45:57
Cdote* Cmain::pdote = 0;

621 名前:デフォルトの名無しさん :2006/09/16(土) 17:47:24
class Cdote {
public:
Cdote() {}
void run() {}
};

class Cmain {
private:
static Cmain singleton;
static Cdote *pdote;
Cmain() {}
public:
static void cont() {
Cdote dotei;
pdote = &dotei;
pdote->run();
}
};

Cdote* Cmain::pdote;

int main(void)
{
Cmain::cont();

return 0;
}

622 名前:デフォルトの名無しさん :2006/09/16(土) 17:53:16
>>620-621
ありがとうございました!

623 名前:デフォルトの名無しさん :2006/09/16(土) 17:58:13
ザ・思考力0

624 名前:デフォルトの名無しさん :2006/09/16(土) 18:37:43
例外が起こった場所を表示させるのにはどうしたらいいのでしょうか。
例外のクラスはstd::exceptionです。


625 名前:デフォルトの名無しさん :2006/09/16(土) 18:38:16
シングルとかドーテーとか嫌な気分になるな…

626 名前:デフォルトの名無しさん :2006/09/16(土) 18:40:10
>>624
答えになっていない答えだけど、そういう機能を持ったデバッガを使うのが簡単。

627 名前:デフォルトの名無しさん :2006/09/16(土) 18:42:42
>>624 VC++ をはじめとして IDE 付属のデバッガには
ついているんじゃないか?そういう機能.
直接例外が起こった場所を表示してくれなくても,
スタックをワインドバック(っていうのか?)すれば
わかるだろう.

628 名前:デフォルトの名無しさん :2006/09/16(土) 18:54:43
環境を言うべきでした。
gdbの使い方を調べてみます。
ありがとうございまいた。


629 名前:デフォルトの名無しさん :2006/09/16(土) 21:10:14
バックトレースじゃ判らないんだっけ?
bt

630 名前:デフォルトの名無しさん :2006/09/16(土) 21:41:11
throw するところで止まってればバックトレースが使える。
catch してからじゃわからない。

631 名前:デフォルトの名無しさん :2006/09/16(土) 23:38:14
catch された時点でそれまでのスタックは破棄されて
当該オブジェクトはデストラクトされるんだっけ?

632 名前:デフォルトの名無しさん :2006/09/16(土) 23:59:08
当該オブジェクトって何よ?

633 名前:デフォルトの名無しさん :2006/09/16(土) 23:59:24
スコープから外れればデストラクトされる

634 名前:デフォルトの名無しさん :2006/09/17(日) 00:03:36
>>632 破棄されたスタックに確保されていたオブジェクト

635 名前:デフォルトの名無しさん :2006/09/17(日) 01:31:56
漏れの頭蓋骨もデストラクトしそうです。

636 名前:デフォルトの名無しさん :2006/09/17(日) 02:54:05
>>604 なかなか。きっとブログ作ると自分と似てる人たちがあつまってくるよ。

637 名前:600 :2006/09/17(日) 05:52:41
>>604 遅レスだけど、よくわかった。
スレッドローカルなヒープがあるか無いかと言うことか。

638 名前:デフォルトの名無しさん :2006/09/17(日) 05:56:51
>>635
安心しろ。
途中で例外が発生して楽に死ねる

639 名前:C++ 入門中 :2006/09/17(日) 15:32:04
現在VS2005にてC++の勉強を始めたのですが、
MFCプログラミングはマスターしなくても実務で堪えうる堅牢な
システムを簡単に作れる気がするのですが、
(Windows Application として)

C++を勉強する際には、それもマスターしなければダメなのでしょうか?



640 名前:デフォルトの名無しさん :2006/09/17(日) 15:53:46
BMP画像(24bit)のRGB値をTextファイル出力するプログラムを
作成してみたのですが、BMP画像が正常に読み込める場合と
読み取りエラー(?)が発生してtextに"-1"が書き込まれてしまう場合
があります。これはBMPファイルが壊れているのか、
それともプログラムが悪いのか分かりません。何か解決方法があれば教えてください

641 名前: _ :2006/09/17(日) 16:00:55

>>640
自分で調べろ

642 名前:デフォルトの名無しさん :2006/09/17(日) 16:02:04
>>639
仕事で必要なら勉強すればいいし、そうでなくても好きにすればいい。

643 名前:デフォルトの名無しさん :2006/09/17(日) 16:19:44
>>639
MFCを使わずにMFCと同じだけのことをするプログラムを書く労力より、MFCを覚える労力のほうが大体は少ない。
まあMFCに限った話じゃないが、大抵のライブラリとかツールはそういうもんだ。

644 名前:デフォルトの名無しさん :2006/09/17(日) 16:47:19
MoreEffectiveC++第3版の翻訳本ってまだですかね?
第2版のあまりの評判の悪さにスルーして第3版を待っているのですが
待ちきれないです

645 名前:デフォルトの名無しさん :2006/09/17(日) 16:49:35
とっくにでとるがな

646 名前:デフォルトの名無しさん :2006/09/17(日) 17:00:39
>>639
簡単に迅速に業務アプリを作るのが目的なだとすると、
今なら.NET覚えたほうが良くね?

647 名前: 実は 639 :2006/09/17(日) 17:27:19
>>646
実は、C# / VB.net での開発経験は3年程ありまして
.NET環境での一通りの開発は出来ます。

しかしながら、いい加減これらの言語だけをずっと使っておりますので
飽きて参りました。

そういった経緯でC++.netを勉強し始めたのです。
VSを使えばMFCでなくともフォーム回りとかは簡単に
スグ作れるのになぜ参考書等にはなぜかそのMFCを使った
プログラミング手法が解説されている事に疑問を持ったからです。

実務でMFCを使う事ってありますか?



648 名前:デフォルトの名無しさん :2006/09/17(日) 17:30:20
なんていうか、スレ違いじゃね?

649 名前:デフォルトの名無しさん :2006/09/17(日) 18:49:02
どう見てもスレ違いです。

650 名前:デフォルトの名無しさん :2006/09/17(日) 19:11:12
普通にスルーでよいでしょ。

651 名前:デフォルトの名無しさん :2006/09/17(日) 20:18:13
>>644
EffectiveC++ 第3版でしょ?出版社が変わってピアソンになったよ。
俺はとうの昔に買って読んでる。2色刷りだよ。

652 名前:デフォルトの名無しさん :2006/09/18(月) 03:24:12
うちのは改訂2版なんだけど、買いなおす価値あるかい?

653 名前:デフォルトの名無しさん :2006/09/18(月) 04:04:47
Moreじゃなくて無印のEffective C++のことだよな?
だったら2版と3版じゃ全然違う本になってるから
買い「直す」なんてならないよ。そして相変わらず必読。

654 名前:デフォルトの名無しさん :2006/09/18(月) 04:10:41
そんなに違うのかー。
旧2版の方は十分償却してるだろうから、検討しようかな。
ちょっと立ち読みしてくるわ。サンクス。


655 名前:デフォルトの名無しさん :2006/09/18(月) 09:18:43
operator< ってのは、メンバー関数ポインタに適用できなくて正解ですか?
struct A {
void f1() {}
void f2() {}
};
int main() {
typedef void (A::*ptmf)();
ptmf a = &A::f1;
ptmf b = &A::f2;
return a < b; // ←だとNG、return a != b; なら OK
}
コンテナに突っ込んでたら怒られました。g++ 4.0.1 です。

656 名前:デフォルトの名無しさん :2006/09/18(月) 09:25:03
メンバポインタの大小比較は定義されてないだろうナァ
比較演算ができること自体も驚きだが

657 名前:デフォルトの名無しさん :2006/09/18(月) 11:14:41
>>647
実務で全角アルファベットを使うことはほとんどないです

658 名前:デフォルトの名無しさん :2006/09/18(月) 11:18:13
メンバー関数でなくても(ry

659 名前:デフォルトの名無しさん :2006/09/18(月) 11:19:38
>>656
>比較演算ができること自体も驚きだが

出来てないんじゃ?


660 名前:デフォルトの名無しさん :2006/09/18(月) 12:07:23
>>655
>コンテナに突っ込んでたら怒られました。
Loki::TypeInfoを使ってmapに入れるとか

#include <loki/LokiTypeInfo.h>
#include <utility>
struct A {
void f1() {}
void f2() {}
};
typedef void (A::*ptmf)();
typedef std::pair <Loki::TypeInfo, ptmf> TypeInfo_ptmf_pair;
TypeInfo_ptmf_pair get (ptmf p) {return TypeInfo_ptmf_pair (Loki::TypeInfo (typeid (p)), p);}
int main() {
TypeInfo_ptmf_pair a (get (&A::f1));
TypeInfo_ptmf_pair b (get (&A::f2));
return a.first < b.first; // ←だとNG、return a != b; なら OK
}


661 名前:デフォルトの名無しさん :2006/09/18(月) 12:46:57
>>660
意味不明。TypeInfoで判定してどうすんだよ。
A::f1とA::f2の型が違うってのか?

>>655
typedef void (A::*ptmf)();
struct Comp{
bool operator()(const ptmf& u, const ptmf& v){
return memcmp(&u, &v, sizeof(u))<0;
}
};

std::set<ptmf, Comp> s;

662 名前:660 :2006/09/18(月) 13:19:31
>>661
>A::f1とA::f2の型が違うってのか?
ボケてたスンマセン


663 名前:644 :2006/09/18(月) 13:25:59
MoreEffectiveC++第3版の翻訳本って言ってんだろウワァァァァァァヽ(`Д´)ノァァァァァァン!
勝手に脳内でEffectiveC++第3版にすんな
EffectiveC++第3版ならもう買ってある。読んでないけど

664 名前:デフォルトの名無しさん :2006/09/18(月) 13:37:11
>>663
addison-wesley本家のサイトでみてみたが
more effective c++は
3rdはおろか2ndもなくて
現行で1st editionみたいなんだけど

665 名前:デフォルトの名無しさん :2006/09/18(月) 13:37:31
>>663
原書買えばいいじゃねーか。

666 名前:デフォルトの名無しさん :2006/09/18(月) 13:40:03
addison-wesley本家ってこれね
http://www.awl.com/cseng/titles/0-201-63371-X/

667 名前:デフォルトの名無しさん :2006/09/18(月) 13:45:21
質問させてください。
この度PC上で起きるイベント(作業ウィンドウの変更やウェブページの移動等)を記録するプログラムを作る事になりました。
ネット上等を調べてどうやらSetWindowsHookExという関数を使う事は分かったのですが、具体的なコードの書き方(例題等)が分かりません。
どこか詳しく述べているサイト等を知っている方が居ましたら教えてください。

流れ的には、作業ウィンドウ変更→プログラムが感知(フック)→その内容をテキストに書き込み、という感じにしたいです。
よろしくお願いします。

668 名前:デフォルトの名無しさん :2006/09/18(月) 13:58:50
あれ、プラットフォーム依存はすれ違いじゃなかったっけ。

669 名前:デフォルトの名無しさん :2006/09/18(月) 14:01:37
>>659
operator==, operator!=も比較演算じゃろ

670 名前:655 :2006/09/18(月) 18:28:42
>>660-661
どうもです。vector 二つ使ってベタな key value にします。

671 名前:デフォルトの名無しさん :2006/09/18(月) 20:03:19
>>670
std::map

672 名前:デフォルトの名無しさん :2006/09/19(火) 23:06:56
スレイ違いかもしれんけど、STLのalgorithm使ってる?


673 名前:デフォルトの名無しさん :2006/09/19(火) 23:08:17
使える場面なら使ってる


674 名前:デフォルトの名無しさん :2006/09/19(火) 23:08:49
>>672 雑談ならヤメロ。相談なら情報を小出しにするな。

675 名前:デフォルトの名無しさん :2006/09/19(火) 23:24:38
C++0xに提案されている、lambda式が採用されれば、面白いことになりそうなんだけどなぁ>STLのアルゴリズム

676 名前:デフォルトの名無しさん :2006/09/19(火) 23:35:08
俺の場合は、どっちかというと<boost/range_ex/algorithm.hpp>を使うほうが多い。

677 名前:デフォルトの名無しさん :2006/09/20(水) 02:40:03
>>674
雑談じゃないから続けておk

678 名前:デフォルトの名無しさん :2006/09/20(水) 06:43:29
lamba式って提案されてるの?
採用されればうれしいけど、さすがにされない気がする

679 名前:デフォルトの名無しさん :2006/09/20(水) 07:11:39
boost じゃ駄目なん?

680 名前:デフォルトの名無しさん :2006/09/20(水) 07:17:22
>>679
駄目

681 名前:デフォルトの名無しさん :2006/09/20(水) 08:25:04
>>678
けど提案している中にStroustrupがいるぜ?

Lambda expressions and closures for C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1968.pdf

ちなみに提案されているのは"lambda"だけどな。


いまいちシンタックスが好きじゃないな。

682 名前:デフォルトの名無しさん :2006/09/20(水) 08:46:54
確かこんな感じになるはず。

vector<int> v ;
char const * str = "elem : " ;

for_each(v.begin(), v.end(),
  <>(int x) { std::cout << str << x << std::endl ; }
) ;

やはり邪悪かな。

683 名前:デフォルトの名無しさん :2006/09/20(水) 09:02:17
導入されたら、ポインタの次にラムダ分かりませんという奴続出な予感。

684 名前:デフォルトの名無しさん :2006/09/20(水) 09:57:00
vector<int> v;
auto it = v.begin();
while(it != v.end())
{
std::cout << str << it << std::endl;
}

とかの方でなく?

685 名前:デフォルトの名無しさん :2006/09/20(水) 11:26:34
どうでもいいが
std::cout << str << *it << std::endl;
じゃないのか?

686 名前:デフォルトの名無しさん :2006/09/20(水) 12:03:13
>>682
返り値型指定なしのlambda式の登場で、
またname lookupが複雑になりそう…

687 名前:デフォルトの名無しさん :2006/09/20(水) 13:17:18
>>686
いや、単に省略できるだけで、
return文を見てコンパイラが決めるだけらしいから。
return文がなければ、voidとみなす。

688 名前:デフォルトの名無しさん :2006/09/20(水) 18:11:59
いやdecltypeで既に複雑になると言われているので…

689 名前:デフォルトの名無しさん :2006/09/20(水) 22:11:45
682の何が邪悪なの?
今やアレ程度のlamda式が無い言語の方が希少なはずだけど。


ひょっとして、<>って部分だけを指していってんのか?
だとしたら単なるアホなんだけど、まさかな。

690 名前:デフォルトの名無しさん :2006/09/20(水) 22:13:21
どうでもいいが、lambdaを頭の中ではランバダと読んでしまって困る。

691 名前:デフォルトの名無しさん :2006/09/20(水) 22:29:46
マサルさんを思い出した

692 名前:デフォルトの名無しさん :2006/09/20(水) 22:33:19
boostみたいに必死こくくらいだったらおとなしく言語仕様に入れた方がいいな>lambda
というより
<>(int x) ...
この記述は…<>が名前のない関数名を示すみたいな感じなの?

693 名前:デフォルトの名無しさん :2006/09/20(水) 22:45:34
>>692
そういうことらしい。
tempate <typename T>の<>からの連想だとかだった気がする。

694 名前:デフォルトの名無しさん :2006/09/20(水) 23:23:52
まあ><よりマシか

695 名前:デフォルトの名無しさん :2006/09/20(水) 23:51:22
テンプレートラムダは出来るようにするのかな?
出来ないと嘘だとは思うけど。

696 名前:デフォルトの名無しさん :2006/09/20(水) 23:51:51
ラムダ分かりません><

697 名前:デフォルトの名無しさん :2006/09/21(木) 00:17:07
>>695
提案では、lambda式はジェネリックであってはならないと書いてあるけど。
ジェネリックってのはなんだろ。
こういうのもダメなのかな?

template < typename T >
void f(T x)
{
(<>() extern(x){ std::cout << x << std::endl ; })() ;
}

698 名前:デフォルトの名無しさん :2006/09/21(木) 05:22:59
正直なところ利用価値がよくわからんちん。
誰かお母さんみたいに優しく教えてくれ。

699 名前:デフォルトの名無しさん :2006/09/21(木) 05:38:18
>>698
you lose

700 名前:デフォルトの名無しさん :2006/09/21(木) 07:41:58
>>693
lambda式はテンプレートにはしないと提案に書いてあるのにか?

701 名前:デフォルトの名無しさん :2006/09/21(木) 08:01:54
言語仕様に入ったら boost::lambda はお払い箱?

702 名前:デフォルトの名無しさん :2006/09/21(木) 08:25:07
あれはあれで使いやすいしなあ。

703 名前:デフォルトの名無しさん :2006/09/21(木) 09:27:15
たしかに見た感じはboostのが分かりやすい
でもメンバ関数呼ぼうとしたときは0xの方が分かりやすいかな

704 名前:デフォルトの名無しさん :2006/09/21(木) 13:12:49
lambdaを使うとなにかいいことあるの?

705 名前:デフォルトの名無しさん :2006/09/21(木) 13:28:26
使い捨ての関数をその場限りでかける。

っていうか名前考えなくていいだけでありがたい


706 名前:デフォルトの名無しさん :2006/09/21(木) 14:44:18
すいません。以下のようなプログラムで、aa.test(), bb.test(), cc.test()
のメソッドポインタを格納できるような配列はどのように書けばよろしいでしょうか?
クラスが違うメソッドのポインタを配列に格納するのは無理なのでしょうか?

#include <stdio.h>
class a{
 public:
  void test(){printf("a");}
};
class b{
 public:
  void test(){printf("b");}
};
class c{
 public:
  void test(){printf("c");}
};
int main(){
 a aa; b bb;c cc;
}

707 名前:デフォルトの名無しさん :2006/09/21(木) 15:08:32
そのままでは無理。

testという名前が同じであることが大事なら、templateで継承関係を後付けすることができる。



708 名前:デフォルトの名無しさん :2006/09/21(木) 15:19:21
bindしてboost::functionに入れるという手もある。

709 名前:デフォルトの名無しさん :2006/09/21(木) 16:17:48
>>706
struct ITest { virtual void test() = 0; }

class a : public ITest { virtual void test()

710 名前:デフォルトの名無しさん :2006/09/21(木) 16:20:35
途中で送信しちまった。

struct itest { virtual void test() = 0; }
class a : public itest { virtual void test() { printf("a"); } }
class b : public itest { virtual void test() { printf("b"); } }
class c : public itest { virtual void test() { printf("c"); } }


711 名前:デフォルトの名無しさん :2006/09/21(木) 16:23:14
そこまで親切丁寧に書かんでも

712 名前:デフォルトの名無しさん :2006/09/21(木) 16:54:07
基本的には>>710なんだろうけれども、
boost の使用に抵抗が無ければboost::functionが良いと思う。
C# の delegate 並みに楽ちん。

713 名前:デフォルトの名無しさん :2006/09/21(木) 16:56:56
boost馬鹿は死んでね

714 名前:デフォルトの名無しさん :2006/09/21(木) 16:58:54
Boostを使えない馬鹿が何か言ってる。

715 名前:デフォルトの名無しさん :2006/09/21(木) 17:41:53
Boostが嫌でも、functionもbindもTR1に入っているから、
将来のC++標準入りの可能性は高い。

まあいつのことだかわからないけどね。

716 名前:710 :2006/09/21(木) 17:49:51
(1)template/boostを使う方法
  →template/boostの使用は不可(開発環境での制限)

(2)>>710の方法
 → class a,b,cは他人が提供するクラスであり、
   void型ということとメソッド名以外は任意となる(仕様)

そのままでは無理ということで、
全く別の方法を考えて見ます

レスありがとうございましたm(_ _)m

717 名前:706 :2006/09/21(木) 17:51:00
710ではなくて706でしたorz

718 名前:デフォルトの名無しさん :2006/09/21(木) 18:11:01
テンプレートが使えなければマクロでごり押ししてしまえ。
class test_holder {
public:
    virtual void test() = 0;
    virtual void ~test_holder() {}
};
#define TEST_HOLDER(c) test_holder_ ## c
#define DEFINE_TEST_HOLDER_IMPL(c, mem) \
class TEST_HOLDER(c) : public aa { \
    c& x; \
public: \
    TEST_HOLDER(c)(c& obj) : x(obj) {} \
    virtual void test() {x.test();} \
}
DEFINE_TEST_HOLDER_IMPL(aa);
DEFINE_TEST_HOLDER_IMPL(bb);
DEFINE_TEST_HOLDER_IMPL(cc);
int main() {
    aa a; bb b; cc c;
    test_holder* holder[] = {
        new TEST_HOLDER(aa)(a),
        new TEST_HOLDER(bb)(b),
        new TEST_HOLDER(cc)(c),
    };
    for (int i = 0; i < sizeof holder / sizeof holder[0]; ++i)
        holder[i]->test();
    for (int i = 0; i < sizeof holder / sizeof holder[0]; ++i)
        delete holder[i];
}

719 名前:デフォルトの名無しさん :2006/09/21(木) 19:29:13
boost禁止はわかるが、template禁止かよ。

720 名前:デフォルトの名無しさん :2006/09/21(木) 21:13:21
C++はtemplateが無いとただのアレな言語だからなぁ

721 名前:デフォルトの名無しさん :2006/09/21(木) 21:22:19
禁止じゃなくて、開発環境の制限と書かれてるぞ。
処理系の制限かもよ。俺はそんな処理系知らないけど。

722 名前:デフォルトの名無しさん :2006/09/21(木) 21:37:53
VC6の実装なら十分制限になりえそうだがな。

723 名前:デフォルトの名無しさん :2006/09/21(木) 21:42:07
embleded C++とか言う奴か?

724 名前:デフォルトの名無しさん :2006/09/21(木) 21:42:23
EmbeddedC++とかじゃね。

725 名前:デフォルトの名無しさん :2006/09/21(木) 21:43:47
かぶった('д`)

726 名前:デフォルトの名無しさん :2006/09/21(木) 21:44:41
そもそも、何で異なるシグネチャのメンバ関数ポインタを配列で持ちたいと思ったんだろう。

727 名前:デフォルトの名無しさん :2006/09/21(木) 21:52:14
多分メンバ関数ポインタを普通の関数ポインタと同じように扱えると
考えてたんだろ。

728 名前:デフォルトの名無しさん :2006/09/22(金) 00:13:36
shcppでも使えるようになったのかね。

729 名前:デフォルトの名無しさん :2006/09/22(金) 00:37:51
>>726
漏れの目が悪くなければ、シグネチャは一致していると思うが。

730 名前:デフォルトの名無しさん :2006/09/22(金) 00:59:24
>>729
クラスが違うだろ。

731 名前:デフォルトの名無しさん :2006/09/22(金) 08:33:32
シグネチャは一致してるだろボケ

732 名前:デフォルトの名無しさん :2006/09/22(金) 08:43:00
しぐねちゃってなんですか (>_<)

733 名前:デフォルトの名無しさん :2006/09/22(金) 09:26:18
暗黙のthisポインタって知ってるか?
クラスが違うとシグネチャも違うよ。

734 名前:デフォルトの名無しさん :2006/09/22(金) 11:12:36
1.3.11 signature [defns.signature]
the information about a function that participates in overload resolution (13.3): its parameter-type-list (8.3.5) and, if the
function is a class member, the cv- qualifiers (if any) on the function itself and the class in which the member function is
declared. The signature of a function template specialization includes the types of its template arguments (14.5.5.1).

735 名前:デフォルトの名無しさん :2006/09/22(金) 11:50:53
また変な流れになってきた

736 名前:デフォルトの名無しさん :2006/09/22(金) 12:03:34
いや、シグネチャという概念は大切。特にC++では。

737 名前:デフォルトの名無しさん :2006/09/22(金) 12:04:10
シグネチャって関数の多重定義の時にだけ意識していればいいのでわ?

738 名前:デフォルトの名無しさん :2006/09/22(金) 12:43:47
Generic programming全般で重要です。

739 名前:デフォルトの名無しさん :2006/09/22(金) 13:05:08
ふと思いついた紛らわしい関数のシグネチャ

Typelist ( A, B, C, D )


// Typelist 型の戻り値を持ち、
// A, B, C, D の4つの型の引数をとる関数定義


740 名前:デフォルトの名無しさん :2006/09/22(金) 13:25:29
>>739
どこがまぎらわしいの?

741 名前:デフォルトの名無しさん :2006/09/22(金) 15:19:54
ヘルプに
「template は将来の為に予約されています」
と載ってた時代を思い出すなあ。

742 名前:デフォルトの名無しさん :2006/09/22(金) 15:21:58
export templateはもう諦めた方がいいですか?

743 名前:デフォルトの名無しさん :2006/09/22(金) 17:18:06
boost/archive/xml_iarchive.hpp
boost/archive/xml_oarchive.hpp
のsample programをそのまま使っても

runtimeの異常な呼び出しで終了しました

とかいうエラーで止まるんですが、なぜ?
includeするだけじゃ動かないのかな

環境はVS2003です


744 名前:デフォルトの名無しさん :2006/09/22(金) 17:21:24
sample programというのは
boostのホームページにのってるdemoプログラムのことです

745 名前:743 :2006/09/22(金) 18:13:01
自己解決しました
boost_1_33_1\libs\serialization\vc7ide
に入っていたproject fileを使ったらうまく動きました

boostのホームページからコピペしただけでは
動かなかったのは謎です

746 名前:デフォルトの名無しさん :2006/09/22(金) 18:15:43
>>743
>includeするだけじゃ動かないのかな
ライブラリをリンクする必要がある


747 名前:デフォルトの名無しさん :2006/09/22(金) 23:33:33
double型なデータをstd::string型に変換するにはどうすればよいのでしょうか?

748 名前:デフォルトの名無しさん :2006/09/22(金) 23:41:48
どういう変換を想定してるの?
1.234 => "1.234"
みたいなこと?

749 名前:デフォルトの名無しさん :2006/09/23(土) 00:03:42
boost::lexical_cast

750 名前:747 :2006/09/23(土) 00:44:56
>>748
そのとおりです。
簡単そうで意外と情報が見つかりませんでしたorz


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