トップページ⇒tech
1001コメント302KB

C++相談室 part34

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)vNGNG
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0669デフォルトの名無しさんNGNG
>>668
なにいってんの?
0670デフォルトの名無しさんNGNG
夏なんていらない
0671デフォルトの名無しさんNGNG
最近暑かったしね
0672デフォルトの名無しさんNGNG
熱雑音が強いな
0673デフォルトの名無しさんNGNG
>>661
神様、ありがとうございますぅ^_~
0674デフォルトの名無しさんNGNG
virturalを指定しない(メンバ)関数って(派生クラスのメンバ関数で)オーバーライドできないの?
テストコードを実装できるスキルがまだないので教えてください。
0675デフォルトの名無しさんNGNG
>>674
スキルがないんだったら今知らなくてもいいこと
答えは出来ません
非仮想関数の再定義が起こるようなら設計を見直すべき
0676デフォルトの名無しさんNGNG
>>675
ありがとうございます。
不安なら現時点ではvirtual指定しておいたほうが嬉しいことが多い、という理解で勉強を進めます。
0677デフォルトの名無しさんNGNG
>>676
という理解はお勧めしない。
virtual になれないメンバや virtual が効かない場面で
かえって深い混乱の原因になるからだ。

根を理解せずに使いたい人には C++ は向かない。ここを忘れるな。
0678デフォルトの名無しさんNGNG
>>676
そもそも、やたらと継承するな。てきとーに設計して、てきとーに継承するから
オーバーライドできるか否かで悩むことになる。
0679デフォルトの名無しさんNGNG
>>677 ・・・
0680デフォルトの名無しさんNGNG
>>678
オーバーライドされる可能性があるメンバ関数と、未来永劫絶対にオーバーライドされない
メンバ関数を見分ける方法があったら教えてください。状況に依存とかいうのはナシの方向で。
0681デフォルトの名無しさんNGNG
>>680 小学生は帰れ。
0682680NGNG
素朴でアホな疑問すぎてスルーされてる?
こういう疑問って無用なのかな・・・?
0683デフォルトの名無しさんNGNG
>>680
自分が今何を作っているのかを考えたら答えでるだろうが
0684680NGNG
場を見誤ったようです。すみません。無視して下さい。
0685デフォルトの名無しさんNGNG
>>681
いや、ご尤もな質問だぞ?
本気で聞くがまじめに考えたことあるか?? いや現在形で考えてるか?
0686デフォルトの名無しさんNGNG
>>680
糞言語なので、ありません。
0687デフォルトの名無しさんNGNG
>>685
>>683
0688デフォルトの名無しさんNGNG
>>685
死ねJava厨
0689デフォルトの名無しさんNGNG
このスレは末端のコーダが多いみたいだなw
設計なんか考えたこともない奴隷は気楽でいいよなw
0690デフォルトの名無しさんNGNG
>>688
何でそこで Java が出てくるんだよスカタン
0691デフォルトの名無しさんNGNG
>>629
http://pc5.2ch.net/test/read.cgi/tech/1077985164/27
昔の疑問↑が解決したっ!ありがとうございました!
0692デフォルトの名無しさんNGNG
>>691
dat落ちしているスレッドにリンクを貼っても見られないから、コピペしてくれ。
0693デフォルトの名無しさんNGNG
>>692
27 名前:デフォルトの名無しさん 投稿日: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
693の続き

(メッセージ)
エラー: 宣言シンタックスエラー
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
規格の 3.3.1 ってどこで見られる?
ググっても出てこねぇ…
0696デフォルトの名無しさんNGNG
>>691
過去ログ見たが、その書き込みから30分で>>629と同じ答えが出てないか?
0697デフォルトの名無しさんNGNG
>>695 ttp://www.kuzbass.ru/docs/isocpp/basic.html#basic.scope.pdecl
0698デフォルトの名無しさんNGNG
http://www.kuzbass.ru/docs/isocpp/basic.html#basic.scope.pdecl
0699デフォルトの名無しさんNGNG
>>697-698
サンクス!
0700691NGNG
あの時に解決したのはしたのだけれども、明確にどのようなときに
globalでどのようなときにinner classなのか、また規格のどこに
根拠があるかがはっきりしたということで。
0701デフォルトの名無しさんNGNG
Exceptional C++ はなんだったんだろう…
本一冊を通してコンパイラを通らない規格外のコードを載せてたことになるが
0702デフォルトの名無しさんNGNG
>>700
いや、はっきりしてただろ。

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デフォルトの名無しさんNGNG
例外だもん
0704デフォルトの名無しさんNGNG
下記要件を満たすスマートポインタの実装って無いですか?
・参照はリンクリストで管理(使用に付随するnewや埋め込みカウントが無い。)
・スマートポインタ間での自動アップキャスト可能
・明示指定時のみスマートポインタ間でダウンキャスト可能
・関数内定義クラスのポインタのハンドリング可能

