C++相談室 part17
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
NGNGただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。
過去スレ、関連スレ、関連リンクなどはこちら>>2-15
0153デフォルトの名無しさん
NGNGスレ違いだから来ただけだろ。失せろボケ
0154デフォルトの名無しさん
NGNGunion
{
struct
{
float x;
float y;
float z;
};
float v[3];
};
とりあえず、死ね。
処理系依存互換性皆無
0155デフォルトの名無しさん
NGNGあの、151の通りであってるんですが。共用体が構造体に入ってるんです。
もう少し勉強してくらさい。
0156デフォルトの名無しさん
NGNG0157デフォルトの名無しさん
NGNGコンストラクタの初期設定子
ようは、構築時にメンバの初期設定してるだけ。
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おまえら見当違いもいいとこだな
0159デフォルトの名無しさん
NGNG0160デフォルトの名無しさん
NGNGCEOのAndre LaMothe氏がOpenGLのパーティクルシステム用に書いたコードの一部なんですが、
この人のコードはとってもワイルドな感じです。
0161デフォルトの名無しさん
NGNG0162デフォルトの名無しさん
NGNG0163デフォルトの名無しさん
NGNG必然的にその構文に頼らざるを得ないな。
0164デフォルトの名無しさん
NGNGクラスがあるとして、やっぱりメンバメソッドの頭で
エラーコードのメンバ変数を初期化する
処理を入れてあげるのって普通?
もっと格好いいやり方ですかね?
ようするに、エラーコードを持ったクラスの設計で
もっといいやり方ないでつかね?
0165デフォルトの名無しさん
NGNG0166デフォルトの名無しさん
NGNGもうちょっと知恵をわけてくれたっていいじゃんよ。
例外じゃないよな?って思うときだってあるじゃん。
エラーと例外って意味違うジャン。
0167デフォルトの名無しさん
NGNGここに質問したら、おまいが抱えてる問題を手取り足取り
解決してくれると思ってますか?
しかも質問内容に見合う回答内容もらってると思うが。
掲示板てのは基本的に情報収集&交換の場、
ヒントを得られれば上等と思ってくれたまい。
それが質問スレであっても、だ。
ヒントがあって考える、それすら出来ないヤツは(略
0168デフォルトの名無しさん
NGNG情報少なすぎ。あの情報量では、>>165 が妥当。
0169デフォルトの名無しさん
NGNGお前らの知識を試してみたんだが、この程度だったか。
0170デフォルトの名無しさん
NGNG0171デフォルトの名無しさん
NGNGそう、お前に対してはこの程度が妥当。
0172デフォルトの名無しさん
NGNGそのクラスの性質とかいろいろな状況考えないと一概に言えないと思うのよ。
んで、一般論を言えば165じゃねーのってことじゃん?春厨君。
0173デフォルトの名無しさん
NGNG0174デフォルトの名無しさん
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もういいから失せなよ。
0179デフォルトの名無しさん
NGNGどうせ、各々のメソッドが成功かどうかを返すんだろ ?
だったら、失敗した時だけエラーコードをセットすれば良いと思う。
(当然、メソッド成功時は GetErrorCode() の値は保証しないことをドキュメントに書いとく。)
0180176and166
NGNG0181デフォルトの名無しさん
NGNGそれだったら、その場で例外投げるとかエラーコード返すなりすればいいじゃん。
何もエラーコードを保存する必要はないような気がするが。
0183デフォルトの名無しさん
NGNG0184デフォルトの名無しさん
NGNG0185デフォルトの名無しさん
NGNGGetErrorCode内で初期化してしまう
0186デフォルトの名無しさん
NGNGそんな汚いプログラムは書くなよ。
0187176
NGNGもうちょっと足してみると
bool Method1( void )
{
m_ErrCode = 0; //←全てのメソッドの頭でこれを入れるのが
//なんか格好悪いような気がするんです
・
・
if( なんか失敗 ){
m_ErrCode = 失敗コード;
return false;
}
0188デフォルトの名無しさん
NGNG0189デフォルトの名無しさん
NGNG0190デフォルトの名無しさん
NGNGWindowsみたいにGetLastErrorとでもしておけば辻褄があうだろ
0191デフォルトの名無しさん
NGNG{
if( なんか失敗 ){
m_ErrCode = 失敗コード;
return false;
}
よし、これでどうだ
0192176
NGNGなるほど。そういう手もありかな?
>>181
戻り値をboolと書いてしまったのが
まずかったですね。
boolじゃなくてたとえばstringが戻り値だったとして
失敗して空のstringが返ったとき、なぜ空だったのか
GetErrorCode()で取得みたいな場合も。
0193176
NGNGあ、そっか。あったですね。
std::fstream strm( "Data.txt", std::ios::out | std::ios::in| std::ios::trunc );
if( strm.fail() == true )
fail()ってどうなってんだろ?後で見とこっと。
あれstd::ios::trunc ってどんな意味?
0194デフォルトの名無しさん
NGNGこういうのはマルチスレッドに弱かったりするからなぁ
戻り値はエラーコード専用として使い
引数でstringもらったら?
0195デフォルトの名無しさん
NGNGこの根底の仕方は駄目でしょ
0196176
NGNGあ。こか。
0197176
NGNGするのって、悲しいコードな気もするんですね。
0198デフォルトの名無しさん
NGNG0199デフォルトの名無しさん
NGNGCOMは規約としてそうなっている
重要なのは一貫性だと思う
0200Addicted to C++ ◆CPP8mJMMbA
NGNG{
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;
}
};
0201176
NGNGCOMなってるね。
見えた。一貫性だね。
一貫して全てのメソッドの頭に書いとけば
それはそれでいいね。
別のクラスでは例外投げ使ってたりとか
したらこのクラスは、やっぱよくないしね。
これも例外投げで統一するべきだしね。
catchでエラー取得って、使う側にしたら
スンゴイ使いズらい気がするんだよね…
0202デフォルトの名無しさん
NGNG{
if(!FAILED(p->foo()))
{
if(!FAILED(p->foo()))
{
}}}
こんなのよりマシだと思う、例外は
実際COMのエラーはVBとかJとかでは例外として送出されてた
0203176
NGNGMethod1の前にMethod2が失敗してたとしたら
Method1は常に失敗してしまうじゃん?
だからメソッドの頭にm_ErrCode=0が
必要だと思っちゃうわけですよ。
その頭に書いちゃうことは格好がいいか?ってこと。
話がもどっちまった。
0204Addicted to C++ ◆CPP8mJMMbA
NGNGハァ? マルチスレッド? んなInternational Standardに
ないもんは知らねーYO! ちなみに
if(strm.fail())
は、格好にこだわるならむしろ
if(!strm)
の方が格好がいいかと。
std::ios_base::out | std::ios_base::truncは
ファイルを切り詰めるんじゃなかったかな。
0205デフォルトの名無しさん
NGNGtrue が返るときは必ず m_ErrCode == 0 が保証されるんじゃない?
トリッキーだけど。俺は return m_ErrCode=0, true; と書きたい。
0206205
NGNG0207Addicted to C++ ◆CPP8mJMMbA
NGNGすまぬ、マルチスレッドなどと訳のわからぬことを書いた。
てっきりMethodをマルチスレッドで同時実行するのかと。
逝ってきます y=-( ゚д゚)・∵ ターン
とまではいかないまでも(w、
>Method1の前にMethod2が失敗してたとしたら
>Method1は常に失敗してしまうじゃん?
これはなぜに?そういうクラス仕様?そうでなければ
このコードは自動的に最新のエラーコードに更新されると
思うのだが。
0208デフォルトの名無しさん
NGNG別にマルチスレッドの話ではないと思う
>>203
同じクラスのメソッドが失敗したということは
その状態のまま他のメソッドを呼んではだめでしょ
0210176
NGNG200のコードは満たしてます。
問題ないでつ。
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デフォルトの名無しさん
NGNG0215デフォルトの名無しさん
NGNGうちの環境ではそんなコマンドないけど・・・
C-h k C-c C-v
C-c C-v is undefined
0216213
NGNGC-M-a C-p C-@ C-M-e M-w で C-y
って、マジレスキボン……
templateっぽいけど、さっぱりわからんかった
0217デフォルトの名無しさん
NGNGあのさ、何がしたいんだかわかんないよ。
class Test の微妙にそれぞれ違うバージョンを作りたいって事なんだろうけど、
どう微妙に違うのかわかんないと案の出しようが無いだろう。
0219デフォルトの名無しさん
NGNG…これってAPIスレの方が適切だったりしますか?
0220219
NGNG0221213
NGNG>>213のTestみたいに、好きな時に作れるけど同時に一つしか存在できない
クラスを、いくつか作りたいんです。なのでboostのはちょっと。
今は、すべてのクラスでTestみたいなのを個別に書いてるんですが、
もうちょいなんとかならんのかなと思いました。
Testには書けてませんが、デフォルトコンストラクタ以外のも使いたいです。
>>219
そうみたい。
0222デフォルトの名無しさん
NGNG{
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>{};
0224デフォルトの名無しさん
NGNGそれとも自作が基本ですか?
0225デフォルトの名無しさん
NGNGよくわからんが、ACE とかはどうだろう?
0226デフォルトの名無しさん
NGNG.NET風の薄いラッパを自作して使ってる。
0227デフォルトの名無しさん
NGNGどこか良い開設サイトをご存知ありませんか?
0228デフォルトの名無しさん
NGNGする時、オーバーロード関数はstdに入れちゃう?Koenig lookup
させる?そもそもオーバーロードなんてしない?
0229デフォルトの名無しさん
NGNG>> GetErrorCode()で取得
> こういうのはマルチスレッドに弱かったりするからなぁ
煽り ? 単なる無知 ?
エラーコードがスレッド毎に保存されることぐらい常識だと思うが...。
0230デフォルトの名無しさん
NGNGstd に入れるのは規格違反。
0231デフォルトの名無しさん
NGNG煽り? 周囲の文を読んでいるか?
クラスのメンバ変数だぞ?スレッド毎に保護されるわけ無いだろ…。
0233名無しさん
NGNG0234デフォルトの名無しさん
NGNG0235デフォルトの名無しさん
NGNG0236デフォルトの名無しさん
NGNGノ∩
⊂ ヽ ←>>233
/( 。Д。 )っ
U ∨ ∨
・@;∴‥
∧_∧ ∩ :: :.
( ・∀・)/ :: ::
(つ / :: :'
人⌒l ノ :: :: ガッ
し(_)
0237デフォルトの名無しさん
NGNGこれ、良いんじゃね?
0238名無しさん@Emacs
NGNGそれ何?説明読んだけどイマイチ分からんかった。
C++の文法を拡張した物のC++へのトランスレーターって事?
0239デフォルトの名無しさん
NGNG・fを呼び出す
・fのアドレスを取る
の2つだけである、ってのは正しいかな?
0240228
NGNGnamespace 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);
}
}
なんて絶対やりたくないんだけど。
やっぱりオーバーロードしようとするのが間違い?
0241230
NGNG俺は常に.cppの頭でusing namespace std;する人なので
それは考えたことがなかった。。。けど、そんな複雑にせんでも
template <class Iter> void foo(Iter s, Iter e) {
using std::swap;
Iter i1, i2;
...
swap(*i1, *i2);
}
だと何か問題あるのか?
0242デフォルトの名無しさん
NGNGすまん書き間違えた...
×: エラーコードがスレッド毎に保存されることぐらい常識だと思うが...。
○: (マルチスレッドを考慮に入れるなら) エラーコードをスレッド毎に保存することぐらい常識だと思うが...。
まさかやり方知らないとか ?
0243デフォルトの名無しさん
NGNGリフレクションが使えるC++
0244デフォルトの名無しさん
NGNGgccだとどうやるの?
0245デフォルトの名無しさん
NGNG0246228
NGNGそれだとmyns::swap()が見えない。
ちなみに単にswap()だけ、あるいはusing namespace stdだと、
*i1,*i2がprimitive型の時にstd::swap()が見えなくなる。
0247デフォルトの名無しさん
NGNGだからメンバ変数だっていってんだろ!!
オブジェクト一つずつにそんなことする気か?
>threadハンドルをキーにmapする。
これじゃ足りねーよ
0248デフォルトの名無しさん
NGNGスレッドは C++ の標準じゃねーから、単に gcc と書かれても困る。
0249デフォルトの名無しさん
NGNG0250デフォルトの名無しさん
NGNGJavaだったらスタティックイニシャライザでクラスに属するリソースの初期化処理をやりますよね。
でも、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デフォルトの名無しさん
NGNGpthread_mutex_t を、initするクラスでラップしといてから
template<class T>
inline CMutex& common_mutex_of() {
static CMutex mutex;
return mutex;
}
■ このスレッドは過去ログ倉庫に格納されています