C++相談室
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG0004デフォルトの名無しさん
NGNGどうしてですか?
0005デフォルトの名無しさん
NGNGそいつ、「ハッカー」じゃなくて「バッカー」じゃなかったですか?
もしかしたら、プロブラマかもしれません。
00064
NGNGCとC++は別のものだから一緒にしちゃだめだよ〜(笑
キミ、もっとべんきょうしたほうがいいよ
いまどきC/C++なんて書いてるようじゃだめだめだね。
ということだそうです。
「別だから」って意味不明です。
0007デフォルトの名無しさん
NGNG|どうしてですか?
ザーメンがたまってむしゃくしゃしていたんだよ。
そーゆーもんよ
0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG>いまどきC/C++なんて書いてるようじゃだめだめだね。
時代は関係無いぜ。
そいつだってC++でCのライブラリ使ってんだろ?
コンパイラはC/C++両用だろ?
違うなら「別」でいいけど、氏んで欲しいナ!>バッカー
>>8
Perlよく知らんのだけど、正規表現とか?lexとかじゃダメ?
0010デフォルトの名無しさん
NGNGpublic:
class B {
public:
void Set(const A& a);
private:
int m_nCnt;
}
private:
int m_nNum;
};
で
void A::B::Set(const A& a)
{
m_nCnt = a.m_nNum;
}
がコンパイルエラーになります。
コンパイラは「A::m_nNumにアクセスできないよ」
といいます。
そういうものなのでしょうか?
001110
NGNG見づらくてごめんなさい。
0012>10
NGNGpublicにしちゃだめなの?
001310
NGNGpublicしてもいいんですが
せっかくクラスをネストさせてるのに
アクセスできないんじゃさみしぃなぁとおもったので。
イテレータっぽいの書いてたんですけど
イテレータって、どうしてもコンテナの内部にアクセスしなきゃ
ならなくて、
なるべく公開するもの少なくしようとしてクラス(この場合イテレータ)を
ネストさせたんですが、上のようなエラーが無常にも出てしまったんです。
ネストしたクラスの特権(特徴)ってあんまりないんですかね??
0014デフォルトの名無しさん
NGNG#define offsetof(s,m) (size_t)&(((s *)0)->m)
class A {
public:
class B {
public:
void Set();
private:
int m_nCnt;
} m_xB;
friend class B;
private:
int m_nNum;
};
void A::B::Set()
{
A* pThis = ((A*)((char*)this - offsetof(A, m_xB)));
m_nCnt = pThis->m_nNum;
}
001510
NGNGヌルポインタから->伸ばすあたりはドキドキものですね。。。
ところで
friend class B;
ならば、そこまでトリッキーにならなくてもいいんじゃないかと・・・
(というか、pThisがどこをアクセスしているのか良く分かりません・・・)
0016デフォルトの名無しさん
NGNG同じこと思いました。>>10のclass Aの中にfriend B;を加えれば全て解決です。
friend は誤解されることが多いのですが、これは安全のためにあるのですよ。
隠蔽度を高くするためにあるのです。
public な A::GetNum() const; を作るほうがはるかに危険だから、
firend を使うわけですよ。
0017デフォルトの名無しさん
NGNGメソッドをつけるのはためしました?
ネストしたクラスっていうのは書いたこと無いんでわからないんだけど
0018デフォルトの名無しさん
NGNG001910
NGNGfriendは安全のためなのですか。
そうだったのですか・・・了解です。
「friendは悪」と思っていたので
friend使わないで良い方法を探していたのですが
(それでネストしたクラスとか試してたんですが)、
friend使うことにします。
0021デフォルトの名無しさん
NGNG0022初心者
NGNGVC++6でDOS画面での実行結果がすぐに閉じてしまう。
あと、コマンドライン引数を打ち込むことができない。
よかったらおしえていただけますか。
0023>22
NGNGで設定できると思う。
0024>22
NGNG!ボタンなら閉じないと思う。
それか、main()の最後に、_getch()とでも書いておく。
0025初心者
NGNGほお。
>24
なるほど。
ずっとCの勉強はLSIC86でやってたんでなれてないです。
また疑問があったら質問しにきます。
ほんとにありがとうございました。
0026デフォルトの名無しさん
NGNGB();
~B();
AA* aa;
}
CLASS A:public AA{
A();
~A();
B b;
}
という二つのクラスがあったとき
b.aaにAのthisポインタを渡したいんですけど、
AのコンストラクタではthisはNULLでした。
thisはコンストラクタが動いた後からしか使えないんでしょうか?
0027デフォルトの名無しさん
NGNGそんなことは無い。
0028デフォルトの名無しさん
NGNGclass B
{
private:
AA *aa;
public:
B(AA &);
};
B::B(AA &a)
: aa(&a)
{
}
class A : public AA
{
private:
B b;
public:
A();
};
A::A()
: b(*this)
{
}
こういうことをしたいのでしょうか?
>>19
>「friendは悪」と思っていたので
>friend使わないで良い方法を探していたのですが
gotoと同じで、無闇に使うのは悪です。
friendを使わなくてもいいのに済むならそのほうがいいですし、
上手く使うにはある程度の技量が必要です。
しかしこの例の場合のように、明らかに friend を
使ったほうが安全な場合もあるため、
無闇に嫌うのもまた問題があるのです。
002926
NGNGごめんなさい
A::A()
: b(*this)
{
}
みたいなのがちょっと良くわかんないので勉強してきます。
簡単にいうと、
AAは既製のクラスなんですが、
一部機能がわかりにくいので使いやすくまとめたクラスがBなんですが
やっぱり機能を使うには
aa->〜〜()
みたいにAAクラスのポインタを使ってるんです(^^;
単に馬鹿なだけでしょうか(^^;
0030ひげ
NGNGこれをコンパイル実行してみてください。
この方法は「初期化」と呼ばれる方法です。
「代入」と同じ効果を生むのですが、厳密には異なります。
(たとえば、メンバフィールドが const 変数であった場合など)
詳しい議論は『Effective C++』の第12項を参照すると良いと思います。
// 実行結果
// 777
#include <iostream>
using namespace std;
class Test
{
public:
int number;
Test();
};
Test::Test() : number(777)
{
}
int main()
{
Test t;
cout << t.number << endl;
}
0031デフォルトの名無しさん
NGNGA::A():b(*this)は、
Aのメンバ変数bを、thisポインタが参照しているインスタンスの値
(つまり自分自身の値)を引数とするコンストラクタを起動して
初期化する、っていう意味だよん。
class BB{
private:
AA* aa;
public:
void hage(){aa->hoge();}
}
とやるのは、オブジェクト指向の委譲の考え方。別に変じゃないよ。
ただ、そもそもclass Aとclass Bが相互参照している必要があるの
かどうかをチェックしてある?
003226
NGNG申し訳ない、どあほうでした
単にクラスAが準備出来てないタイミングで
機能使おうとしてただけでした・・・・
鬱だ・・・・
>>30 >>31
たった今調べ終わったとこでした
解説ありがとうございました。
簡単に言うとMFCでCView(AAクラス)のスクロール関数を
外(Bクラス)にまとめただけです(^^;
AクラスがCViewの派生クラスで、いろいろと使いまわせないかなぁと(^^;
0033デフォルトの名無しさん
NGNG最近Javaしかやってないので、間違ってると思うが
一応FactoryMethodパターンをどうぞ。
詳しい人突っ込みよろしく。
class B{
public:
static const int TYPE_AA;
static const int TYPE_A;
private:
AA* aa;
setAA(AA* in){aa = in;}
B(){}
public:
B~(){delete aa;}
static B* create(int B){
B* instance = new B();
switch(B){
case TYPE_A:
instance.setAA(new A());
break;
case TYPE_AA:
instance.setAA(new AA());
break;
}
return instance;
}
}
//static変数初期化
static const int B::AA=0;
static const int B::A=1;
使用法
B* bAA=B::create(B::AA);//AAのインスタンスをBに持たせたいとき
B* bA=B::create(B::A); //AのインスタンスをBに持たせたいとき
0034デフォルトの名無しさん
NGNG//static変数初期化
static const int B::TYPE_AA=0;
static const int B::TYPE_A=1;
使用法
B* bAA=B::create(B::TYPE_AA);//AAのインスタンスをBに持たせたいとき
B* bA=B::create(B::TYPE_A); //AのインスタンスをBに持たせたいとき
0035質問の名無しさん
NGNG「operator T()の定義は避けよう」と有ったのですが
理由がよくわかりません。やっぱり、あいまさの問題が出てくるからでしょうか?
0036デフォルトの名無しさん
NGNGデフォルトコンストラクタのテンプレート(になるのでしょうか?)
なんか作ってどうするの?
0037デフォルトの名無しさん
NGNGいや、キャスト演算子だと思う。
避ける理由は良くわかんないですが、
僕は暗黙の型変換がどうも好きになれないので書かないようにしてます。
(明らかに便利&安全そうなものには書いちゃいますけど)
引数が1つだけのコンストラクタにはexplicit付けてます。
0038ミトコンドリ子
NGNG36のいうとおり、キャスト演算子ね。
避ける理由は
「More Effective C++」,Scott Meyers,安村 通晃 他訳,アジソン・ウェストレイ,1998
ISBN4-7561-1853-4
項目5:ユーザ定義の変換関数に気をつける
を参照してちょうだい。
ちょう要約すると「基本的な問題は、このような関数がしばしばあなたが望みもしなければ
期待もしないようなときに呼ばれてしまうことにある。結果は正しくなくなることもあれば、
診断が気の狂うほど難しくなるような、直感的でないプログラムの振る舞いに
なることもある。」
0039デフォルトの名無しさん
NGNGwofstream に wchar_tで出力しても、ofstreamにcharで出力しても
結果がまったく変わりません。バイナリモードでファイルを開いても
だめです。例えば、L'A'を出力したときに、0x4100がファイルに
入っていればいいんですけど。
この厨房をお助けください。
0040デフォルトの名無しさん
NGNG環境はWindowsNT4でVC6です。ただ、質問がVC関係ではないので
ここを選ばせてもらいました。よろしくおねがいします。
0041名無しさん@@
NGNGうん、だから入出力時にマルチに変換してる。
ライブラリの問題以前に規格やフォントの問題もあるし。
linuxだとwctomb関数がマニュアルにある。
(マルチスレッド云々と状態の切り替えの話に注意して読んで)
0042デフォルトの名無しさん
NGNG0043デフォルトの名無しさん
NGNGDJGPPみたいに、DPMI上で動く様なのは除外してください。
つまり80186で動く様な物です。
テンプレートはでかくなるので無くても良いですが。
(すると、ライブラリの大半が使えない?)
「例外」程度は使いたいです。
0044デフォルトの名無しさん
NGNG0045デフォルトの名無しさん
NGNGBorland処理系は4以降からDPMI使ってるみたいなのでだめです。
0046デフォルトの名無しさん
NGNGTC++1.0
一番初期のヤツね。ディスク3枚組みのヤツ。
正真正銘16BitDOSでC++。
80186オプションもちゃんとあるぞ。
0047デフォルトの名無しさん
NGNG43の「ANSI C++に追従している」という意味は、多分
RTTIやnamespaceや例外やテンプレートのような後発の仕様、
および STLその他現在の標準C++ライブラリをサポートしている
という意味だと思うが....俺は知りません。
しかしテンプレート使うとモノがでかくなりがちであり
pureなDOS環境ではちと厳しいのでは。
0048デフォルトの名無しさん
NGNGのよく使う処理)って、どういう名前空間に置きますか?
アプリのメインのクラス内にpublicで置くと、そのクラスのインス
タンスをexternするか、子クラスにポインタを渡していかなければ
ならず、すっきりしません。
かといって大域に置くのも何かCくさくて嫌なのです。
0049デフォルトの名無しさん
NGNG0051デフォルトの名無しさん
NGNG>>50 Embedded C++ だね、それ。
RTTI を使っているやつは存在する。
オブジェクト指向初心者は多重継承を下手に使って失敗する。
オブジェクト指向中級者は多重継承を嫌って使わない。
オブジェクト指向上級者は多重継承を上手く使って楽をする。
ちなみに俺は中級者。
0052デフォルトの名無しさん
NGNGCWindowImpl<>::Create()
ってオーバーライドしても平気なのでしょうか?
オーバーライドする必要があるのですが、virtual宣言されていないので
どうなってしまうのでしょうか。
実際に使ってみたところ問題なく使用できているのですが、
正しいのか間違いなのか、教えてください。
0053デフォルトの名無しさん
NGNGvirtualをちゃんと勉強しよう。
ライブラリ的には問題ないと思う(信じたい)けど、
52の使い方次第。
virtual宣言すると、派生元のクラスのポインタで呼んでも、
派生クラスで生成してれば派生クラスのメンバ関数が呼ばれる。
(デストラクタだとちょっと違うが)
0054デフォルトの名無しさん
NGNG生成するたびにBS_OWNERDRAWを指定させるのもなんだかな、って思ったので、
CreateをオーバーライドしてBS_OWNERDRAWをしていしてから
CWindowImpl<>::Create()に渡しているのですが、
この場合問題なさそうですね。
>virtual宣言すると、派生元のクラスのポインタで呼んでも、
>派生クラスで生成してれば派生クラスのメンバ関数が呼ばれる。
これはわかっていましたが、オーバーライドさせるときは無条件で
virtualと思ってたので、質問しました。
やっぱりプログラミング言語C++買うべきですね。
あれってCと違ってべらぼうに高いんですが(^^;
0055デフォルトの名無しさん
NGNG分厚くてでかいのがきつい。
持ち運び不便。
005655
NGNGなくな→なく
0057デフォルトの名無しさん
NGNGJavaを覚えてからは、C++で多重継承するときは必ず片側は
完全抽象クラスのみにするようになった。
関数実装の多重継承は禁止。これで安心。僕って上級者???
005843
NGNGちなみに例外は使えない様です。4.0からかな?
ついでですが、RTTIや名前空間とかは使わないです。>47
#C++はもっとCみたいにコンパクトな言語にならないですかね。
005943
NGNGCでOO風に書く利点としては、Cさえ動けばどんな環境でも使える事ぐらいですが、こういう事やってる(やってた)人います?
不便な点は、Cではinlineキーワードが標準で使えないから、アクセサの効率を上げる為に、処理系毎に__inlineだの、static __inline__だのをマクロ定義しなきゃいけないとか、色々面倒が多いですが。
それと、他人にソースを渡す場合は困りますね。
いちいち書き方の説明する様な事をしなくちゃいけないんで。
そういう時はC++でラップして渡しています。(二度手間ですが)
0060デフォルトの名無しさん
NGNG0061名無しさん@Emacs
NGNG例えば...
class B {
public:
B(A* a) { a->onCallBack(); }
};
class A {
public:
B* createB() { return new B(this); }
void onCallBack();
};
とかなってる場合,
B のインスタンスはいつ delete すればよいですか?
A::onCallBack() に B* を乗せて
void onCallBack(B* b) { delete b; }
とかするのはだめですよね.
つまり, callback 後は必要ないオブジェクトの破棄をいつ行うか?
ということなんですが, いい方法あるでしょうか?
0062デフォルトの名無しさん
NGNG多分CでOO風に書くって、1ファイル1クラスに見立てて、ファイルスコープ
のグローバル変数をインスタンス変数に見立てて、そのファイルの関数を
唯一のそのグローバル変数へのアクセス手段にするようにするとかだよね。
CでOO風に書いても、クラスとインスタンスの関係は実現できないので
ポリモルフィズムが表現できないと思うんだけど、其の辺は無視?
単なる概念モジュールの階層構造化を指してOOと呼んでるのでしょうか?
>60
ポリモーフィズムの意義を勉強せよ。
0063デフォルトの名無しさん
NGNGよう分からんが、Bのインスタンスはスマートポインタで
ラップして値で持ちまわるようにしたら?
006460
NGNGRTTIでポリモフィズムとなると、
typeid演算子を使って、実際のクラスを判別するんですか?
かえっておかしなことになるような。
なんか勘違いしてます?
006543
NGNGグローバル変数は一切使いません。
インスタンスはスタック、またはヒープに確保します。
シングルトンパターンの実装やリソースカウンタなどはstaticな変数を使いますが。
多態が必要な場合、typeid(実はenumやint)と関数のポインタテーブルを使って実装します。(かなり面倒ですが。)
0066ミトコンドリ子
NGNGRTTIはtypeidよりはdynamic_castでよく使うんじゃないかしら。
用途としては、抽象クラスのポインタ(参照)しかとれない場合(たとえば
抽象クラスのポインタのコンテナをイテレートするとき)に、なんらか
(派生クラスでしか定義されていないメンバを呼びたいとか)の理由で
ダウンキャストしなくちゃいけないときが一番多いかしら。
なるべく使いたくないけど、compositeパターンなんかを使うと
ある程度は使わざるをえなくなることが多いわ...
なるべくdynamic_castを使わずにすむように心がけながら設計
してるけどね。
0067ミトコンドリ子
NGNGまず所有関係に注意しながら設計を見直すのが最初だと思うわ。多くの場合は
きちんと考えれば、どのインスタンスをいつ破棄すれば良いかは明確にできると
思うけど。
それが難しい場合(スレッド間で受け渡しするインスタンスなど)は、63の言うとおり
何らかのスマートポインタを使うのがいいんじゃないかしら。
でもうまく使わないとバグの温床になるわよ。気をつけてね。
0068デフォルトの名無しさん
NGNG0069デフォルトの名無しさん
NGNGC++を知らない奴が、スマートポインタに関数内のローカル変数の
アドレス渡して、その後原因不明で落ちる!と大騒ぎするのを
多々目撃しております。
007060
NGNGRTTIってdynamic_castも含めるのね。dynamic_castなら使っていますので解かります。
てっきりRTTI=typeidで得るclass type_infoのことかと思い込んでいました。
親切な回答ありがとうございました。
では改めて質問。
typeid演算子、ならびにclass type_infoって何に使っていますか?
0071デフォルトの名無しさん
NGNG0072ミトコンドリ子
NGNGやりがちよね。
class Foo {
protected:
Foo();
public:
virtual ~Foo();
public:
static SmartPointer<Foo> create();
};
みたいにして、スマートポインタの使用を強制するようにしてるわ。
>>70
めったに使わないわ。おもにassertで使うわね。
派生クラスじゃなくて、ぜったい特定のクラスのインスタンスが
欲しいときとかに assert( typeid(*ptr)==typeid(Foo) );とか。
0073デフォルトの名無しさん
NGNGタイマーって言うんでしょうか?
そういったタイマーで、一般的に使われる関数を教えて下さい
0074SAGE
NGNG時間を計るなら clock かな?
0075デフォルトの名無しさん
NGNG0076デフォルトの名無しさん
NGNG007761
NGNGB を作るオブジェクトは最後まで死なないので
スマートポインタは使えなさそうな気がします.
なんか間違ってるかな.
>>67
設計見直しですか.
いや, そんな気はしてんだよなぁ.
もちっと考えてみます.
2人ともありがとっ
007873
NGNGありがと、74・75・76
0079age
NGNG{
public:
A();
private:
const int m_data[10];
};
で、class AのコンストラクタA::A()を書こうとして困ってしまいました。
A::m_data[10]の初期化はどのように書けば良いのでしょうか?
constにしているのは困っているところを強調するためなのでご了承ください。
メンバ配列の初期化ってムリなんですかね・・・
0080minima
NGNGconst を外して
A::A(){
for( int i=0; i<10; i++)
m_data[i] = i;
}
です。
・・・だと思います・・・自信なし・・・。
008180
NGNGやっぱし違うと思います。すいません。無視してください。
0082デフォルトの名無しさん
NGNGint i;
int * p = (int *)m_data;
for( i = 0; i < 10; i++ ) p[i] = 0;
}
こんなんど?
008379
NGNG質問のしかたがまずかったかもしれません。
やりたいこととしては
A::A()
: m_data(????)
{
//ここには書きたくないのです・・・
}
のように初期化列の中に配列の初期化を書きたいなぁと思ったのです。
普通のメンバ変数だったら
class B
{
public:
B() : m_data(0) {}
private:
const int m_data;
};
みたいに書けるのに、配列はどう書けばよいのやら・・・
どうあがいてもムリ??
0084デフォルトの名無しさん
NGNG008579
NGNGstd::vectorほどの柔軟性は必要なかったりしてるんです。
動的にメモリ確保されても困るので・・・
具体的には今3Dのプログラム組もうとしていて、
4次元ベクトルのクラスとか作ろうとしたとき
struct Vector
{
Vector(float x, float y, float z, float w);
float m_data[4];
};
てな具合にしたのですが
m_data[4]の初期化で困ってしまったということでした。
やっぱり配列はどうしようもないようですね。
あきらめて80,82さんのようにコンストラクタの{}中に書きます。
ありがとうございました。
0086デフォルトの名無しさん
NGNGもうすこし勉強しないとわからんかもしれんが。
0087デフォルトの名無しさん
NGNG素直にSTL使ってくれって思うぜー。
メモリは先に必要な分だけ確保しておけば問題ないぜー。
0088デフォルトの名無しさん
NGNG配列は初期化できないし…?
0089デフォルトの名無しさん
NGNG逆に言えば初期化列に記述できないものはそもそも初期化列
で初期化する必要がないという事。
つまり今回の例は「ここに書きたくない」なんてゴネてないで素直に
{}に書けつーことです。
0090デフォルトの名無しさん
NGNGチェックの厳しいSTLの実装ってどこかにない?
0091デフォルトの名無しさん
NGNGキミ、ちょっとズレてるよ。
0092デフォルトの名無しさん
NGNGってのはどういう場合なのん?
0093だめだこりゃ
NGNGデフォルトコンストラクタを持たないオブジェクト、
参照やconstオブジェクト、
効率のためデフォルトの初期化を行ないたくない場合とか
その他いろいろあるっしょ
0094わざわざすまんのお
NGNG0095デフォルトの名無しさん
NGNG0096デフォルトの名無しさん
NGNGstruct ta sub()
{
struct ta a;
return a;
}
は禁じ手ですが(autoのstructを返すため)
C++では
CString xxxxx()
という関数がいっぱいあるのはなぜでしょう?
C++ではクラスのリターン値は保証されるのですか?
0097デフォルトの名無しさん
NGNGC++でもauto領域のリターンは御法度だ
ソースはみたか?
CString xxxx()のなかでauto変数領域返してるか?
0098デフォルトの名無しさん
NGNG0099デフォルトの名無しさん
NGNG010098じゃないけど
NGNGそうよ。
AnyClass obj;
obj = anyFunc(なんかの引数);
とかで、anyFuncがAnyClassのautoオブジェクトをreturnしてたら、
1.AnyClass::AnyClass(const AnyClass&)でリターン用臨時オブジェクトが作られる。
2.AnyClass::operator=(const AnyClass&)で臨時オブジェクトがobjへコピーされる。
3.臨時オブジェクト消滅
てなことが舞台裏で行われるのです。
処理系の実装によっては、もちょっと最適化されるかも知れんけど。
0101100
NGNG御法度じゃなかったんじゃない?
struct ta* func() {
struct ta taObj;
return &ta
}
は、おもくそまずいけど。
■ このスレッドは過去ログ倉庫に格納されています