なんか最後のが無理っぽい気もするんですが、どうなんでしょう?
0705デフォルトの名無しさんNGNG
newしないって?!
0706704NGNG
>>705
最初の条件は
http://boost.cppll.jp/HEAD/libs/smart_ptr/smarttests.htm
こういう意味でした。
0707デフォルトの名無しさんNGNG
Foo a(10);
Foo b = Foo(10);

bの場合は一時オブジェクトが作成されてコピーコンストラクタによって、
メンバがコピーされますよね。
効率面から言えばbは非効率でしょうが、
bのような初期化を積極的に利用する状況ってどんなものがあるんでしょうか?
0708デフォルトの名無しさんNGNG
>>707
テンポラリが作られる場合、コンパイラはそれを積極的に最適化出来る
RVO でググれ
0709デフォルトの名無しさんNGNG
RVO→More Effective C++の第20項

VC++について調べたい人は、
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デフォルトの名無しさんNGNG
あと、 T t( u ) を T t = u の代わりに使うのが普通。
T t = u は operator = ではなくコピーコンストラクタによるので混乱させやすいし。
0711デフォルトの名無しさんNGNG
RVOによる最適化を前提とすればaとbは効率面では変わらないって事ですよね。
あとは >>710 氏の言うように可読性の向上ってくらいなんでしょうか。
0712デフォルトの名無しさんNGNG
privateなメンバをヘッダに書くのってどうなんでしょう。
たとえば、WindowsでIShellFolderを抽象化したディレクトリクラスを作るとして、

class directory {
IShellFolder* sf;
public: ... };

とすると、このクラスのクライアントコードがIShellFolderに直接触れなくても、
このヘッダを使うソースではIShellFolderを含むヘッダをincludeしないとならなくなりますよね?

それを避けるための手段のひとつにpimplとかインターフェイスベースってのがあるんでしょうが、
手間も掛かるし、なんかどうも納得いかないんですよね。
0713デフォルトの名無しさんNGNG
>>712
インターフェースベースだと実装が変わってもクライアントの再コンパイルが必要ないな。
使うのは自分の中だけ。DLLなどで外部に公開しないんならメンバを含めてもいいと思うけど。
0714デフォルトの名無しさんNGNG
まあ、この場合みたいにポインタメンバだったら、先行宣言するだけで
実装の詳細が含まれるヘッダをincludeする必要はないけどね。
そしてその考え方の延長上にpimplがあったりする。
インターフェイスクラスはまたちょっと考え方が違うけど。

で、privateメンバも含めて実装の詳細をヘッダ(class定義)に書かなきゃいけないのは
C++の採った効率上の妥協だと思われる。
すぐわかる利点のひとつに「スタック上に生成出来る」点がある。
0715デフォルトの名無しさんNGNG
BCCでDirectXSDKを使いたいんですが、上手くいきません。
何が悪いのでしょうか?
ここのサイトを参考にして設定して 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"
0716691NGNG
>>702
あれっ、脳みそが解決前にタイムスリップしてた。回答してくれた人スマソ
0717デフォルトの名無しさんNGNG
BCCの「プロジェクト設定 - リンク」で
dxguid.lib dxerr9.lib d3d9.lib d3dx9.lib をリンクしる
0718715NGNG
>>717
BCCはBCCDeveloper(?)を使わずにコマンドラインでやっているので
プロジェクトの設定とかないんです。
どうしたらいいのでしょうか?
0719デフォルトの名無しさんNGNG
マニュアルを読んで調べてくれい
0720715NGNG
>>719
ありがとうございます!
なんとかできました!

