C++相談室 part34
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0855デフォルトの名無しさん
NGNG0856デフォルトの名無しさん
NGNGlocale対応バージョンがうまく書けない。
0857デフォルトの名無しさん
NGNG0858デフォルトの名無しさん
NGNG派生クラス作っときゃええやん
使えるクラスができたら売るとか・・・
0859デフォルトの名無しさん
NGNGそりゃ、localeのせいだろ。
0860デフォルトの名無しさん
NGNG純粋仮想関数の中身を実装しないとコンパイル時に関数がないと言われるのですがなんででしょう?
↓ソースはこんな感じです。
#include <time.h>
#include <iostream>
class DyingMessage{
virtual void say1() = 0;
virtual void say2() = 0;
protected:
~DyingMessage(){
( time(NULL) %2 ) ? say1() : say2();
}
};
class JiipanKeiji : public DyingMessage {
void say1(){ std::cout << "なんじゃこりゃー"; }
void say2(){ std::cout << "おらぁ死にたくないよ、死にたくない、死にたくないよ・"; }
};
class RAOU : public DyingMessage {
void say1(){ std::cout << "我が生が(略"; }
void say2(){ std::cout << "我が生涯に一片の悔いなし!ウオァァァアア!"; }
};
int main(void){
JiipanKeiji jk;
RAOU r;
}
0861デフォルトの名無しさん
NGNG~DyingMessage() が実行されるときには、ジーパンもラオウも既に死んでいる。
0862デフォルトの名無しさん
NGNGコンストラクタとデストラクタ内では、仮想関数が仮想になれない。
デストラクタを仮想にしてそこに書くしか。
0863デフォルトの名無しさん
NGNG内容的に古いらしいのですが、大丈夫なのでしょうか?
0864デフォルトの名無しさん
NGNGまじで
台詞はいてからじゃないと名シーンが台無しに・・・。
>>862
すみません、virtual抜けてましたね。
でもデストラクタにvirtualつけてもやはりコンパイル通らないっす
って仰っているのはデストラクタにvirtualつけろってことではない?
それで実験としてDyingMessageのsay1とsay2を
cout << "犯人はヤス"; と定義してみたらと、
ジーパンもラオウも「犯人はヤス」しか言わなくなりました。
な、なにゆえ?
0865デフォルトの名無しさん
NGNG処理の順番はこうなる。
DyingMessage()→RAOU()→ラオウの生涯→~RAOU()→~DyingMessage()
~RAOU()のタイミングでラオウは天に還ってしまう。
0866デフォルトの名無しさん
NGNG関数呼び出しは(virtualであっても)「そのクラス」として行われるよ。
DyingMessageクラスではsay1, say2の中身は存在しないから、
コンパイラのメッセージは正しい。
実行時にヌルポ(pure virtual function call)を出す実装もある。
細かい話をすると、デストラクタやコンストラクタが親クラス→子クラス
と渡るときに、vtblのポインタが書き換わる。
これ、Javaと逆だから、多言語を渡り歩く人は要注意ッス。
Java方式もまたそれで問題あるんだけどね・・・
0867860
NGNG中身(インスタンス)はRAOUだから、say1、2はラオウのものを呼んでくれてもいいのに( ´Д⊂ヽ
>>866
>細かい話をすると、デストラクタやコンストラクタが親クラス→子クラス
>と渡るときに、vtblのポインタが書き換わる。
まじですか。vtblのポインタが書き換わるんですか。
main関数内と ~DyingMessageでのジーパン、ラオウのインスタンスのメモリアドレスが一緒だったんで、
ジーパンとラオウのvtblのsay1、say2が呼び出されてうまくいくかと思ってたのですが納得です。
結局のところ、どうしよう。
~DyingMessage上でラオウのsay1が実行させたいのですが。なんか考えます。
ありがとうございました。
0868デフォルトの名無しさん
NGNG> ~DyingMessage上でラオウのsay1が実行させたい
そうはいってもそのときにはもうラオウは居ないから、
ラオウに追加したメンバは触れないぞ。
生きているうちに遺言を作っておいて DyingMessage に保持させるといいかもしれない。
0869デフォルトの名無しさん
NGNG~DyingMessageが実行される時には
「お前(ラオウ)はもう死んでいる」から
ラオウのメンバを無理矢理呼び出すのもダメだよ。
0870860
NGNGできれば、>>860のラオウやジーパンクラスのソースのようにsay1、say2のみを定義するだけで他は何も手を加えず、
後は親クラスのDyingMessageがsay1、say2を使って処理してくれるようなのが理想なんです。
できるだけ子クラスは記述しなければならないソースを減らしたいんです。
でも、確かにラオウは破棄されてしまうわけだから今回の場合は無理っぽいですね。
>生きているうちに遺言を作っておいて DyingMessage に保持させるといいかもしれない。
それはいいアイデアかもしれないっす。ありがとうございます。
0871デフォルトの名無しさん
NGNG0872デフォルトの名無しさん
NGNGstd::stringの派生クラスを作る奴は糞。
0873デフォルトの名無しさん
NGNG{
public: ~x() { std::cout << "x::dtor" << std::endl; }
};
main()
{
std::string* p=new x();
delete p;
}
実行結果
x::dtor
問題なし。
0874デフォルトの名無しさん
NGNG環境は?
0875デフォルトの名無しさん
NGNGお前が気にするのはそこなのか?
この場合問題なのはデフォルトコンストラクタしか使えんことだろ。
0876デフォルトの名無しさん
NGNG実行結果
0877デフォルトの名無しさん
NGNGOh! Me としたことが釣られてしまいましたNeー!
0878デフォルトの名無しさん
NGNG0879デフォルトの名無しさん
NGNG0880デフォルトの名無しさん
NGNG> std::stringの派生クラスを作る奴は糞。
まぁ、作るなとは言わんが、この場合は
tolower(std::string&);
toupper(std::string&);
っつーフリー関数にしておいた方が、何かと幸せになれる気がする。
0881デフォルトの名無しさん
NGNG0882デフォルトの名無しさん
NGNGstd::ifstream fin("somefile");
char str[1];
fin.getline( str, 256 ); // この結果勝手に256に拡張されるっぽい
などとできてしまうのですけどこれって仕様ですか?
0883デフォルトの名無しさん
NGNG未定義動作です。
0884デフォルトの名無しさん
NGNG拡張をしないまま暴力的に 256 byte 書き込んできてしまうだけ
道路の拡幅工事を立ち退き交渉も予告もせずにおっぱじめるようなもの
何が起きるのかは、おそらくご想像のとおり・・・
0885882
NGNG今度から気をつけます。ありがとうございました。
0886デフォルトの名無しさん
NGNGuppercase_traits作るんでもいーけどさ、
stringとの混用を前提とする場合、他にどーしよーもねーだろ
0887デフォルトの名無しさん
NGNG0888デフォルトの名無しさん
NGNGそのuppercase_traitsって、何してくれるの?
0889デフォルトの名無しさん
NGNG>>880
でいいやん。
なんで継承したがる?
つうか良く考えろよ。今から分かりやすく説明するからな。
お前は機能XXXを追加したくなった。
機能追加は継承だという浅はかな考えからstringから派生することにした。
class MyString : public std::string{
public:
void XXX();
/* 他のメソッドは略 */
};
こうしちゃったらさぁ、機能XXXを使うには
必ずMyStringクラスを構築する必要が出来るよな
MyString mystr=std_string_variable;
mystr.XXX();
これってかなーりムダだよな。
0890デフォルトの名無しさん
NGNGちっとも解りやすくないぞ。何が言いたいんだ?
アップキャスト後に追加メソッドを使うコンテキストでへ来ちまったら
ダウンキャストが必要になるのはどんな作りのクラスでも一緒やん。
継承を全面否定したいのなら、同意はしないが理解はできる。
0891デフォルトの名無しさん
NGNG馬鹿はスルーしろよ
0892デフォルトの名無しさん
NGNGvirtual じゃないんじゃね?
>>889はJava厨の釣りと見た。
0893デフォルトの名無しさん
NGNG0894デフォルトの名無しさん
NGNG0895デフォルトの名無しさん
NGNG↑
メソッド追加するだけなのにpublic継承してる所が釣り
0896デフォルトの名無しさん
NGNG機能追加つーたら継承そのものやんけ
なんで「異常」な手段に拘るんだよ
0897デフォルトの名無しさん
NGNG0898デフォルトの名無しさん
NGNG0899デフォルトの名無しさん
NGNG0900900ズサーーー!!!
NGNG∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | >>899
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
0901デフォルトの名無しさん
NGNG0902デフォルトの名無しさん
NGNG0903889
NGNGよし、じゃあXXXとか言わずにuppercaseで書いたるか。
struct MyString : public std::string{
void uppercase();
};
ほれ、出来た。これでMyStringの大文字化はラクショーさ。
ああだけど、std::stringを使ってる部分もあるんだった。
これも大文字化しないといけない。
継承で機能追加
MyString mystr=std_string_variable;
mystr.uppercase();
std_string_variable=mystr;
外部関数で機能追加
uppercase(std_string_variable);
これでどうやろう?
基本的に継承は仮想関数のオーバーライドのためか
protectedなメンバに触りたい時くらいにしか使うべきではない。
0904デフォルトの名無しさん
NGNG>MyString mystr=std_string_variable;
おまえ追加機能つかうちゅーてる時に予めアップキャストしとくんかい
アフォ言いな、比べ方の条件がちゃうやないけ!
0905デフォルトの名無しさん
NGNGJava厨っぽいな
継承悪
コンポジットサイコーみたいな
思考停止したデザパタ厨
0906889
NGNG?
じゃあstd_string_variableを大文字化するにはあんたならどうするん?
てかさっきから気になってたんやけど、アップキャストなんてしとらへんよ
アップやないし、そもそもキャストでもない
>>905
オレのことじゃないよな。俺は外部関数使えいうとるし
0907889
NGNGstd::stringを継承して、そのサブクラスにメンバ関数追加するのが一番だと思ってるんか?
0908デフォルトの名無しさん
NGNGああ、確かにstd_string_variableの定義を隠したままだねw
0909デフォルトの名無しさん
NGNG同じことじゃん、所詮はthisの渡し方
色んな書き方ができる中で今回はどれって選ぶだけ
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ポリシークラスでググる。
レス数が950を超えています。1000を超えると書き込みができなくなります。