C++相談室 part34
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0951デフォルトの名無しさん
NGNGむしろ泥臭い。
最適解なら泥臭くても使う。
それは継承でもグローバル関数でも変わらない。
0952デフォルトの名無しさん
NGNGSTL はコンテナ系も便利だが <algorithm> も便利だよ。
0953デフォルトの名無しさん
NGNGclass 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ポリシークラスでググる。
0955デフォルトの名無しさん
NGNGC++でいうところのclassの継承は
似てるようで全然違うよ。
手段と目的を履き違えないようにね☆
0956デフォルトの名無しさん
NGNG何が違うの?
C++のクラスはOOPLのクラスと同じように扱う事もできるのに。
0957デフォルトの名無しさん
NGNGJava厨はスルーしろ
0958デフォルトの名無しさん
NGNG扱うこと「も」できるのに。
この「も」が重要。
0959デフォルトの名無しさん
NGNG~~~~~
0960デフォルトの名無しさん
NGNG違いはせいぜいスタックに生成できる事と、デストラクタの存在くらいなもんだ。
0961デフォルトの名無しさん
NGNG>手段と目的を履き違えないようにね☆
無粋なやっちゃな、そこを敢えて履き違えるのが粋ってもんだろ?
0962デフォルトの名無しさん
NGNG0963デフォルトの名無しさん
NGNGえーそれだと学生みたいでヤだ
0964デフォルトの名無しさん
NGNGプロが敢えて履き違えるのが興
0965デフォルトの名無しさん
NGNG上司がPGあがりのPMだったら、厨房扱いされて査定に響く怖れアリ。
0966デフォルトの名無しさん
NGNGclass C{ ... };
を、T を省略して
template <typename>
class C{...};
と書く事って認められてます?
テンプレートパラメータに template 入れるときに省略したいんだけど…
0967デフォルトの名無しさん
NGNGこんなの?
template <typename T, template <typename> class U>
struct Hoge {
};
0968デフォルトの名無しさん
NGNGそうです
0969デフォルトの名無しさん
NGNG文法上は問題ない。
0970マイク ◆yrBrqfF1Ew
NGNG何が全然違うんだ?
0971953
NGNG質問した者ですが……
すいません、>>954さんの言われたとおり
「ポリシークラス」でぐぐったのですが、
関係しそうなのは見つけられませんでした。
もう少しだけ詳しく教えて頂けませんか?
0972デフォルトの名無しさん
NGNG0973953
NGNGそ、そうですか。。。
定数だけ宣言・定義しているクラスを他のクラスに
継承させる場合、どういう風にするのが正しいのか
知りたいのです。
Javaではこういう場合 implements を使いますが、
C++ ではどうすればいいのかはっきりと分かりません。
private virtual でも動いてはいるのですが、(>>953)
きちんとした裏付けがあれば、、、と思ったわけです。
0974デフォルトの名無しさん
NGNGそもそもそんなクラスは作らないのが普通。
0975デフォルトの名無しさん
NGNGわざわざそんなクラスを使う場合には、定数を付け替える意図アリと見て、ポリシークラスとしてパラメータ化して
<template class T> class MyTest : public MyTestAbstract, T { ... };
などして、使う側では MyTest< JPY_YeildRate > とか MyTest< USD_YeildRate > するんデネーノ。
という気がします。
private 継承、 public 継承は別に適切な方を使えばヨシ。
0976デフォルトの名無しさん
NGNGprivate継承、virtual継承の仕様を知らずに使ってるの?
仕様さえ知ってればそれで裏付けになるんじゃないの?
0977953
NGNG普通はこういうクラスは作らないものなんですか。。。
せっかくなので今の状況を説明しておきます。
あくまでイメージとして見てください。
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, ...
と、こんな具合のクラス群があります。(続く)
0978953
NGNG--(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::*としなければ
いけなくなってしまいます。
0979953
NGNGhash 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実行してみると、コマンドプロンプトが一瞬表示されて
直ぐに終了してまうのですが、こうやれば
#include <stdio.h>
main() {
printf("Hello!");
rewind(stdin); //追加行:標準入力を初期化する
getchar(); //追加行:一文字入力を待つ
return 0;
}
一文字打つまで終了しないらしいのですが、一瞬で終了してしまいます。
何故なのでしょうか?何処か違っていたら訂正お願い致します。
0981953
NGNG書いちゃってますけど、あくまでイメージということで。。。
0982デフォルトの名無しさん
NGNG#include <stdio.h>
main() {
printf("Hello!");
rewind(stdin); //追加行:標準入力を初期化する
getchar(); //追加行:一文字入力を待つ
return 0;
}
0983デフォルトの名無しさん
NGNGrewind(stdin); が禿しく実装依存。標準ではファイルポインタを戻せない
コンソール入力に対しては未定義動作。ファイルにリダイレクトされて
いればいいが。
取り除いてやってみろ。それからC++ではなくCスレに行った方が幸せになれる。
0984デフォルトの名無しさん
NGNG0985デフォルトの名無しさん
NGNG何の因果か知らないけども、あまり正気の沙汰とは思えない状態だな。
定数を共有するいい方法があったとしても、その混沌ぶりの前では焼け石に水と思われ。
結局定数なんだったらアクセス指定緩くても安全なわけで、
namespace My/Yout/His/Her とかに定義してしまえば終了な気もする。
0986953
NGNGだからあくまでイメージなのです。。。
書いてあるのはほとんどpublicと思ってください。
>>985
そんなに混沌としていますか。。。すごく不安です。
namespaceはなんだか増やしちゃいけない空気です。
YourFooからYourBarの一覧を取り出すのに
HisBarを呼んできたりとかしますから。。
0987デフォルトの名無しさん
NGNG助言ありがとうございました。
Cで訊いてみます詳しくは
0988デフォルトの名無しさん
NGNG0989デフォルトの名無しさん
NGNGそんな空気は無い。
0990デフォルトの名無しさん
NGNG>そんな空気は無い。
あるよ。
namespaceとヘッダファイル・クラスを混同してしまう人がいる。
namespaceは少ないに越した事はない。
悪意を持って他人の仕事の邪魔をしたいなら別だが。
0991デフォルトの名無しさん
NGNG0992デフォルトの名無しさん
NGNGアホかお前?
0993デフォルトの名無しさん
NGNG漏れなら継承を利用して定数を共有するなんて中途半端なことしないで、
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>あるよ。
無い。
>namespaceとヘッダファイル・クラスを混同してしまう人がいる。
そんな超々低能を基準にバカいってんじゃねぇ。
>悪意を持って他人の仕事の邪魔をしたいなら別だが。
悪意を持って他人の仕事の邪魔をしたくないなら、そんなキチガイ発言は止めろ。
0996デフォルトの名無しさん
NGNGライブラリ作ってる香具師がバカだとglobal namespaceになんでも詰め込みやがるから、
こっちで
namespace UnkoLib
{
#include <library.h>
}
とかやってもうまく動かないし。
0997デフォルトの名無しさん
NGNG強度のロープを提供してます。
0998デフォルトの名無しさん
NGNG0999デフォルトの名無しさん
NGNG1000デフォルトの名無しさん
NGNGその場合ライブラリ作ってる香具師がウンコだよ。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。