通常のコンパイル時のコマンドの後に>>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
標準C++以外の環境依存はスレ違いだぞっと。

で、bcc32.cfgに-Lをつけてディレクトリを指定し、
#pragma comment(lib,)を書いたヘッダでも用意しときゃ
少しは楽になるんじゃないかな。
0722デフォルトの名無しさんNGNG
非テンプレート関数でコレクションクラスを返すときってどうするのがいいんでしょうか?
std::vector<int> func();
void func(std::vector<int>& collection);
の二通りがすぐに考え付くのですが、後者の場合funcの中でclear()するべきなのか、
それとも後ろに追記するべきなのか。
コメントに書けばいいというのはそのとおりなのですが、前者ならその辺迷わないので悩みます。

std::auto_ptr< std::vector<int> > func();
というのもアリなんでしょうが、あまり誉められた形じゃない気もするし・・・
0723デフォルトの名無しさんNGNG
>>722
後者にして、後ろに追記する機能を関数としておけば、
clear() すべきかどうかは使う側で選べる。
あとは適切な関数名を与えてコメントは不要にすればいい。
0724デフォルトの名無しさんNGNG
C++でファンクションポインタはどう定義しますか?
voidポインタは駄目みたい。
0725デフォルトの名無しさんNGNG
Cと同じ
メンバ関数なら::*
0726デフォルトの名無しさんNGNG
>>722
俺は必ずin、out、inout修飾子をつけてる。COMのパクリね。
outならコレクションは初期化される、inoutなら初期化されない。
void func(/*[out]*/std::vector<int>& collection);
0727デフォルトの名無しさんNGNG
コメントアウトするするより#define OUTとかの方が良くないか?
0728デフォルトの名無しさんNGNG
>>727
726 じゃないけど、COM 相互運用のコードでは interface の宣言のときに >>726 のような
コメントにするのがデファクトなので、それに則ってるわけです。
(要するに RPC の idl 風の記述にしてるわけ)。
0729726NGNG
>>728
しかし、>>726だと実際に宣言コメントアウトしたいとき
邪魔なんだよね。 >>727悪くなし。
0730デフォルトの名無しさんNGNG
別にそんなもんついてなくてもconstなしの参照/ポインタはout扱いでいいだろ。
0731デフォルトの名無しさんNGNG
>>730
[in, out] ってのもあるし。既存の何かを更新する関数とか。
0732デフォルトの名無しさんNGNG
サンクス>>725
Cの関数ポインタ調べて書いたら通ッタ
0733デフォルトの名無しさんNGNG
C++の文法を覚えたんですが、次に覚えるのはなんですか?
0734デフォルトの名無しさんNGNG
>>733
2chでの質問の仕方。
0735デフォルトの名無しさんNGNG
>>733
STLとMFC。

STLは必須だから。
MFCは学習意欲を維持するため。
0736デフォルトの名無しさんNGNG
自分で課題を見付けることを覚えたほうが将来的には良い
マジレス
0737デフォルトの名無しさんNGNG
>>733
決まったカリキュラムは無いから、好きにやってくください。
0738 ◆Z0vd5w812U NGNG
>>733
やる気を維持するために、見栄えがあるDirectXアプリ。MFC使って。
その後MFCを捨ててWin32で作る。
0739デフォルトの名無しさんNGNG
SWIGという環境を使うと、各種スクリプト言語からC++関数を呼べるようになると思うんですが
逆にC++ベースのプログラムから各種スクリプト言語を呼んでインタプリタ等で解析する、
そういうライブラリってありますでしょうか?
Tclという言語は出来るようですが、RubyやJavaScriptのようなOOPがいいんですが。
0740デフォルトの名無しさんNGNG
Luaは組み込める
0741 ◆Z0vd5w812U NGNG
>>739
system()。
CreateProcess()でもいいかもしれない。
0742デフォルトの名無しさんNGNG
Ruby含めていくらでもそういうものはある。
0743デフォルトの名無しさんNGNG
>>739
Windows だけでいいなら ActiveScript で JScript や VBScript とかが使える。
Netscape 由来の Spidermonkey (JavaScriptエンジン) も悪くない。
0744デフォルトの名無しさんNGNG
>>739
ActiveScriptRubyというものがあるそうです。これは関係ありませんかね?
http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/
0745デフォルトの名無しさんNGNG
>>743-744
それらです!!求めていたのは!
ありがとうございます!
0746デフォルトの名無しさんNGNG
スレ違いな質問によく丁寧に答えてやるな。
0747デフォルトの名無しさんNGNG
>>746
小学校の学級委員殿ですか?
0748デフォルトの名無しさんNGNG
開き直ってる奴がいるな
0749マイク ◆yrBrqfF1Ew NGNG
>>733
KDE使ってQt+OpenGLでいいだろ。
いささかあれだが。
0750デフォルトの名無しさん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
失礼>>752の名前間違えました。
正しくは「>>751からの続き」です。
0754デフォルトの名無しさんNGNG
>>753
C++ の最も奇妙な解析にはまっちゃってるな
0755デフォルトの名無しさんNGNG
なんか日本語だとむかつくな
0756デフォルトの名無しさんNGNG
>>751
スレの書き方・質問の仕方から察するに、プログラマに向いてない。
それが一番の問題。巻き添えを食うであろう同僚PGが気の毒。
0757デフォルトの名無しさんNGNG
>>755
なんだと
0758デフォルトの名無しさんNGNG
>>751
こりゃまた強引なネタで C++ の話題に戻しにかかってきたねぇ・・・
もしネタじゃないなら、ネタじゃありません、とか書いておいた方が良いよ。
0759751NGNG
>>754
そうなんですか?
なにがおかしいのでしょう。

