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

C++相談室 part17

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

過去スレ、関連スレ、関連リンクなどはこちら>>2-15
0153デフォルトの名無しさんNGNG
>>152
スレ違いだから来ただけだろ。失せろボケ
0154デフォルトの名無しさんNGNG
まあいいや、可哀想なのでマジレス。

union
{
struct
{
float x;
float y;
float z;
};
float v[3];
};

とりあえず、死ね。
処理系依存互換性皆無
0155デフォルトの名無しさんNGNG
>>154
あの、151の通りであってるんですが。共用体が構造体に入ってるんです。
もう少し勉強してくらさい。
0156デフォルトの名無しさんNGNG
>>154 アホ
0157デフォルトの名無しさんNGNG
>>151
コンストラクタの初期設定子

ようは、構築時にメンバの初期設定してるだけ。

vector3_t v(1.0, 2.0, 3.0);
とされると、v.x = 1.0; v.y = 2.0; v.z = 3.0; となる。
vector3_t v1(v);
とされると、v1.x = 1.0; v1.y = 2.0; v1.z = 3.0; となる。
vector3_t v2();
とされると、v2.x = 0.0; v2.y = 0.0; v2.z = 0.0; となる。

俺も、極めてわかりにくい構文だと思う。

後、無名共用体、無名構造体は >>154 の言う通り処理系に依存する。
0158デフォルトの名無しさんNGNG
>>151-155
おまえら見当違いもいいとこだな
0159デフォルトの名無しさんNGNG
初期化子の事を聞きたいのかね
0160デフォルトの名無しさんNGNG
>>157
CEOのAndre LaMothe氏がOpenGLのパーティクルシステム用に書いたコードの一部なんですが、
この人のコードはとってもワイルドな感じです。
0161デフォルトの名無しさんNGNG
んで、こういう書き方をするメリットって?
0162デフォルトの名無しさんNGNG
構造体と配列のメモリレイアウトの互換性も規定されてない
0163デフォルトの名無しさんNGNG
メリットというか定数メンバやリファレンスメンバの初期化では
必然的にその構文に頼らざるを得ないな。
0164デフォルトの名無しさんNGNG
エラーコードを取得するメソッドがついてる
クラスがあるとして、やっぱりメンバメソッドの頭で
エラーコードのメンバ変数を初期化する
処理を入れてあげるのって普通?
もっと格好いいやり方ですかね?
ようするに、エラーコードを持ったクラスの設計で
もっといいやり方ないでつかね?
0165デフォルトの名無しさんNGNG
エラークラスを投げる
0166デフォルトの名無しさんNGNG
あんまし、簡単に済まさないでさ、
もうちょっと知恵をわけてくれたっていいじゃんよ。
例外じゃないよな?って思うときだってあるじゃん。
エラーと例外って意味違うジャン。
0167デフォルトの名無しさんNGNG
>>166
ここに質問したら、おまいが抱えてる問題を手取り足取り
解決してくれると思ってますか?
しかも質問内容に見合う回答内容もらってると思うが。

