トップページ⇒tech
1001コメント302KB

C++相談室 part34

レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)vNGNG
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0951デフォルトの名無しさんNGNG
継承って美しいか?
むしろ泥臭い。
最適解なら泥臭くても使う。
それは継承でもグローバル関数でも変わらない。
0952デフォルトの名無しさんNGNG
>>928
STL はコンテナ系も便利だが <algorithm> も便利だよ。
0953デフォルトの名無しさんNGNG
うわーい。こんな雰囲気なら漏れさんでも飛び込み参加できそうな予感。

class MyConstants
{
static const std::string TEST_TEST1;
static const std::string TEST_TEST2;
static const std::string TEST_TEST3;
}

こういうクラスから継承するときはどうするのが普通なの?
private virtualあたり?

class MyTest : public MyTestAbstract, private virtual MyConstants
{
}

教えてね♪
0954デフォルトの名無しさんNGNG
>>953
ポリシークラスでググる。
0955デフォルトの名無しさんNGNG
オブジェクト指向プログラミングでいうところの継承と、
C++でいうところのclassの継承は
似てるようで全然違うよ。

手段と目的を履き違えないようにね☆
0956デフォルトの名無しさんNGNG
>>955
何が違うの?
C++のクラスはOOPLのクラスと同じように扱う事もできるのに。
0957デフォルトの名無しさんNGNG
>>956
Java厨はスルーしろ
0958デフォルトの名無しさんNGNG
>>C++のクラスはOOPLのクラスと同じように扱う事もできるのに。

扱うこと「も」できるのに。

この「も」が重要。
0959デフォルトの名無しさんNGNG
似てるようで全然違うよ。
        ~~~~~
0960デフォルトの名無しさんNGNG
templateと組み合わせたgenericな・・・というのは詭弁。
違いはせいぜいスタックに生成できる事と、デストラクタの存在くらいなもんだ。
0961デフォルトの名無しさんNGNG
>>955
>手段と目的を履き違えないようにね☆

無粋なやっちゃな、そこを敢えて履き違えるのが粋ってもんだろ?
0962デフォルトの名無しさんNGNG
Java厨はスルーね
0963デフォルトの名無しさんNGNG
>>961
えーそれだと学生みたいでヤだ
0964デフォルトの名無しさんNGNG
>>963
プロが敢えて履き違えるのが興
0965デフォルトの名無しさんNGNG
>>964
上司がPGあがりのPMだったら、厨房扱いされて査定に響く怖れアリ。
0966デフォルトの名無しさんNGNG
template <typename T>
class C{ ... };
を、T を省略して
template <typename>
class C{...};
と書く事って認められてます?

テンプレートパラメータに template 入れるときに省略したいんだけど…
0967デフォルトの名無しさんNGNG
>>966
こんなの?
template <typename T, template <typename> class U>
struct Hoge {
};
0968デフォルトの名無しさんNGNG
>>967
そうです
0969デフォルトの名無しさんNGNG
>>966
文法上は問題ない。
0970マイク ◆yrBrqfF1Ew NGNG
>>955
何が全然違うんだ?
0971953NGNG
>>953でMyConstantsからの継承方法について
質問した者ですが……

すいません、>>954さんの言われたとおり
「ポリシークラス」でぐぐったのですが、
関係しそうなのは見つけられませんでした。

もう少しだけ詳しく教えて頂けませんか?
0972デフォルトの名無しさんNGNG
>>971 たぶん質問の意図を理解できた奴はいないと思われ。
0973953NGNG
>>972
そ、そうですか。。。

定数だけ宣言・定義しているクラスを他のクラスに
継承させる場合、どういう風にするのが正しいのか
知りたいのです。

Javaではこういう場合 implements を使いますが、
C++ ではどうすればいいのかはっきりと分かりません。
private virtual でも動いてはいるのですが、(>>953)
きちんとした裏付けがあれば、、、と思ったわけです。
0974デフォルトの名無しさんNGNG
>>973
そもそもそんなクラスは作らないのが普通。
0975デフォルトの名無しさんNGNG
>>973
わざわざそんなクラスを使う場合には、定数を付け替える意図アリと見て、ポリシークラスとしてパラメータ化して
<template class T> class MyTest : public MyTestAbstract, T { ... };
などして、使う側では MyTest< JPY_YeildRate > とか MyTest< USD_YeildRate > するんデネーノ。
という気がします。

