C++相談室 Part3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGC++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
STLport
http://www.stlport.org/
Boost C++ Libraries
http://www.boost.org/
0153デフォルトの名無しさん
NGNGない。オーバーライド「しなければならない」か「しなくてもいい」かの違いだけ。
0155151
NGNGくいちがってないでしょ。
>>153はちょっと言葉が足りないけど。
性格には、インスタンス化するならば「しなければならない」
つまり、オーバライドしなければ抽象クラスになる。
だよね?
0156デフォルトの名無しさん
NGNGこんなエラーでてしまいます
Base.h
class Base{
〜〜
};
Der1.h
class Der1 : public Base{
〜〜
};
Der2,h
class Der2.h : public Base{
〜〜
};
main.cpp
#include "Der1.h"
#inlucde "Der2.h"
Base.h(7) : error C2011: 'Base' : 'class' で示される型としてすでに
定義されています。
どうしたらいいでしょう?
0157デフォルトの名無しさん
NGNG#ifndef か #if !defined つかいなはれ。
0158デフォルトの名無しさん
NGNG#include "Base.h"
#include "Der1.h"
#inlucde "Der2.h"
でいいだろ。
だがそれ以前に、本当に継承しなきゃいかんのかと、聞きたい。
問いつめたい。
0159デフォルトの名無しさん
NGNGなんで?
0161デフォルトの名無しさん
NGNGこんな風に各ヘッダにおまじないしておけば、一度読み込まれたヘッダが
二度読み込まれることがなくなり、再定義errorを防げるんだよ〜。>>157
(INC_BASEとかの名称はお好きなものを)
Base.h
#ifndef INC_BASE
#define INC_BASE
class Base{
〜〜
};
#endif
0162デフォルトの名無しさん
NGNG0163デフォルトの名無しさん
NGNG適当な名前でインクルードガードをつけると、あとでハマルことがあるので注意ね。昔 "Types.h" と
"DLib/Types.h" が両方 _H_TYPES_ というインクルードガード使ってたことが(元々別のプロジェクト
から持ってきたファイルだから、仕方ないんだが)。
私はファイル名と GUID からインクルードガードの文字列を作るプログラムを書いて、使ってます。
0164デフォルトの名無しさん
NGNGK&R嫁。
K&R読んで理解スレ。
0165デフォルトの名無しさん
NGNGC++ スレで K&R 読め、というのは初めて見たが(w
0166デフォルトの名無しさん
NGNGマジデスカ?
0167163
NGNG164 が何を憤ってるのか良く分からんが(_H_TYPES_ なんてつけたの俺じゃないぞ) _ で始まる名前は
使わんほうが良いというのは正しい。ANSI C++ の規格書から抜粋ね。
17.4.3.1.2 Global names
1 Certain sets of names and function signatures are always reserved to the implementation:
- Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase
letter (2.11) is reserved to the implementation for any use.
- Each name that begins with an underscore is reserved to the implementation for use as a name in the
global namespace.
0168デフォルトの名無しさん
NGNG__はまるきりだめで
M_aとかも駄目なんですね。
テンプレート仮引数とかも分けたいと思うから
悩み増えます。本当はSGI風のまねたかった。
0169デフォルトの名無しさん
NGNG0170166
NGNGうわ、、、ちょっとビツクリ
_fooみたいなグローバルな名前はダメそうだと思っていたんだけど、
_Foo とか hoge__hoge みたいのはあらゆるところでダメ(であってる?)
ていうのは初耳・・・
で、これってマクロにも当てはまるの?
0171デフォルトの名無しさん
NGNG> で、これってマクロにも当てはまるの?
当てはまるでしょ。
たとえば cygwin だ <errno.h> に関数 __errno() の宣言が書いてあります。もし、ユーザが
#define __errno 1
なんてマクロを定義して <errno.h> を include すると、宣言部分でエラーになりますよね。
それに、標準ヘッダのコードガードとかち合う可能性もありますし。
0173デフォルトの名無しさん
NGNG勉強になりました
3つも方法を教えていただきありがとうございました
0174デフォルトの名無しさん
NGNGおまえは誰だ!?
0175デフォルトの名無しさん
NGNG126の亀さんと思われ
0176名無しサソ
NGNG外のクラスのメンバにアクセスしたいのですが、
class A{
int a
class B{
void b();
}
}
void A::B::b()
{
A::a = 2;
}
でb内でaにアクセスしようとしたら、
「スタティック メンバ関数内の不正なデータ メンバへの参照です」
と言われて、怒られてしまいます(コンパイラはVC6)。
この場合、A::aにアクセスする方法はあるんでしょうか?
0177名無しサソ
NGNG0178デフォルトの名無しさん
NGNGclass A
{
public:
static int a;
class B
{
public:
void b();
};
};
int A::a;
void A::B::b()
{
A::a =2;
};
0179補足178
NGNGたんにstaticメンバ定義方法が間違って板だけ。
0180178
NGNGstaticにしたくないのなら、たとえばこんな方法。
class A
{
public:
int a;
class B
{
public:
void b(A& arg);
};
};
void A::B::b(A& arg)
{
arg.a = 2;
};
0181デフォルトの名無しさん
NGNGA::A() : B(this) { }
ってやるの?
たしか、この位置でthis使っちゃいけないはずだけど
0182デフォルトの名無しさん
NGNGんー、どーもやりたいことが良くわかんないけど
クラスBは何のためにネストしてるの?
AはメンバとしてBを持ってないの?
0183181
NGNGただ、文法的に間違いだと思ったから突っ込んだだけ
0184デフォルトの名無しさん
NGNGまちがってないよ、コンパイルできたし。
>>180で定義されてる void A::B::b(A& arg)をコンストラクタと
勘違いしてない?
0185デフォルトの名無しさん
NGNGたとえばMain関数でAをインスタンス化してもBのインスタンスは
どこにもできない。別途作る必要がある。
だから>>176の意図をもっと聞かないと、どうしたいのか良く分からない。
0186エディタを作ってます
NGNGc=getch()のループでキー入力を取得しているのですが、
altとctrlとescが入ってきません。
こういった特殊なキーを入力するにはどういった関数を使えばいいのでしょうか?
コンソールなので、メッセージ処理以外の方法で教えて下さい。
0187デフォルトの名無しさん
NGNGこっちでやりましょう。
http://pc.2ch.net/test/read.cgi/tech/1003418249/
0188shige
NGNG0189login:Penguin
NGNG> JISのC++の規格ってないの?
あるよ。http://www.jsa.or.jpで買いな。一度見たければ赤坂へ行け。
>>145
> そのPDFとhttp://www.kuzbass.ru/docs/isocpp/
> の内容は異なるのでしょうか?
違う。そのURLのはfinal draftだから、最後の修正が反映されてない。
ISOの著作権が発生する直前の版。この版はPDF, PS, HTML, TEXTが揃っている。
0190189
NGNG0191名無しサソ
NGNG>185
スマソ。書き忘れです。
class A{
int a
class B{
void b();
}
B *b;
}
と言う感じで、Bのポインタを持たせて、Aのコンストラクタが
呼ばれた時点でnewしようとしています。クラスBは継承された
描画関数で、Aは物体です。で、Aを描画するために、Bで継承
してオーバーロードした関数内に、Aのメンバ変数が欲しいな、と・・・。
AはBと大きく違うし、複数のBみたいなクラスを持っているので、
描画クラスから継承したくはないと思っています。
初期化したときにクラスAのポインタをコンストラクタでクラスB
に突っ込む事で動作するようにはなりましたが、こんな汚い方法
以外で出来ない物かと。
0192デフォルトの名無しさん
NGNG外で定義したほうが、変な制約つかなくていいと思うのだが。
0193192
NGNGclass Picture
{
public:
int data[256];
};
class Canvas : class Graphics
{
public:
void Draw(Picture& p){/*pをCanvasに描画*/}
};
int main()
{
Canvas canvas1;
Canvas canvas2;
Picture pic;
canvas1.Draw(pic);
canvas2.Draw(pic);
return 0;
}
0194デフォルトの名無しさん
NGNG描画対象のオブジェクト
描画方法
それぞれ独立したクラス階層で管理して、最終的にまとめたい、と。それだとコンポジション使う
場面だと思うなぁ。
class AObject { /* */ };
class DrawImpl1 { /* */ };
class DrawImpl2 { /* */ };
struct ObjectInterface {
virtual void doSomeThing1() = 0;
virtual void doSomeThing2() = 0;
/* */
};
class A
: public ObjectInterface
{
AObject aobj_;
DrawImpl1 draw1_;
DrawImpl2 draw2_;
void doSomeThing1() {
draw1_.doSomeThing(aobj_);
}
void doSomeThing2() {
draw2_.doSomeThing(aobj_);
}
};
0195192
NGNG正 class Canvas : public Graphics
0197名無しサソ
NGNG仕様を使い切れてない物で・・・。
>192
>193
言われていることを見ると、外のクラスのメンバにアクセスできる
訳じゃないので、ネストは確かに間違いっぽいですね。
要は、そのmainで定義・処理されている部分を隠蔽したい(canvas
をpic内部に持ちたい)、と言う話なんですよ。となると、>194で
書かれている方法に切り替えた方が良さそうですね。
0198
NGNGって無害だったっけ?
即答で頼む。
0199sage
NGNG0201
NGNGメニューをつけたりできるようなクラスないですか?
0202
NGNG昼休みが終わっちゃう!!
0203名無しさん
NGNGなんすか、コレ
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNGcout << i++ << i++ << i++ << endl;
の動作の合理的な説明してください。
0206デフォルトの名無しさん
NGNGnewt
0207デフォルトの名無しさん
NGNGお?てっきり012って出力されるかと思ったんだけど
210って出力された。なんで?
0208無名λ式
NGNG(((cout.operator<<(i++)).operator<<(i++)).operator<<(i++)).operator<<(endl);
http://www.gotw.ca/gotw/055.htm
Objectをpost-incrementしたい、かつ、post-increment演算子を一つの定義で済ませたい。
0209デフォルトの名無しさん
NGNGそれで207のようになるのは不思議。
これは不定ってことだよね?
0210デフォルトの名無しさん
NGNG>>209
コンパイラによって結果が違うの?
ちなみに私はLinuxのGCCでコンパイルして試しました。
0211デフォルトの名無しさん
NGNG結合順序の問題だから、不定ってことは無いと思われ。
0212デフォルトの名無しさん
NGNG職業プログラマさん達には常識的な知識なのかな?
私はただいまC++勉強中なんで208を理解するには
時間がかかりそう。
0213デフォルトの名無しさん
NGNGそういうことですね。
式中の副作用(side effect)が実行される順序は、いくつかの場合を除いてほとんど不定と思ったほうがよい。
VC++だと、副作用が確定するシーケンスポイントはこんなふうに規定されてます。
http://www.microsoft.com/JAPAN/developer/library/vclang/_pluslang_c.2b2b_.sequence_points.htm
gccの場合の規定はどこに書いてあるかわかんなかった。
0215デフォルトの名無しさん
NGNG今度のプロジェクトでSTLの使用禁止令が出てしまった。
用意されてるのはイテレータも無い、出来の悪いlistとmapだけ。
vectorを使いたいと言ったら、代替クラスを作れだと。
STLportでいいじゃん・・・。
愚痴スマソ。
0216デフォルトの名無しさん
NGNG理由はなんなんだい?
0217デフォルトの名無しさん
NGNG不定というか、処理系依存というか。
いずれにしろ、そういうコードは書かない方が。
0218デフォルトの名無しさん
NGNGbbbbatttooのような文字列をb5a1t3o2のように文字種と連続回数で書き表すことによって
文字列の長さを圧縮する方法を連長圧縮という。
aからyまでの文字を1文字づつ入力として受け付け、zが入力されるまでこれを繰り返す。
連長圧縮を行って結果を出力せよ。
例:入力 a
a
u
出力 a2u1
やり方がぜんぜんわからないので、教えてください。
0219デフォルトの名無しさん
NGNGSTLのvectorのコードそのまま持ってきて「代替クラスです」って言い張るとか。
0220デフォルトの名無しさん
NGNGまず連長圧縮の内容を理解する
↓
(プログラムでやる代わりに)自分の頭でその処理をやるとき、どういう風にやるか考えて、紙に箇条書きする
↓
そのままプログラム化
↓
(゚д゚)ウマー
0221デフォルトの名無しさん
NGNGcharを使うんですよね?
0222215
NGNG既存のSTLのvectorを使いたいなら、
・信頼性を証明して
・性能を検証して
・是非使いたい理由を提示しろ
ということらしい。
auto_ptrならともかく、vectorだったら問題ないと思うんだけど・・・。
ちなみに会社はF系列です。ここはこんなんばっか。
驚くことに、stringの代替クラスまでありました。
素直にstring使えよ・・・。
0223デフォルトの名無しさん
NGNG既存のvectorの代わりに自分で作った代替クラスなら
信頼性があるんだ・・・・・・ふーん。へーぇ。
ぜひ使いたい理由:
「既にあるものを使わず同じ物を新しく作ると、無駄な時間がかかる。
無駄な時間がかかるということは、無駄な金(人件費)がかかる。
我々には無駄に浪費できるほど金が余っているのでしょうか?」
金が余ってるなら、それでいいです。別に異議はありません。
0224デフォルトの名無しさん
NGNGランレングス圧縮は簡単よ。
この前までちゃんとソースも提供したり、書き上げたりもしたけど、
これじゃ学生クンのためにはならないと気づき、ヒントのみにするヨ
ランレングス圧縮は、連続した文字列を記号と数で表現するものナノヨ。
例えば、aaaabbcだと、a4b2c1となるわけネ。
アルゴリズムは
1:n = 1
↓
2:文字を受け取る
↓
3:文字列(ファイル)の終端?
YES→goto 9 NO→goto 4
4:次のに取得される予定の文字は同じ文字か?
YES→goto 5 NO→goto 7
5:nをインクリメント
↓
6:goto 2
7:"入力された文字"'n'を出力
↓
8:goto 1
9:"入力された文字"'n'を出力
↓
10:end
ソラで書いたから間違ってるかもネ
0225224
NGNGランレングスヤッターヨ。あの頃はPC98でした・・・
鮪真似たりいろいろやったよ。
今じゃ一端のアウトローなゲームプログラマですわ(;´Д`)
ガンバレ学生タン!
0226名無しさん
NGNG列(A,B、C,・・・)を選択するには
どうしたらいいでしょうか?
普通にやるとA列のみに格納されます。
0227デフォルトの名無しさん
NGNGプラットフォームが書いてないけど、
特殊な環境向けならコンパイラちゃんとしてなくてもおかしくないし。
それでSTL使って問題が起きた時に、
「STLのバグなのでどうしようもありません」とか言われると困る。
0229デフォルトの名無しさん
NGNG標準じゃなくて、STLPort使用するようにすれば?
こっちは実績もあるから。
0231デフォルトの名無しさん
NGNGやっぱりランレングスのプログラムだけはうまくかけません。
大体わかったのですが、一度にすべての文字を出力する方法がわかりません。
たとえば、a3d2f1のようにできないのです。
この問題だけは終わらせないとマズイのでマジでヘルプです〜。
0232デフォルトの名無しさん
NGNG答えが知りたい?
0233デフォルトの名無しさん
NGNG224の方針でプログラムが書けたんだね?じゃああとは、
結果を逐一coutに出力せずに、適当なstrstreamに出力するように変更。
最後にその内容を一気にcoutに出す。てなかんじでオーケー。
0234ゲイ2
NGNGCreateFontIndirect(&lf)
LOGFONT lf;
の使い方教えてください。
0235デフォルトの名無しさん
NGNGMSDN読めばわかる。で、もし続けたいならこっちのスレで。
「Win32AP質問箱」
http://pc.2ch.net/test/read.cgi/tech/991576947/l50
0236デフォルトの名無しさん
NGNGを使って疑問に思ったのですが
何でこれでクラス配列に割り当てたメモリが全て解放されるのでしょうか?
それと、delete base
で、baseが派生型へのポインタの場合(実体は違うクラス)
問題が生じますか?
0237デフォルトの名無しさん
NGNG割り当てたアドレスの始端 & 割り当てたサイズ
が把握できていれば型は関係ないと思うが。C/C++では配列 = ポインタ
として扱うことができることから類推できないか? 配列といっても
JavaやC#なんかとは違う。
0238デフォルトの名無しさん
NGNG実装によると思うけど、メモリブロックのサイズを調べて、
その先頭から最後まで順にデストラクタを適用するだけじゃない?
VC++でアセンブリコード吐かせてみたらそうなってた。
baseのデストラクタがvirtualなら問題なし……だと思ったが。
0239デフォルトの名無しさん
NGNGまだ、私はメモリがどう扱われているかわかっていないようです
メモリブロックのサイズを調べるのは,コンパイラですよね
>割り当てたアドレスの始端 & 割り当てたサイズ
a[10]
だと、aがベースアドレスで
配列の添え字と型で、アクセスするアドレスを決定するのですよね?
だから、
delete a[10]
ならわかるのですが
delete [] a
というところが,納得いかないのです
例えば
del(A a){
delete [] a;
}
なんてのもありなわけです
0240デフォルトの名無しさん
NGNGコンパイラは変数の型を知ってます。
0241デフォルトの名無しさん
NGNG言語仕様です。
0242デフォルトの名無しさん
NGNG| メモリブロックのサイズを調べるのは,コンパイラですよね
よくある実装ではメモリブロック自身にサイズ情報が含まれており
delete[]が実行時にメモリサイズを調べている。
0243デフォルトの名無しさん
NGNG0244デフォルトの名無しさん
NGNGシステムコール使う以外ないでしょ
0245デフォルトの名無しさん
NGNGstd::listとstd::map を例外安全かつ中立な実装にできないかな?
型引数として渡されるクラスが例外安全・かつ中立であると
仮定しての話でよいです。
すでに、例外安全だったら素マン。出直してくる。
0246デフォルトの名無しさん
NGNGありがとう〜。
ネタでなくドキュソを承知で聞きます。システムコールってなあに?
0247デフォルトの名無しさん
NGNGへどうぞ
0248デフォルトの名無しさん
NGNG話についてけない厨房ですんません。
例外安全でない実装ってどのあたりか教えてー。
0249245
NGNG複数要素の挿入を除いては安全かつ中立であると、書いてあった。
というわけで、出直してきます
0250デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNG用語がわからん
■ このスレッドは過去ログ倉庫に格納されています