C++相談室 part34
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0910889
NGNG定義?
std::string std_string_variable;
これでいいのか?
>>909
いやいや同じじゃないよ。
継承メンバ関数追加バージョンのuppercaseはstd::stringに対しては使えないんだよ。
継承メンバ関数追加を他の2、3人の奴がやってみ
A君は大文字化を追加したUppercaseStringを作った
B君は最後の文字を取り除く機能を追加したChopStringを作った
C君はその文字列をurlエンコードする機能を追加したURLEncoderStringを作った
じゃあ、大文字化の機能と最後の文字を取り除く機能とurlエンコードする機能全部を使いたいとき
一体どれを使ったらいいんだい?
外部関数でその機能を作ればこんなアホな自体にならないと思うけど。
0911デフォルトの名無しさん
NGNG>これでいいのか?
ああ、それでいい。
派生クラスで protected にアクセスできなくなるのと
同根の仮定を勝手に持ち込もうとしていることが判ったからな
また3人て新たな仮定を追加するのかよ、いい加減にしろや
色んな書き方ができる中で今回は継承を選ばないって場合の例ばかり持ち出しては
継承そのものを否定しようとする態度はよくわかった
0912デフォルトの名無しさん
NGNG3人でよけりゃ仮想継承って手もあるなw
0913デフォルトの名無しさん
NGNGだから880には噛み付いてない
さっきも言ったがあんた自分の態度に思い当たるフシあるんじゃないの?
0914889
NGNG>継承そのものを否定しようとする態度はよくわかった
あれ?継承そのものを否定なんてしてないけど?
というか、オレは継承しまくり人間だよ。
実装継承もよくするしね。template<class T> class A : public T とかもしまくり。
ただ今回のケース、(>>854ね
は継承してメンバ関数追加 (>>858ね
は愚の骨頂やん?
だからいってるんやけど?なんか気に障った?
ヘタな説明にイラついたんやとしたらあやまるわ。ゴメン。
0915デフォルトの名無しさん
NGNG0916デフォルトの名無しさん
NGNGあんたのキャラクタか
0917889
NGNGじゃあなんでオレに噛み付いたんだよ。
>さっきも言ったがあんた自分の態度に思い当たるフシあるんじゃないの?
聞いてないし、フシも無い。
>>916
はは、関西弁なんて知らんからな。酷く疲れたぜ。
0918デフォルトの名無しさん
NGNG0919デフォルトの名無しさん
NGNG890 が ToLowerCase, ToUpperCase を追加した MyStringUL を作った。
俺が EUC, SJIS の相互変換できる MyStringES を作った。
で、両方の機能が使いたくなったらどうする? 気がつくと似て非なる
互換性のない文字列型がたくさん出来てることになりかねんぞ。
ねじ・くぎのような「部品」として使うクラス、プログラミング言語 C++ で
言うところの具象クラスは、可能な限り安易な仕様を早期に固めて、
安易な拡張はしない方が良い。まして継承は最悪の選択肢の一つだ。
0920デフォルトの名無しさん
NGNGvirtual で多重継承して、C++の繊細さを堪能するというのもアリだと思うぞ。
堪能ってのは、実質デバッグの堪能だけどな。
ま、無理ではない。
0921デフォルトの名無しさん
NGNGiterator使ったgeneric function書く。> toupper
0922デフォルトの名無しさん
NGNGすでに MyStringUL 使って書かれてるコードが大量にあったら、MyStringES に
クロスキャストするの? それは死にそうだ。
0923デフォルトの名無しさん
NGNG890 が ToLowerCase, ToUpperCase を追加した MyString を作った。
俺が EUC, SJIS の相互変換できる機能を、 MyString に追加した。
となるわな。インフラグループとかが、普通にやってることだ。
0924デフォルトの名無しさん
NGNGフリー関数を作る
どちらかでしか実現できないことなら仕方ないが、どっちでも実現できて
一方にはかなり痛いデメリットがある場合には、選択肢は自ずと決まると
思うんだが。
0925デフォルトの名無しさん
NGNG機能追加はなんでもかんでも継承だ、という安直な考えを持った、
オブジェクト指向習い始めて3日目くらいの奴がそのグループに多いとやっちゃうわな。
だけどそんなフツウを、世の中のフツウと勘違いしたらダメだ。
0926デフォルトの名無しさん
NGNGとりあえずやってみたらって言うのをずいぶん調子に乗って拡大解釈してるな、おまえ
選択以前のことを言ってるところへあーしろこーしろと思考まで代行してくれなくていいんだよ
それとも最後まで代行をやり通す責任感があって言ってるのか?
人が自分で物事を考えるときに金切り声で騒ぎ立てるのがただうるせえんだよ
物作ってるより人に暴言吐いてる方が楽しい奴が何か憶えたのを使いたくてこっち来たのか?
0927デフォルトの名無しさん
NGNG何切れてんだお前?
責任とって欲しいならそもそも2chに来るなよ。
0928デフォルトの名無しさん
NGNG文字列操作系のグローバル関数満載かよ。
どんなプロジェクトだよ(w)
0929デフォルトの名無しさん
NGNG0930デフォルトの名無しさん
NGNG0931デフォルトの名無しさん
NGNG0932デフォルトの名無しさん
NGNGclass A { ... };
class B { ... };
class C : public A, public B { ... };
A, B, C全て仮想デストラクタを持っている
C* pc = new C;
B* pb = pc;
delete pb;
デストラクタは正しく呼ばれるが、pbのアドレス(pc != pbは確認済み)でメモリが解放されておかしくなる
と思ったのですが、operator newとdeleteをオーバーライドしてトレースしてみたところ
operator deleteではpcのアドレスが来ました。
delete pb;ではpbが指すのがCのオブジェクトなのかBのオブジェクトなのか区別できないはずなのに
どうしてpcのアドレスが求めることができたのでしょうか?
0933デフォルトの名無しさん
NGNG反論できないと荒しかよ(ゲラ
0934デフォルトの名無しさん
NGNGExceptional C++ 嫁
0935デフォルトの名無しさん
NGNG浅はかな考えを指摘されたからって逆切れするなよ
>>928
お前の糞プロジェクトを中心にものごとを考えるなよ。
0936デフォルトの名無しさん
NGNG0937デフォルトの名無しさん
NGNG浅はかかどうかをお前が決めてやらなくていいんだよ
自分の設計に同意を求めたくて余裕なくしてるのはお前だろ
0938デフォルトの名無しさん
NGNG0939デフォルトの名無しさん
NGNGMSVCの例だが。
ttp://www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/
0940デフォルトの名無しさん
NGNG明らかに継承の方が劣ってたじゃん。
>自分の設計に同意を求めたくて余裕なくしてるのはお前だろ
この一文がどっから出てきたのかわからないけど、そっくりそのままお返しします。ノシ
0941デフォルトの名無しさん
NGNG0942デフォルトの名無しさん
NGNG>この一文がどっから出てきたのかわからないけど
じゃ、何を必死になってるんだよ
0943デフォルトの名無しさん
NGNG必死なのはお前だw
なんだよ >>926は
文面が必死すぎ、余裕無さ過ぎ
0944デフォルトの名無しさん
NGNG必死になっているのはあなた一人に見えます。
あなたが「必死だな」と判断したのはどのレスですか?
レス番で教えてください。できれば理由も添えてください。
0945デフォルトの名無しさん
NGNG0946デフォルトの名無しさん
NGNG0947デフォルトの名無しさん
NGNG0948デフォルトの名無しさん
NGNG工数が増えたりするのはアフォらしいってのは、
みんな賛成してくれるだろ?な?駄目?
0949デフォルトの名無しさん
NGNG0951デフォルトの名無しさん
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を超えています。これ以上書き込みはできません。