private 継承、 public 継承は別に適切な方を使えばヨシ。
0976デフォルトの名無しさんNGNG
>>973
private継承、virtual継承の仕様を知らずに使ってるの?
仕様さえ知ってればそれで裏付けになるんじゃないの?
0977953NGNG
>>974-975
普通はこういうクラスは作らないものなんですか。。。
せっかくなので今の状況を説明しておきます。
あくまでイメージとして見てください。
class MainManager {
void registFoo(Foo & foo) {
 _fooByFooNameTable.put(foo.getClassName(), foo);
 _fooByTypeNameTable.put(foo.getTypeName(), foo);
 _fooByBarNameTable.put(foo.getBarClassName(), foo); }
Array<Hashtable> enumerate(type); // 外部API
Hashtable getvalue(type, hashtable); // 外部API };

class Foo {
enumerateBarList();
createBar(Hashtable);
getClassName();
getTypeName();
getBarClassName(); };

class Bar {
toHashTable();
getClassName(); };

FooAbstract : public virtual Foo;
BarAbstract : public virtual Bar;
MyFoo : public FooAbstract;
MyBar : public BarAbstract;
YourFoo, YourBar, HisFoo, HisBar, HerFoo, HerBar, ...
と、こんな具合のクラス群があります。(続く)
0978953NGNG
MainManager ----------------|
--(uses)--> Foo --(creates/uses)--> Bar

外部からMainManagerが呼び出されると、対応するFooが呼ばれます。
MainManager::enumerate(type) -> Foo::enumerateBarList()
MainManager::getvalue(type, hashtable) -> Foo::createBar(hashtable)

Fooの側ではenumerateBarList()でvalueをどっかから
取り出してきて一つ以上のBarを作成するか、
createBar(Hashtable)で既存のhash tableから
一部を読み出してそれを元にBarを作成します。
で、Barの側ではtoHashTable()を呼ばれると
自分を元にhash tableを作ります。

Barは内部的にはさまざまなところで使われます。
内部的にはもっぱらBarのインスタンスをやりとりしますが、
外部のAPIのからみがあってhash tableの操作は必要です。

で、この場合 KEY_NAME_A, KEY_NAME_B とかの定数を
両方のクラスで共有しないとすると、たとえばBarクラスで
定義して、Fooクラスで使うときにはBar::*としなければ
いけなくなってしまいます。
0979953NGNG
さらに、Fooのインスタンス (Single) はMainManagerクラス内に
hash tableで登録されていて、Fooのクラス名、Barのクラス名、
あるいは外部APIのtype名で呼び出せるようになっています。
(ここでクラス名は単に識別名の役目)。
そのためにFooでは自分のクラス名、Barのクラス名、type名を
定数として持っておきたいんですが、同時にBarでも自分自身の
クラス名(識別名)は知っておきたいのです。
この場合やはり両方のクラスで同じ定数を共有したいと思います。

さらにさらに、実はFoo、BarのほかにBazクラスなども出てきそうです。
となると、やはりMyConstans, HisConstants等があったほうが
便利だと思うのです。

さらにさらにさらに、My*, Your*, His*, Her* クラスたちの大枠を
XMLファイルから自動生成するCode Generatorを作って、
includeを活用して人力の部分を少なくしようという計画も進行中です。
なので (機械化を楽にするためにも) 多少クラスは増えても
各々がシンプルになればと思っています。

定数を共有するためにもっといい方法があればご教示ください。
>>975さんの「ポリシークラス」は、当てはまる部分では役立ちそうな
情報だと思いましたが、今回のケースではそこまでする必要もなさそうです。。
0980デフォルトの名無しさんNGNG
作成したexeファイルを、Windowsのエクスプローラから
実行してみると、コマンドプロンプトが一瞬表示されて
直ぐに終了してまうのですが、こうやれば
#include <stdio.h>

main() {
printf("Hello!");
rewind(stdin); //追加行:標準入力を初期化する
         getchar(); //追加行:一文字入力を待つ
return 0;
}

一文字打つまで終了しないらしいのですが、一瞬で終了してしまいます。
何故なのでしょうか?何処か違っていたら訂正お願い致します。
0981953NGNG
あ、なんかregistFooでポインタのはずがリファレンスを
書いちゃってますけど、あくまでイメージということで。。。
0982デフォルトの名無しさんNGNG
ずれていたました、すみませんこうでした

#include <stdio.h>

main() {
    printf("Hello!");
rewind(stdin); //追加行:標準入力を初期化する
    getchar();      //追加行:一文字入力を待つ
return 0;
}
0983デフォルトの名無しさんNGNG
>>982
rewind(stdin); が禿しく実装依存。標準ではファイルポインタを戻せない
コンソール入力に対しては未定義動作。ファイルにリダイレクトされて
いればいいが。

取り除いてやってみろ。それからC++ではなくCスレに行った方が幸せになれる。
0984デフォルトの名無しさんNGNG
つーか、privateメンバしかないclass作って何が楽しいの?
0985デフォルトの名無しさんNGNG
>>977-
何の因果か知らないけども、あまり正気の沙汰とは思えない状態だな。
定数を共有するいい方法があったとしても、その混沌ぶりの前では焼け石に水と思われ。

結局定数なんだったらアクセス指定緩くても安全なわけで、
namespace My/Yout/His/Her とかに定義してしまえば終了な気もする。
0986953NGNG
>>984
だからあくまでイメージなのです。。。
書いてあるのはほとんどpublicと思ってください。

>>985
そんなに混沌としていますか。。。すごく不安です。
namespaceはなんだか増やしちゃいけない空気です。
YourFooからYourBarの一覧を取り出すのに
HisBarを呼んできたりとかしますから。。
0987デフォルトの名無しさんNGNG
>>983
助言ありがとうございました。
Cで訊いてみます詳しくは
0988デフォルトの名無しさんNGNG
>>986(953) たぶん「今の状況」を把握できた奴はいないと思われ。
0989デフォルトの名無しさんNGNG
>namespaceはなんだか増やしちゃいけない空気です。

そんな空気は無い。
0990デフォルトの名無しさんNGNG
>>989
>そんな空気は無い。

あるよ。
namespaceとヘッダファイル・クラスを混同してしまう人がいる。
namespaceは少ないに越した事はない。
悪意を持って他人の仕事の邪魔をしたいなら別だが。
0991デフォルトの名無しさんNGNG
少ないに越した事はない≠増やしちゃいけない
0992デフォルトの名無しさんNGNG
>>990
アホかお前?
0993デフォルトの名無しさんNGNG
>>987
漏れなら継承を利用して定数を共有するなんて中途半端なことしないで、
virtual void DoSaveLoad(Hashtable h, bool bLoad) {
 base::DoSaveLoad(h, bLoad);
 if (bLoad) m_ver1 = h["Ver1"]; else h["Ver1"] = m_ver1;
};
に展開される4つのマクロ:
BEGIN_PROPERTY_EXCHANGE
 DECLARE_BASE_CLASS(base)
 DECLARE_PROPERTY(m_ver1, "Ver1")
END_PROPERTY_EXCHANGE
とか作るけど。3行目のようなのは必要に応じて増やす。
定数を剥き身で使ってちゃミスの元だし。


0994デフォルトの名無しさんNGNG
みんな!宿題はおわったかな?!
バグもちゃんととってくれよぉ!!
0995デフォルトの名無しさんNGNG
>>990

>あるよ。
無い。

>namespaceとヘッダファイル・クラスを混同してしまう人がいる。
そんな超々低能を基準にバカいってんじゃねぇ。

>悪意を持って他人の仕事の邪魔をしたいなら別だが。
悪意を持って他人の仕事の邪魔をしたくないなら、そんなキチガイ発言は止めろ。
0996デフォルトの名無しさんNGNG
namespaceってウンコだよね。
ライブラリ作ってる香具師がバカだとglobal namespaceになんでも詰め込みやがるから、
こっちで
namespace UnkoLib
{
 #include <library.h>
}
とかやってもうまく動かないし。
0997デフォルトの名無しさんNGNG
C++ はバカ前提に作られてません。自分の首を絞めるのに十分なだけの
強度のロープを提供してます。
0998デフォルトの名無しさんNGNG
まんこまんこ
0999デフォルトの名無しさんNGNG
次スレは〜?
1000デフォルトの名無しさんNGNG
>>996
その場合ライブラリ作ってる香具師がウンコだよ。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。