>>758
C++の話題に戻すのが目的でもありませんし、ネタでもないのですが
なにがおかしいのか教えていただけませんか?

みなさんのレスから想像すると、何か変なこと聞いてます、俺?
0760デフォルトの名無しさんNGNG
SampleClass sclass();
これは関数宣言
0761デフォルトの名無しさんNGNG
>>756
この書き方は何が問題なの?
0762デフォルトの名無しさんNGNG
Exceptional C++ 項目42参照
0763デフォルトの名無しさんNGNG
>>756のような態度を取る奴の同僚PGの方が、オレは気の毒だと思うな。
0764デフォルトの名無しさんNGNG
省略時コンストラクタがないクラスで
operator new
std::get_temporary_buffer
どっち使うのが主流?
0765デフォルトの名無しさんNGNG
>>761
756 じゃないけど「・・・と思った」とか「納得いかない」っていうのは、
自分でアレコレ調べてみる動機としては結構だけれども、
単に「・・・と思ったけど違った。納得がいかない」っていう質問はちょっとアレだろ、
訊かれたほうも困るだろ、ということでは?

>>751-752
ちなみにエラーの意味はだいたいこんなところ。

(1) エラー
非集合体の型 'SampleClass ()()' として定義された 'sclass()' に対して
メンバ 'action' が要求されました。

(2) エラー
非集合体の型 'UserClass()(SampleClass (*)())' として定義された
''uc(SampleClass (*)())' に対してメンバ 'doAction' が要求されました。
0766751NGNG
レスしてくれたみなさんありがとうございます。

>>760
あ、言われてみればそうですね。
ということは>>753のいう奇妙な解析というのはこれのことだったのですね。
実引数の無い時は関数宣言と解釈されるから、そのときは特別扱いで
空の括弧はなし、と。

ということは(2)に関しても
UserClass uc(SampleClass());
SampleClass()という関数として解釈されてるということでしょうか?
しかし、次の行のuc.doAction()をコメントアウトするとコンパイル&実行
できます。ただし、SampleClass::SampleClass()は呼ばれていないようです。

こちらはどういうことなんでしょう。

>>762
(More) Effective C++なら持っているんですが、その本は持っていません。
明日大至急立ち読みしてきます。
0767デフォルトの名無しさんNGNG
>>766
UserClass uc(SampleClass());
これは 引数 void、関数値 SampleClass の関数へのポインタを引数に取る関数の宣言だ

(More) Effective C++ 持ってるのに分からないなんて終わってるなお前
0768デフォルトの名無しさんNGNG
>>766
uc っていう関数として認識されてる。この関数の型は UserClass()(SampleClass (*)())
SampleClass を返す引数無しの関数ポインタを引数とする、UserClass を返す関数。
型の記述を読めるようになった方が良いよ。
■ このスレッドは過去ログ倉庫に格納されています