掲示板てのは基本的に情報収集&交換の場、
ヒントを得られれば上等と思ってくれたまい。
それが質問スレであっても、だ。
ヒントがあって考える、それすら出来ないヤツは(略
0168デフォルトの名無しさんNGNG
>>166
情報少なすぎ。あの情報量では、>>165 が妥当。
0169デフォルトの名無しさんNGNG
あ〜そうかよ。どうせわかんねーんだろ(プ
お前らの知識を試してみたんだが、この程度だったか。
0170デフォルトの名無しさんNGNG
文盲あるいはチョソは発言禁止
0171デフォルトの名無しさんNGNG
>>169
そう、お前に対してはこの程度が妥当。
0172デフォルトの名無しさんNGNG
てゆーかさ、それを考えるのがクラス設計だと思うわけで、
そのクラスの性質とかいろいろな状況考えないと一概に言えないと思うのよ。
んで、一般論を言えば165じゃねーのってことじゃん?春厨君。
0173デフォルトの名無しさんNGNG
エラークラスを投げるのが嫌ならグローバル変数にでもセットしてろすっとこどっこい
0174デフォルトの名無しさんNGNG
□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□■■□□□□□■□□□□□□□■■■■■■■■■■■■□□
□□■■□□□□□■■■■■■□□□□□□□□□□□□□■■□□
□■■□□■□□□■□□□□■□□□□□□□□□□□□■■□□□
□□■□■■□□■■■□□■■□□□□□□□□□□□■■□□□□
□□□■■□□■■□■■■■□□□□□□□□□□□■■□□□□□
□□■■□□□□□□□■■□□□□□□□□□□□■■□□□□□□
□□■□□□■□□□■■■■□□□□□□□□□□■□□□□□□□
□■■■■■■□□■■□□■■□□□□□□□□□■□□□□□□□
□□□□■□□□■■□□□□■■□□□□□□□□■□□□□□□□
□□■□■□■□□□□■■□□□□□□□□□□□■□□□□□□□
□□■□■□■□□□□□■■□□□□□□□□□□■□□□□□□□
□■■□■□■□□□□□□□□□□□□□□□□□■□□□□□□□
□■□□■□□□□■■■□□□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□■■■□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□□□■■□□□□□□■■■■□□□□□□□
0175デフォルトの名無しさんNGNG
□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□■■□□□□□■□□□□□□□■■■■■■■■■■■■□□
□□■■□□□□□■■■■■■□□□□□□□□□□□□□■■□□
□■■□□■□□□■□□□□■□□□□□□□□□□□□■■□□□
□□■□■■□□■■■□□■■□□□□□□□□□□□■■□□□□
□□□■■□□■■□■■■■□□□□□□□□□□□■■□□□□□
□□■■□□□□□□□■■□□□□□□□□□□□■■□□□□□□
□□■□□□■□□□■■■■□□□□□□□□□□■□□□□□□□
□■■■■■■□□■■□□■■□□□□□□□□□■□□□□□□□
□□□□■□□□■■□□□□■■□□□□□□□□■□□□□□□□
□□■□■□■□□□□■■□□□□□□□□□□□■□□□□□□□
□□■□■□■□□□□□■■□□□□□□□□□□■□□□□□□□
□■■□■□■□□□□□□□□□□□□□□□□□■□□□□□□□
□■□□■□□□□■■■□□□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□■■■□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□□□■■□□□□□□■■■■□□□□□□□ 
0176デフォルトの名無しさんNGNG
そか?ゴメンゴメン。

例えばこんな感じ。
class Hoge
{
private :
int m_ErrCode;
public :
Hoge() : m_ErrCode(0){}

bool Method1( void )
{
m_ErrCode = 0; //←全てのメソッドの頭でこれを入れるのが
             //なんか格好悪いような気がするんです
 ・
   ・
   ・
}
  ・
  ・
  ・
int GetErrorCode( void )
{
return m_ErrCode;
}
};

もっといいやり方とかパターンとか、ないかなと。
0177デフォルトの名無しさんNGNG
すっとこどっこいもここまでくるとすっとこどっこいが
可愛そうになるほどすっとこどっこいだな。
0178デフォルトの名無しさんNGNG
>>176
もういいから失せなよ。
0179デフォルトの名無しさんNGNG
>>176
どうせ、各々のメソッドが成功かどうかを返すんだろ ?
だったら、失敗した時だけエラーコードをセットすれば良いと思う。
(当然、メソッド成功時は GetErrorCode() の値は保証しないことをドキュメントに書いとく。)
0180176and166NGNG
169は私じゃないでつ。
0181デフォルトの名無しさんNGNG
>>178
それだったら、その場で例外投げるとかエラーコード返すなりすればいいじゃん。
何もエラーコードを保存する必要はないような気がするが。
0182181NGNG
ごめんごめん >>176 ね
0183デフォルトの名無しさんNGNG
俺は別に格好悪いとは思わないけど。何がいけないんだろう。
0184デフォルトの名無しさんNGNG
int GetErrorCode(void){return m_ErrCode=NO_ERROR;}
0185デフォルトの名無しさんNGNG
エラーコードが揮発性でいいなら、
GetErrorCode内で初期化してしまう
0186デフォルトの名無しさんNGNG
>>185
そんな汚いプログラムは書くなよ。
0187176NGNG
初期化とかはべつに問題じゃなくてね。
もうちょっと足してみると

bool Method1( void )
{
m_ErrCode = 0; //←全てのメソッドの頭でこれを入れるのが
             //なんか格好悪いような気がするんです
 ・
 ・
if( なんか失敗 ){
m_ErrCode = 失敗コード;
return false;
}

0188デフォルトの名無しさんNGNG
iostreamの設計を見なされ
0189デフォルトの名無しさんNGNG
エラーコードを返したら駄目なのですか?
0190デフォルトの名無しさんNGNG
格好悪いなら取れば?
WindowsみたいにGetLastErrorとでもしておけば辻褄があうだろ
0191デフォルトの名無しさんNGNG
bool Method1( void )
{
if( なんか失敗 ){
m_ErrCode = 失敗コード;
return false;
}

よし、これでどうだ
0192176NGNG
>>179
なるほど。そういう手もありかな?

>>181

戻り値をboolと書いてしまったのが
まずかったですね。
boolじゃなくてたとえばstringが戻り値だったとして
失敗して空のstringが返ったとき、なぜ空だったのか
GetErrorCode()で取得みたいな場合も。
0193176NGNG
>>188
あ、そっか。あったですね。
std::fstream strm( "Data.txt", std::ios::out | std::ios::in| std::ios::trunc );
if( strm.fail() == true )
fail()ってどうなってんだろ?後で見とこっと。
あれstd::ios::trunc ってどんな意味?
0194デフォルトの名無しさんNGNG
>GetErrorCode()で取得
こういうのはマルチスレッドに弱かったりするからなぁ

戻り値はエラーコード専用として使い
引数でstringもらったら?
0195デフォルトの名無しさんNGNG
if(strm.fail() == true)
この根底の仕方は駄目でしょ
0196176NGNG
if( strm.fail() )

あ。こか。
0197176NGNG
エラーコードを重要視したいがために引数返しに
するのって、悲しいコードな気もするんですね。
0198デフォルトの名無しさんNGNG
だったら例外で良いじゃん
0199デフォルトの名無しさんNGNG
>>197
COMは規約としてそうなっている
重要なのは一貫性だと思う
0200Addicted to C++ ◆CPP8mJMMbA NGNG
class Hoge
{
private :
 int m_ErrCode;
public :
 Hoge() : m_ErrCode(0){}
 bool Method1( void ){
  //処理
  if( なんか失敗 ){
   m_ErrCode = 失敗コード;
   return false;
  }
  //処理
  return !(m_ErrCode = 0);
 }
//…
 int GetErrorCode( void )
 {
  return m_ErrCode;
 }
};
0201176NGNG
>>199
COMなってるね。
見えた。一貫性だね。
一貫して全てのメソッドの頭に書いとけば
それはそれでいいね。
別のクラスでは例外投げ使ってたりとか
したらこのクラスは、やっぱよくないしね。
これも例外投げで統一するべきだしね。
catchでエラー取得って、使う側にしたら
スンゴイ使いズらい気がするんだよね…
0202デフォルトの名無しさんNGNG
if(!FAILED(p->foo()))
{
if(!FAILED(p->foo()))
{
if(!FAILED(p->foo()))
{
}}}
こんなのよりマシだと思う、例外は
実際COMのエラーはVBとかJとかでは例外として送出されてた
0203176NGNG
>>200
Method1の前にMethod2が失敗してたとしたら
Method1は常に失敗してしまうじゃん?
だからメソッドの頭にm_ErrCode=0が
必要だと思っちゃうわけですよ。
その頭に書いちゃうことは格好がいいか?ってこと。
話がもどっちまった。
0204Addicted to C++ ◆CPP8mJMMbA NGNG
>>176(196)
ハァ? マルチスレッド? んなInternational Standardに
ないもんは知らねーYO! ちなみに
if(strm.fail())
は、格好にこだわるならむしろ
if(!strm)
の方が格好がいいかと。
std::ios_base::out | std::ios_base::truncは
ファイルを切り詰めるんじゃなかったかな。
0205デフォルトの名無しさんNGNG
>>200のは m_ErrCode に 0 を代入してそれを否定してるんだから
true が返るときは必ず m_ErrCode == 0 が保証されるんじゃない?
トリッキーだけど。俺は return m_ErrCode=0, true; と書きたい。
0206205NGNG
すまそ、マルチスレッドの話であったか。
0207Addicted to C++ ◆CPP8mJMMbA NGNG
>>203
すまぬ、マルチスレッドなどと訳のわからぬことを書いた。
てっきりMethodをマルチスレッドで同時実行するのかと。
逝ってきます y=-( ゚д゚)・∵ ターン
とまではいかないまでも(w、

>Method1の前にMethod2が失敗してたとしたら
>Method1は常に失敗してしまうじゃん?
これはなぜに?そういうクラス仕様?そうでなければ
このコードは自動的に最新のエラーコードに更新されると
思うのだが。
0208デフォルトの名無しさんNGNG
>>206
別にマルチスレッドの話ではないと思う

>>203
同じクラスのメソッドが失敗したということは
その状態のまま他のメソッドを呼んではだめでしょ
0209206NGNG
あれそうなの?分からなくなってきた。そうでなければ>>200の
コードはどこが問題になるのだろう。
0210176NGNG
悪い。私が見間違えた。
200のコードは満たしてます。
問題ないでつ。
0211デフォルトの名無しさんNGNG
なぁ・・・俺・・・いまだに参照とポインタの使い分けに悩むんだ・・・
もう・・・ポインタ一本で行っていいかな・・・?
0212デフォルトの名無しさんNGNG
い
  い
   と
    も
0213デフォルトの名無しさんNGNG
下に書いたクラスみたいなのをいくつも作るときに、
楽ができるやり方ありませんか?
class Test
{
 Test ()
 {
  if (m_instance) throw Error ();
  m_instance = this;
 }
 ~Test () { m_instance = 0; }
 static Test* m_instance;
};
0214デフォルトの名無しさんNGNG
Ctl+C Ctl+V
0215デフォルトの名無しさんNGNG
>>214
うちの環境ではそんなコマンドないけど・・・
C-h k C-c C-v
C-c C-v is undefined
0216213NGNG
うちの環境では
C-M-a C-p C-@ C-M-e M-w で C-y

って、マジレスキボン……
templateっぽいけど、さっぱりわからんかった
0217デフォルトの名無しさんNGNG
>>216
あのさ、何がしたいんだかわかんないよ。
class Test の微妙にそれぞれ違うバージョンを作りたいって事なんだろうけど、
どう微妙に違うのかわかんないと案の出しようが無いだろう。
0218デフォルトの名無しさんNGNG
http://www.boost.org/libs/pool/doc/implementation/singleton.html
これか?
0219デフォルトの名無しさんNGNG
仮想キーコードとスキャンコードの違いを教えてください。

…これってAPIスレの方が適切だったりしますか?
0220219NGNG
ごめんなさい、スレ立てるまでもないと勘違いして誤爆しました
0221213NGNG
>>217-218
>>213のTestみたいに、好きな時に作れるけど同時に一つしか存在できない
クラスを、いくつか作りたいんです。なのでboostのはちょっと。

今は、すべてのクラスでTestみたいなのを個別に書いてるんですが、
もうちょいなんとかならんのかなと思いました。
Testには書けてませんが、デフォルトコンストラクタ以外のも使いたいです。

>>219
そうみたい。
0222デフォルトの名無しさんNGNG
template <class SubClass> class singleton
{
static SubClass *inst_;
public:
singleton()
{
if (inst_) throw Error();
inst_=static_cast<SubClass *>(this);
}
~singleton()
{ inst_=0; }
static SubClass &instance()
{ return *inst_; }
};
template <class SubClass>
SubClass *singleton<SubClass>::inst_=0;

//使い方
class Test : public singleton<Test>{};
0223213NGNG
>>222
動きました。ありがとうございます。
0224デフォルトの名無しさんNGNG
ソケットのクラスで何がよく使われてますか?
それとも自作が基本ですか?
0225デフォルトの名無しさんNGNG
>>224
よくわからんが、ACE とかはどうだろう?
0226デフォルトの名無しさんNGNG
>>224
.NET風の薄いラッパを自作して使ってる。
0227デフォルトの名無しさんNGNG
linuxのデバイスドライバを作るのにC++を使いたいのですがどうにもうまくいきません
どこか良い開設サイトをご存知ありませんか?

0228デフォルトの名無しさんNGNG
std::copyやstd::swapを、自分で定義した型でオーバーロード
する時、オーバーロード関数はstdに入れちゃう?Koenig lookup
させる?そもそもオーバーロードなんてしない?
0229デフォルトの名無しさんNGNG
>>194
>> GetErrorCode()で取得
> こういうのはマルチスレッドに弱かったりするからなぁ

煽り ? 単なる無知 ?
エラーコードがスレッド毎に保存されることぐらい常識だと思うが...。
0230デフォルトの名無しさんNGNG
>>228
std に入れるのは規格違反。
0231デフォルトの名無しさんNGNG
>>229
煽り? 周囲の文を読んでいるか?
クラスのメンバ変数だぞ?スレッド毎に保護されるわけ無いだろ…。
0232228NGNG
>>230
でも、Koenigでやるのも地獄だし、誰かがstd::を付けたら
結局ダメだし。
0233名無しさんNGNG
ぬるぬるだな。
0234デフォルトの名無しさんNGNG
だな
0235デフォルトの名無しさんNGNG
企画違反でも入れちゃうのだっ
0236デフォルトの名無しさんNGNG
 イヤ〜ン
             ノ∩
           ⊂   ヽ ←>>233
            /( 。Д。 )っ
            U ∨ ∨
         ・@;∴‥
   ∧_∧ ∩  :: :.
  ( ・∀・)/  :: ::
  (つ   /  :: :'
  人⌒l ノ  :: :: ガッ
  し(_)
0237デフォルトの名無しさんNGNG
http://sourceforge.net/projects/opencxx/
これ、良いんじゃね?
0238名無しさん@EmacsNGNG
>>237
それ何?説明読んだけどイマイチ分からんかった。
C++の文法を拡張した物のC++へのトランスレーターって事?
0239デフォルトの名無しさんNGNG
ある関数 f があるとき、この関数を使って出来ることは

・fを呼び出す
・fのアドレスを取る

の2つだけである、ってのは正しいかな?
0240228NGNG
stdに入れるのがイレギュラーなのは確かだけど、だからといって
namespace myns {
  class Class1 { ... };
  swap(Class1 &x, Class1 &y) throw();
  ...

  namespace junk {
    using std::swap;
  }
  template <class Iter> void foo(Iter s, Iter e) {
    using namespace junk;
    Iter i1, i2;
    ...
    swap(*i1, *i2);
  }
}
なんて絶対やりたくないんだけど。
やっぱりオーバーロードしようとするのが間違い?
0241230NGNG
>>240
俺は常に.cppの頭でusing namespace std;する人なので
それは考えたことがなかった。。。けど、そんな複雑にせんでも

template <class Iter> void foo(Iter s, Iter e) {
 using std::swap;
 Iter i1, i2;
 ...
 swap(*i1, *i2);
}

だと何か問題あるのか?
0242デフォルトの名無しさんNGNG
>>231
すまん書き間違えた...

×: エラーコードがスレッド毎に保存されることぐらい常識だと思うが...。
○: (マルチスレッドを考慮に入れるなら) エラーコードをスレッド毎に保存することぐらい常識だと思うが...。

まさかやり方知らないとか ?
0243デフォルトの名無しさんNGNG
>>238
リフレクションが使えるC++
0244デフォルトの名無しさんNGNG
> エラーコードをスレッド毎に保存することぐらい

gccだとどうやるの?
0245デフォルトの名無しさんNGNG
threadハンドルをキーにmapする。
0246228NGNG
>>241
それだとmyns::swap()が見えない。
ちなみに単にswap()だけ、あるいはusing namespace stdだと、
*i1,*i2がprimitive型の時にstd::swap()が見えなくなる。
0247デフォルトの名無しさんNGNG
>>242 >>245
だからメンバ変数だっていってんだろ!!
オブジェクト一つずつにそんなことする気か?

>threadハンドルをキーにmapする。
これじゃ足りねーよ
0248デフォルトの名無しさんNGNG
>>244
スレッドは C++ の標準じゃねーから、単に gcc と書かれても困る。
0249デフォルトの名無しさんNGNG
てかスレッドごとにインスタンス作れよ
0250デフォルトの名無しさんNGNG
あるクラスのstaticなメンバ関数で共通に使いたいmutexを初期化したいのです。
Javaだったらスタティックイニシャライザでクラスに属するリソースの初期化処理をやりますよね。
でも、C++では言語としてそのような機能はないみたい(あるのかも知れないが、私は知らない)。
そこで、以下のようにグローバル変数で初期化しているのですけど、

namespace _hoge {
pthread_mutex_t mutex;
class Initializer {
public:
Initializer(){
pthread_mutex_init(&mutex, NULL);
}
};
Initializer initializer;
};

なんかダサい気がします。もっとよい方法を識者の方に伺いたいです。
(ちなみに、mutexをクラスのメンバにしてPTHREAD_MUTEX_INITIALIZERで初期化すると
「インテグラルじゃない値を初期化しようとしてる」みたいな警告が出るのでもっとダサい)
0251デフォルトの名無しさんNGNG
コンストラクタ内で初期化しろ。
二回目以降はスキップ。
ダサいのがいやならカエレ!
0252デフォルトの名無しさんNGNG
>>250
pthread_mutex_t を、initするクラスでラップしといてから

template<class T>
inline CMutex& common_mutex_of() {
 static CMutex mutex;
 return mutex;
}
■ このスレッドは過去ログ倉庫に格納されています