C++相談室 part34
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0669デフォルトの名無しさん
NGNGなにいってんの?
0670デフォルトの名無しさん
NGNG0671デフォルトの名無しさん
NGNG0672デフォルトの名無しさん
NGNG0673デフォルトの名無しさん
NGNG神様、ありがとうございますぅ^_~
0674デフォルトの名無しさん
NGNGテストコードを実装できるスキルがまだないので教えてください。
0675デフォルトの名無しさん
NGNGスキルがないんだったら今知らなくてもいいこと
答えは出来ません
非仮想関数の再定義が起こるようなら設計を見直すべき
0676デフォルトの名無しさん
NGNGありがとうございます。
不安なら現時点ではvirtual指定しておいたほうが嬉しいことが多い、という理解で勉強を進めます。
0677デフォルトの名無しさん
NGNGという理解はお勧めしない。
virtual になれないメンバや virtual が効かない場面で
かえって深い混乱の原因になるからだ。
根を理解せずに使いたい人には C++ は向かない。ここを忘れるな。
0678デフォルトの名無しさん
NGNGそもそも、やたらと継承するな。てきとーに設計して、てきとーに継承するから
オーバーライドできるか否かで悩むことになる。
0679デフォルトの名無しさん
NGNG0680デフォルトの名無しさん
NGNGオーバーライドされる可能性があるメンバ関数と、未来永劫絶対にオーバーライドされない
メンバ関数を見分ける方法があったら教えてください。状況に依存とかいうのはナシの方向で。
0681デフォルトの名無しさん
NGNG0682680
NGNGこういう疑問って無用なのかな・・・?
0683デフォルトの名無しさん
NGNG自分が今何を作っているのかを考えたら答えでるだろうが
0684680
NGNG0685デフォルトの名無しさん
NGNGいや、ご尤もな質問だぞ?
本気で聞くがまじめに考えたことあるか?? いや現在形で考えてるか?
0686デフォルトの名無しさん
NGNG糞言語なので、ありません。
0687デフォルトの名無しさん
NGNG>>683
0688デフォルトの名無しさん
NGNG死ねJava厨
0689デフォルトの名無しさん
NGNG設計なんか考えたこともない奴隷は気楽でいいよなw
0690デフォルトの名無しさん
NGNG何でそこで Java が出てくるんだよスカタン
0691デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1077985164/27
昔の疑問↑が解決したっ!ありがとうございました!
0692デフォルトの名無しさん
NGNGdat落ちしているスレッドにリンクを貼っても見られないから、コピペしてくれ。
0693デフォルトの名無しさん
NGNG27 名前:デフォルトの名無しさん 投稿日:04/02/29 16:48
当方、以下のコードが通りません。どこが悪いかご指摘願います。
Metrowerks CodeWarrior 8.2 Pro for Winを使っております。
(hello.cpp)
class hoge
{
public:
hoge();
~hoge();
private:
struct impl* pimpl_;
};
struct hoge::impl{};
hoge::hoge() : pimpl_(new impl){}
hoge::~hoge(){delete pimpl_;}
int main()
{
hoge hage;
return 0;
}
0694デフォルトの名無しさん
NGNG(メッセージ)
エラー: 宣言シンタックスエラー
hello.cpp 行: 9 struct hoge::impl{};
エラー: 宣言シンタックスエラー
hello.cpp 行: 10 hoge::hoge() : pimpl_(new impl){}
警告: 不完全な struct/union/class 'impl' の使い方が不当です。
hello.cpp 行: 11 hoge::~hoge(){delete pimpl_;}
ちなみに
struct impl;
impl* pimpl_;
とあらかじめ宣言すれば通ります。
0695デフォルトの名無しさん
NGNGググっても出てこねぇ…
0696デフォルトの名無しさん
NGNG過去ログ見たが、その書き込みから30分で>>629と同じ答えが出てないか?
0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
NGNG0699デフォルトの名無しさん
NGNGサンクス!
0700691
NGNGglobalでどのようなときにinner classなのか、また規格のどこに
根拠があるかがはっきりしたということで。
0701デフォルトの名無しさん
NGNG本一冊を通してコンパイラを通らない規格外のコードを載せてたことになるが
0702デフォルトの名無しさん
NGNGいや、はっきりしてただろ。
28 名前:デフォルトの名無しさん[sage] 投稿日:04/02/29 17:16
>>27
'struct impl'の形はelaborated-type-specifierといって、でてくる文脈によって働きが微妙に異なる。
struct impl;
とかくと、そのスコープでimplが宣言され、
struct impl* pimpl_;
とかくと、「そのスコープを含む、最も内側の、非クラス、且つ、非関数宣言の」スコープ(この場合はグローバル名前空間)
でimplが宣言されたことになる。
詳しくは規格の3.3.1の5を参照すべし
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
0703デフォルトの名無しさん
NGNG0704デフォルトの名無しさん
NGNG・参照はリンクリストで管理(使用に付随するnewや埋め込みカウントが無い。)
・スマートポインタ間での自動アップキャスト可能
・明示指定時のみスマートポインタ間でダウンキャスト可能
・関数内定義クラスのポインタのハンドリング可能
なんか最後のが無理っぽい気もするんですが、どうなんでしょう?
0705デフォルトの名無しさん
NGNG0706704
NGNG最初の条件は
http://boost.cppll.jp/HEAD/libs/smart_ptr/smarttests.htm
こういう意味でした。
0707デフォルトの名無しさん
NGNGFoo b = Foo(10);
bの場合は一時オブジェクトが作成されてコピーコンストラクタによって、
メンバがコピーされますよね。
効率面から言えばbは非効率でしょうが、
bのような初期化を積極的に利用する状況ってどんなものがあるんでしょうか?
0708デフォルトの名無しさん
NGNGテンポラリが作られる場合、コンパイラはそれを積極的に最適化出来る
RVO でググれ
0709デフォルトの名無しさん
NGNGVC++について調べたい人は、
http://blogs.msdn.com/slippman/archive/2004/02/03/66739.aspx
g++のswitch
`-fno-elide-constructors'
The C++ standard allows an implementation to omit creating a
temporary which is only used to initialize another object of the
same type. Specifying this option disables that optimization, and
forces g++ to call the copy constructor in all cases.
規格的には、12.8.15。
0710デフォルトの名無しさん
NGNGT t = u は operator = ではなくコピーコンストラクタによるので混乱させやすいし。
0711デフォルトの名無しさん
NGNGあとは >>710 氏の言うように可読性の向上ってくらいなんでしょうか。
0712デフォルトの名無しさん
NGNGたとえば、WindowsでIShellFolderを抽象化したディレクトリクラスを作るとして、
class directory {
IShellFolder* sf;
public: ... };
とすると、このクラスのクライアントコードがIShellFolderに直接触れなくても、
このヘッダを使うソースではIShellFolderを含むヘッダをincludeしないとならなくなりますよね?
それを避けるための手段のひとつにpimplとかインターフェイスベースってのがあるんでしょうが、
手間も掛かるし、なんかどうも納得いかないんですよね。
0713デフォルトの名無しさん
NGNGインターフェースベースだと実装が変わってもクライアントの再コンパイルが必要ないな。
使うのは自分の中だけ。DLLなどで外部に公開しないんならメンバを含めてもいいと思うけど。
0714デフォルトの名無しさん
NGNG実装の詳細が含まれるヘッダをincludeする必要はないけどね。
そしてその考え方の延長上にpimplがあったりする。
インターフェイスクラスはまたちょっと考え方が違うけど。
で、privateメンバも含めて実装の詳細をヘッダ(class定義)に書かなきゃいけないのは
C++の採った効率上の妥協だと思われる。
すぐわかる利点のひとつに「スタック上に生成出来る」点がある。
0715デフォルトの名無しさん
NGNG何が悪いのでしょうか?
ここのサイトを参考にして設定して ttp://goldfly.ld.infoseek.co.jp/program/directx/bcc90b.html
ここのサイトの2Dの描画のサンプルを ttp://www.geocities.jp/toru_website/sample/index.html#dxg
コンパイルしようとしたのですが上手くいきません。
エラー・詳細です。 ttp://shiva.dip.jp/up/box/up0951.gif
◆bcc32.cfg
-I"c:\DXSDK\Include;c:\Borland\Bcc55\include"
-L"c:\DXSDK\Lib\BLib;c:\Borland\Bcc55\lib"
◆ilink.cfg
-L"c:\DXSDK\Lib\BLib;c:\Borland\Bcc55\lib"
0717デフォルトの名無しさん
NGNGdxguid.lib dxerr9.lib d3d9.lib d3dx9.lib をリンクしる
0718715
NGNGBCCはBCCDeveloper(?)を使わずにコマンドラインでやっているので
プロジェクトの設定とかないんです。
どうしたらいいのでしょうか?
0719デフォルトの名無しさん
NGNG0720715
NGNGありがとうございます!
なんとかできました!
通常のコンパイル時のコマンドの後に>>717のライブラリ名を並べて書いたらできました。
bcc32 -W -emain.exe main.cpp c:\dxsdk\blib\dxguid.lib c:\dxsdk\blib\dxerr9.lib c:\dxsdk\blib\d3d9.lib c:\dxsdk\blib\d3d9.lib
となってかなり長くなりましたが。
でもわざわざこれを書かなくてはならないということは、
bcc32.cfgやilink.cfgでDirectXのライブラリの設定した意味があるのでしょうか?
0721デフォルトの名無しさん
NGNGで、bcc32.cfgに-Lをつけてディレクトリを指定し、
#pragma comment(lib,)を書いたヘッダでも用意しときゃ
少しは楽になるんじゃないかな。
0722デフォルトの名無しさん
NGNGstd::vector<int> func();
void func(std::vector<int>& collection);
の二通りがすぐに考え付くのですが、後者の場合funcの中でclear()するべきなのか、
それとも後ろに追記するべきなのか。
コメントに書けばいいというのはそのとおりなのですが、前者ならその辺迷わないので悩みます。
std::auto_ptr< std::vector<int> > func();
というのもアリなんでしょうが、あまり誉められた形じゃない気もするし・・・
0723デフォルトの名無しさん
NGNG後者にして、後ろに追記する機能を関数としておけば、
clear() すべきかどうかは使う側で選べる。
あとは適切な関数名を与えてコメントは不要にすればいい。
0724デフォルトの名無しさん
NGNGvoidポインタは駄目みたい。
0725デフォルトの名無しさん
NGNGメンバ関数なら::*
0726デフォルトの名無しさん
NGNG俺は必ずin、out、inout修飾子をつけてる。COMのパクリね。
outならコレクションは初期化される、inoutなら初期化されない。
void func(/*[out]*/std::vector<int>& collection);
0727デフォルトの名無しさん
NGNG0728デフォルトの名無しさん
NGNG726 じゃないけど、COM 相互運用のコードでは interface の宣言のときに >>726 のような
コメントにするのがデファクトなので、それに則ってるわけです。
(要するに RPC の idl 風の記述にしてるわけ)。
0730デフォルトの名無しさん
NGNG0731デフォルトの名無しさん
NGNG[in, out] ってのもあるし。既存の何かを更新する関数とか。
0732デフォルトの名無しさん
NGNGCの関数ポインタ調べて書いたら通ッタ
0733デフォルトの名無しさん
NGNG0734デフォルトの名無しさん
NGNG2chでの質問の仕方。
0735デフォルトの名無しさん
NGNGSTLとMFC。
STLは必須だから。
MFCは学習意欲を維持するため。
0736デフォルトの名無しさん
NGNGマジレス
0737デフォルトの名無しさん
NGNG決まったカリキュラムは無いから、好きにやってくください。
0738 ◆Z0vd5w812U
NGNGやる気を維持するために、見栄えがあるDirectXアプリ。MFC使って。
その後MFCを捨ててWin32で作る。
0739デフォルトの名無しさん
NGNG逆にC++ベースのプログラムから各種スクリプト言語を呼んでインタプリタ等で解析する、
そういうライブラリってありますでしょうか?
Tclという言語は出来るようですが、RubyやJavaScriptのようなOOPがいいんですが。
0740デフォルトの名無しさん
NGNG0741 ◆Z0vd5w812U
NGNGsystem()。
CreateProcess()でもいいかもしれない。
0742デフォルトの名無しさん
NGNG0743デフォルトの名無しさん
NGNGWindows だけでいいなら ActiveScript で JScript や VBScript とかが使える。
Netscape 由来の Spidermonkey (JavaScriptエンジン) も悪くない。
0744デフォルトの名無しさん
NGNGActiveScriptRubyというものがあるそうです。これは関係ありませんかね?
http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/
0745デフォルトの名無しさん
NGNGそれらです!!求めていたのは!
ありがとうございます!
0746デフォルトの名無しさん
NGNG0747デフォルトの名無しさん
NGNG小学校の学級委員殿ですか?
0748デフォルトの名無しさん
NGNG0750デフォルトの名無しさん
NGNGそれこそC++の文法ぐらいしか質問の幅がなくなると思う。
それはそれで不便だと思うけど。
0751デフォルトの名無しさん
NGNG以下のコード(>>752)をコンパイルすると二つのエラーが出ます。
エラーの内容は下の通りです。
(1) エラー
request for member 'action' in 'sclass()', which is of
non-aggregate type 'SampleClass ()()'
(2) エラー
request for member 'doAction' in 'uc(SampleClass (*)())',
which is of non-aggregate type 'UserClass()(SampleClass (*)())'
この二つのエラーは同じ系統のものかと思いまして、一度に質問させて
いただきました。何かヒントか検索キーワードでも良いので、なぜ
これがエラーになるのか教えていただけないでしょうか。
特に(2)のエラーは納得できません。代替策はあるのでしょうか?
コンパイラ:g++ (GCC) 3.2.2 Red Hat Linux
0752>>750 からの続き
NGNG#include <string>
#include <iostream>
using namespace std;
class SampleClass
{
public:
SampleClass() {}
void action() {cout << "SampleClass::action" << endl;}
};
class UserClass
{
SampleClass sc;
public:
UserClass(SampleClass sc_) : sc(sc_) {}
void doAction() { sc.action(); }
};
int
main(int argc, char *argv[])
{
SampleClass sclass();
// SampleClass sclass; とすればエラーは出ないが、上記のように
// 宣言しても引数無しのコンストラクタが呼ばれると思ったのですが…
sclass.action(); // (1) エラー
UserClass uc(SampleClass());
uc.doAction(); // (2) エラー
}
----------------------------- コードここまで
0753デフォルトの名無しさん
NGNG正しくは「>>751からの続き」です。
0754デフォルトの名無しさん
NGNGC++ の最も奇妙な解析にはまっちゃってるな
0755デフォルトの名無しさん
NGNG0756デフォルトの名無しさん
NGNGスレの書き方・質問の仕方から察するに、プログラマに向いてない。
それが一番の問題。巻き添えを食うであろう同僚PGが気の毒。
0757デフォルトの名無しさん
NGNGなんだと
0758デフォルトの名無しさん
NGNGこりゃまた強引なネタで C++ の話題に戻しにかかってきたねぇ・・・
もしネタじゃないなら、ネタじゃありません、とか書いておいた方が良いよ。
0759751
NGNGそうなんですか?
なにがおかしいのでしょう。
>>758
C++の話題に戻すのが目的でもありませんし、ネタでもないのですが
なにがおかしいのか教えていただけませんか?
みなさんのレスから想像すると、何か変なこと聞いてます、俺?
0760デフォルトの名無しさん
NGNGこれは関数宣言
0761デフォルトの名無しさん
NGNGこの書き方は何が問題なの?
0762デフォルトの名無しさん
NGNG0763デフォルトの名無しさん
NGNG0764デフォルトの名無しさん
NGNGoperator new
std::get_temporary_buffer
どっち使うのが主流?
0765デフォルトの名無しさん
NGNG756 じゃないけど「・・・と思った」とか「納得いかない」っていうのは、
自分でアレコレ調べてみる動機としては結構だけれども、
単に「・・・と思ったけど違った。納得がいかない」っていう質問はちょっとアレだろ、
訊かれたほうも困るだろ、ということでは?
>>751-752
ちなみにエラーの意味はだいたいこんなところ。
(1) エラー
非集合体の型 'SampleClass ()()' として定義された 'sclass()' に対して
メンバ 'action' が要求されました。
(2) エラー
非集合体の型 'UserClass()(SampleClass (*)())' として定義された
''uc(SampleClass (*)())' に対してメンバ 'doAction' が要求されました。
0766751
NGNG>>760
あ、言われてみればそうですね。
ということは>>753のいう奇妙な解析というのはこれのことだったのですね。
実引数の無い時は関数宣言と解釈されるから、そのときは特別扱いで
空の括弧はなし、と。
ということは(2)に関しても
UserClass uc(SampleClass());
SampleClass()という関数として解釈されてるということでしょうか?
しかし、次の行のuc.doAction()をコメントアウトするとコンパイル&実行
できます。ただし、SampleClass::SampleClass()は呼ばれていないようです。
こちらはどういうことなんでしょう。
>>762
(More) Effective C++なら持っているんですが、その本は持っていません。
明日大至急立ち読みしてきます。
0767デフォルトの名無しさん
NGNGUserClass uc(SampleClass());
これは 引数 void、関数値 SampleClass の関数へのポインタを引数に取る関数の宣言だ
(More) Effective C++ 持ってるのに分からないなんて終わってるなお前
0768デフォルトの名無しさん
NGNGuc っていう関数として認識されてる。この関数の型は UserClass()(SampleClass (*)())
SampleClass を返す引数無しの関数ポインタを引数とする、UserClass を返す関数。
型の記述を読めるようになった方が良いよ。
■ このスレッドは過去ログ倉庫に格納されています