STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
ここまでテンプレ
12 :
sage :2011/07/17(日) 21:56:10.33
入力バッファの消去の仕方教えてください fflush(cin);ではできなかったので
>>12 標準ではないんじゃね?
リダイレクトされてどこに接続されているか分からないし
食っても食っても後から追加されてきて予想外の動作になるかも
だからVCは敢えて非標準の fflush(stdin) を付けたのだと思う
std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 正しいのかどうかは知らん。
15 :
デフォルトの名無しさん :2011/07/17(日) 22:33:35.34
cin.sync() とかのこと?
>>15 おおこんなメンバ関数があったんだ
ISO/IEC14882/2003を見てもstd::basic_streambufのメンバ関数としてしか
紹介されてないし、「プログラミング言語C++第3版」を見ると 入力に対するsync()は
いつも正しく終了するとは限らない。成功すると 0 を返し、ios_base::badbitをセットして
-1を返す。 とあるので、使い方には気を付けなければならないようだけど、一応
あるみたいだね
17 :
デフォルトの名無しさん :2011/07/18(月) 01:55:18.65
何の誤爆だよ
#define STATIC_ASSERT(expr) static_assert(expr, #expr) STATIC_ASSERT(std::is_same<int, int>::value); VC++2010ではstd::is_same<int, int>のカンマが、マクロ引数を区切るカンマと解釈されているようで警告C4002が出ます。 C4002の説明によると、多すぎるマクロ引数は無視されるらしく static_assert(std::is_same<int, "std::is_same<int"); と展開されているようで、意図通りになりません。 言語仕様的にこの動作は正しいのでしょうか?
正しい。
ファイルを分割して関数にstringの変数を渡そうとするとエラーを起こすんですけど、どうすればいいですか?
そのエラーを貼れよ
>>21 回答が得られるような質問のスキルを習得してから出直す。
>>22 >>23 すいません、プログラムは下のような感じです。
//main.cpp
#include <iostream>
#include <string>
#include "sub.h"
using namespace std;
int main()
{
string a = "aaaa";
bbb(string a);
return 0;
}
//sub.cpp
#include <iostream>
#include <string>
#include "sub.h"
using namespace std;
void bbb(string a)
{
cout << a << endl;
}
//sub.h
void bbb(string a);
これをvisual c++で「デバッグ無しで開始」しようとすると
1>c:\users\あなた\desktop\c++\abbb\bbb.h(2) : error C2065: 'string' : 定義されていない識別子です。
1>c:\users\あなた\desktop\c++\abbb\bbb.h(2) : error C2146: 構文エラー : ')' が、識別子 'a' の前に必要です。
1>c:\users\あなた\desktop\c++\abbb\bbb.h(2) : error C2182: 'bbb' : 'void' 型が不適切に使用されています。
1>c:\users\あなた\desktop\c++\abbb\bbb.h(2) : error C2059: 構文エラー : ')'
というようなエラーが出てしまいます
初歩的な所で躓いてるんだと思うのですけど原因が何なのか分からなくて
//sub.h #include <string> void bbb(std::string a);
>>25 できました!!
ありがとうございます!!
マジか! 提示されてないbbb.hのエラー貼るとか、俺には釣りにしか見えなかったよ。
やさしいC++という入門書的な本を読み終わって、全くc++について知らないというところからは抜け出せたかと思います 入門書の次に読むべき本としては何が宜しいでしょうか?
29 :
デフォルトの名無しさん :2011/07/18(月) 22:42:00.75
禿本
次はやさしくない入門書を読みなおすこと
A*探索って、ダイクストラのコストの小さいノードから確定して接続ノードを展開していってるのを、 現在の「コスト+ゴールまでの予想コスト」の小さいもの。に置き換えた版ってことであってる?
そうですね
>>27 提示されている・・・と思うよ
コードの下のほう。
//sub.h
void bbb(string a);
>>33 それはsub.hだろ。
エラーメッセージにははっきりとbbb.hって出てるんだが?
少なくともそのソースをコンパイルしたエラーメッセージを貼ったのではない。
こういう粗忽さがつまらないコンパイルエラーの根本的な原因だから、ちゃんと指摘すべき。
>>31 そして予想コスト(heuristic functionの値)が外れ(矛盾発生)だった場合の付け替え処理も含まれています。
ありがとう、外れの場合も考えないといけないのか。 まぁ今回は外れることはないとして作るからいいや
enum E { a, b, c };でE::aとアクセスできないのはなんでなんだろ 別の名前空間でtypedef E E_t; したらE_t::aとできてすごく使えると思うんだけど もちろんC言語と互換性ないのはわかるけど・・・
>>37 わかってるのに「なんでなんだろ」とか言う意味がわからない。
簡単に作れるからわざわざ言語でサポートしなくてもってことじゃね? class Hoge { public: enum Enum { a, b, c }; inline Hoge(Enum e) : e_(e) { } inline operator Enum (void) const { return e_; } private: Enum e_; }; int main(void) { Hoge hoge(Hoge::a); switch(hoge) { case Hoge::a: 〜; break; case Hoge::b: 〜; break; case Hoge::c: 〜; break; } return 0; }
じゃあ、そうなったらいいのにと捉えてくれ
>>39 クラスや構造体で包めばいいというのも分かってはいたんですが
すでにあるもの、何かしらのライブラリの名前空間にある列挙型を
自分の名前空間でtypedefして、
>>37 のように使えたらいいのにな、ってことでした
42 :
デフォルトの名無しさん :2011/07/19(火) 12:06:44.41
もともと #define a 0 #define b 1 #define c 2 を置き換えるためのものだからな 「強く型付けされた」列挙体が欲しければ 作りようはいくらでもあるし Cとの互換性を捨てたらC++の地位は大幅に後退する
禿がenum嫌いなせいだろ
Cから持ってきた型だからしょうがない。
enum Operation { Operation_Add, Operation_Subtract, Operation_Multiply, Operation_Divide, Operation_Assign, ... }; Operatioin op = Operation_Divide;
あぁ、typedefを使いたいのか
>>46 は無視してくれ
std::string _status[2] = {_T("正常"), _T("毒")}; ヘッダーファイルに書いたらエラーになるんだけどどう書くべきですか?
std::string _status[]; じゃねーの?
extern std::string _status[];
const std::string status[]=...;
>>48 ヘッダーでは定義じゃなくて宣言で済ませて、対応するソースファイルで定義する。
ついでに const 付けて、変数名の先頭アンダースコアは外しとけ。
const 付けてヘッダで宣言するには明示的な extern が要るから気をつけて。
>>235 内モンゴルを荒廃させたのは中共だろ、
日本のせいにするなよチャソコロ!
お、おう・・・
56 :
48 :2011/07/19(火) 15:32:18.82
はい。CPPで初期化します。ありがとう
細かいことですが、教えてください。 Hoge クラスのメンバ変数 n をFoo クラスのコンストラクタの初期化子リストで 初期化したいのですが、このような継承関係がある場合は、どのように書いたらいいのでしょうか?初期化子リストで初期化できない場合は、どのようにしたらいいのですか? 合わせてお願いします。 class Hoge { public: virtual Hoge * clone () const = 0; protected: int n; }; class Foo : public Hoge { Foo * clone() const { return new Foo( *this ); } Foo() : n(0) // 当然これでは初期化できません・・・・orz { n; } };
変な日本語です。失礼しました訂正します × 初期化したいのですが、このような継承関係がある場合は、どのように書いたらいいのでしょうか?初期化子リストで初期化できない場合は、どのようにしたらいいのですか? ○ 初期化したいのですが、このような継承関係がある場合は、どのようにしたらいいのでしょうか? また、不可能な場合、他の手段でn を初期化する方法はあるのでしょうか。
それだとFoo() { n = 0; }しかないじゃん? 本来はHogeしか初期化できないんだから、Hogeを触っていいなら Hoge(int n = 0) : n(n) {} Foo() : Hoge(0) {}
>>59 thx です。そうですか、Foo() { n = 0; }オーソドックスな、コンストラクタ内で
初期化する方法ですね
質問ですが
Hoge(int n = 0) : n(n) {}
Foo() : Hoge(0) {}
これですと、Hoge()引数無しの、デフォルトコンストラクタが初期化されるのではなく
Hoge(int n)の如く、引数付きのコンストラクタが初期化されているように
見えるのですが、自分の勘違いでしょうか?
>>60 >>59 のはデフォルト値を設定してあるからHoge(0)は省略すればnは0で初期化されるし
任意の値を設定できるようにもなってる
つまりFoo() {}でもFoo() : Hoge() {}でもFoo() : Hoge(n) {}でもいける
もっとちゃんと書くとこうなるかな
Hoge() : n(0) {}
Hoge(int n) : n(n) {}
Foo() {} // Hoge()が呼ばれてHoge::nは0で初期化
Foo(int n) : Hoge(n) {} // Hoge::nをnで初期化
62 :
sage :2011/07/19(火) 23:23:19.62
class intArray2D{ public: IntArray2D(int size0,int size1): mArray(0), mSize0(size0), mSize1(size1){mArray=new int[size0*size1];} 上のクラス宣言内のコンストラクタについてなんですが:の意味がわからないので教えて ください
ごめん、初期化リストだった
継承不可のクラス作りたいんだけどconst class でできます? const class Hello { };
const classなんて構文はない VC++ならclass Hello sealedでいけるが非標準
オブジェクトをバイナリに変換・復元をしたいのですが、 以下のような形式で親クラス*に戻した場合、正しい実装クラスを指すことが できますか? class Abstract { virtual void hoge() = 0; }; class ImpA : public Abstract{ void hoge(){} }; class ImpA : public Abstract{ void hoge(){} }; class ImpA : public Abstract{ void hoge(){} }; enum AbstractType { A, B, C }; Abstract* restore(char* binary, AbstractType type) { if(type == A) { ImpA* pResult = (ImpA*)binary; return pResult; } if(type == B) { ImpB* pResult = (ImpB*)binary; return pResult; } if(type == C) { ImpC* pResult = (ImpC*)binary; return pResult; } return 0; }
68 :
67 :2011/07/20(水) 04:03:50.36
訂正: 誤 class ImpA : public Abstract{ void hoge(){} }; class ImpA : public Abstract{ void hoge(){} }; class ImpA : public Abstract{ void hoge(){} }; 正 class ImpA : public Abstract{ void hoge(){} }; class ImpB : public Abstract{ void hoge(){} }; class ImpC : public Abstract{ void hoge(){} };
binaryの中身次第
70 :
67 :2011/07/20(水) 04:26:01.68
例えばこれをソケット通信で送ったとして char* p = (char*)new ImpA(); AbstractType type = A; 受け取った側が復元したいのです。 Abstract* restore(p, type);
>>70 そんなことは無理
boost::serializationとか使え
STLportの質問はここでいい? ファイル名がstd::wstringで与えられてるんだが、 STLportのstd::ofstreamはwchar_tのファイル名を扱えないっぽい。 どうしてる? 変換するしかない?
bost::filesystem::pathに食わせてからstring()で取り出してる
STLPortは知らないんだけど、wofstreamとか無いの?
もうSTLportの時代じゃないだろ C++1Xが出てムーブコンストラクタを多用したSTLが出るまで待てないのか?
>>74 標準のfstreamが取るファイル名は常にchar*(実装依存)だよ。
boost::filesystem::fstreamならpath/wpathが使える。
77 :
sage :2011/07/20(水) 19:17:50.35
STLのmax()の意味教えてください
if(mox()) { alldead(); }
>>57 です
>>61 昨晩はどうもありがとうです
よくわかりました。
ところで、ふと疑問が湧きました、よろしくお願いします。
class Hoge
{
public:
virtual Hoge * clone () const = 0;
protected:
int n;
};
class Foo : public Hoge
{
public:
Foo * clone() const { return new Foo( *this ); }
void Delete() { delete this; }
~Foo()
{
Delete();
}
};
純仮想関数のインスタンスをヒープから削除する実装ですが、こんな感じでいいでしょうか?
それとも、参照カウンタを付けないとヤバイですか?
質問 基底クラスのインスタンスBと派生クラスのインスタンスCで、たとえばBのpublicなメンバ変数を Cにコピーしたい場合は、Cで=オペレータをオーバーロードしてやる以外に方法はある?
>>79 デストラクタからdelete this;を呼んでいる方がヤバイ。
参照カウンタを使うかどうかは使い方による。
>>79 デストラクタでdeleteはありえない(破棄されることが決まってるんだから)
ヒープに作ることを前提にするなら
コンストラクタを非公開にして(スタックに置かせないため)、静的メンバ関数から生成するとかで対応しないと
外部からdeleteさせていいならスマートポインタでいいんじゃないかな
>>80 普通にコピーするための関数をクラスBに用意すれば良いんじゃないかな
クラスBの参照かポインタで受ければインスタンスCも放り込めるでしょ
83 :
80 :2011/07/20(水) 22:03:34.20
>>81 Thx です
なるほど、デストラクタに難ありですか、難しそうなので、こういう場合スマートポインタとか
boost::shared_ptr とかを使うことは出来るのでしょうか?
>>86 ありがとうございます。
やりたいことは派生クラスから、基底クラスのコンストラクタの振る舞いを制御するということです。いわゆる仮想コンストラクタという奴です。
いろいろ調べたり、More Effective STL を読み返すと、一筋縄でない事を知り思考錯誤しています。
auto_ptrの使い方が間違っていてエラーが出ます
error C2555: 'Foo::clone': オーバーライドする仮想関数の戻り値の型が異なり、'Hoge::clone' の covariant ではありません。
error C2664: 'Foo::Foo(const Foo &)' : 1 番目の引数を 'const Foo *const ' から 'const Foo &' に変換できません。(新しい機能 ; ヘルプを参照)
#include <memory>
#include <iostream>
using namespace std;
class Hoge
{
public:
virtual Hoge * clone () const = 0;
protected:
int n;
};
class Foo : public Hoge
{
public:
//Foo * clone() const { return new Foo( *this ); } ここでエラーがでますorz
auto_ptr<Foo> clone() const { return new Foo( this ); }
Foo()
{
int n = 0;
cout << "Foo Constructor" << endl;
}
};
88 :
87 :2011/07/21(木) 00:40:40.01
正しいつか方を教えてもらえないでしょうか。
>>87-88 相談に乗って欲しいならエラーメッセージ貼れ。
Hoge に virtual デストラクタが要る。
そこに auto_ptr は要らない。呼び出し側で欲しけりゃ使えばいい。
90 :
89 :2011/07/21(木) 01:48:37.31
>>87 あ、エラーメッセージは上に貼ってあったのか。ごめん。
covariant じゃなくなってるのは auto_ptr のせい。
2つめのやつは this と *this の違い。
91 :
87 :2011/07/21(木) 02:04:05.19
>>90 ありがとう、これで逝けたと思うのですが
#include <memory>
#include <iostream>
using namespace std;
class Hoge
{
public:
virtual Hoge * clone () const = 0;
virtual ~Hoge(){}
};
class Foo : public Hoge
{
public:
Foo * clone() const { return new Foo( *this ); }
Foo()
{
cout << "Foo Constructor" << endl;
}
};
class Foo_ : public Hoge
{
public:
Foo_ * clone() const { return new Foo_( *this ); }
Foo_()
{
cout << "Foo_ Constructor" << endl;
}
};
92 :
87 :2011/07/21(木) 02:04:34.22
続きです int main(int argc, char* argv[]) { try { auto_ptr<Foo> PtrFoo(new Foo()); auto_ptr<Foo_> PtrFoo_(new Foo_()); } catch(...){ ; } return 0; }
アクセス修飾子について質問です。 class Hoge { private: int x; public: Hoge(int a){ x = a; } operator+(Hoge hoge); } Hoge Hoge::operator+(Hoge hoge) { return Hoge(x + hoge.x); } 演算子オーバーロードのサンプルコードでこのようなものがありました。 xはprivateになっているので、11行目のhoge.xはアクセスできないように思うのですが、 何故これで大丈夫なのでしょうか? 初歩的な質問ですみません。
private指定の意味を見なおせゴミクズ
>>93 x も hoge.x もクラスHogeのメンバーだから。
異なるクラスからアクセスできないのであって、異なるインスタンスからアクセスできないわけじゃない。
同じクラスならアクセス可能。
>>87 そろそろそのでたらめなコードをなんとかしないとな、聞いたことはちゃんと取り入れないと
まずは目的と欲しい機能を文章で分かりやすく表現できないことには前に進まない
まずコードの前に落ち着いて文章でまとめてみてよ
あとエラーC2555は、戻り値だけが違う関数はオーバーロードできないってこと
>>96 > あとエラーC2555は、戻り値だけが違う関数はオーバーロードできないってこと
違うよ。全然違うよ。
struct X { virtual void func(); }; struct Y : X { char func(); // C2555 }; 1. 名前とパラメータの型が同じ仮想関数が基本クラスで宣言されている 2. その関数をオーバー「ライド」しようとしているが、戻り値の型だけ違う 1番、2番が合わさることでC2555となり最強に見える
C++ってRADの開発向いてますか? そういうIDEと飼ってありますか? 教えてください .NETみてみたんですが .NET C++とか検索してもなんか 入門サイトとか全然のってなくてよくわかりません .NET 入門とか調べると C#がでてくるんですが C#がむいてるんですか? C#は.NETがむいてるんですか???わかりません教えてください C++でできるGUIアプリ開発とかやりたいですがなにがむいてますか? Xcodeみたいにウインドウとかボタンとか自由に配置してやりたいんですが WIN32みたいに変な全部ウインドーコードかいたり リソースエディタとかめんどくさいのやりたくないです C++をやる理由なんですが UnrealEngine3っていうやつC++つかうみたいなんで 教えてください C++でできるXcodeみたいなやつ C++だと.NETはむずかしい C#使えっていわれたんですがホンとですか?? C++でできるGUIのIDEとかそういうのあったら教えてくださいまってます
マルチしてません 教えてください
マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください マルチしてません 教えてください
違いますそれ 違う 本当に違います どなたか親切なかた教えてく
C++と.NETの資料の少なさや手間さはクソですか? やっぱり.NETはC#のほうがいいんですか?教えてください 本当に教えてくださいまってますみまさん
次にお前は「釣り乙w」と言う
>>100 何も考えずにC#(VS Express)かJava(Eclipse)を始めろ。
C++のことは一旦忘れるんだ。
typedef templateが実装されているコンパイラはありますか?
bool load(const char *pData) { unsingned long num_ = *( reinterpret_cast<const unsigned long *>(pData) ); pData += sizeof( unsigned long ); //etc } この関数で移動したpDataのアドレスを返すにはどうするのがスマートですかね? 引数を2重ポインタ使って返す? 返値で返す? 一般的な解法がわからん
bool init( const char *fileName ) { FILE *pFile; fpos_t fposFileSize; char *pData; pFile = fopen( fileName, "rb" ); if( !pFile ) return false; // ファイルが開けない // ファイルサイズ取得 fseek( pFile, 0, SEEK_END ); fgetpos( pFile, &fposFileSize ); // メモリ確保 pData = (char *)malloc( (size_t)fposFileSize ); // 読み込み fseek( pFile, 0, SEEK_SET ); fread( pData, 1, (size_t)fposFileSize, pFile ); fclose( pFile ); bool bRet = load( pData ); free( pData ); return bRet; } pDataはこんな感じになってます
>>113 std::pair<bool, char*>で返すとか
三つ以上はboost::tupleかstd::tr1::tuple
>>114 参照でもポインタでもいいけど、呼び出し元のpData変えたらfree()できなくなるから戻り値しかないじゃん。
char* classAinit( const char *pData) { char num_ = *( reinterpret_cast<const char *>(pData) ); pData += sizeof( char ); //etc return (char*)pData; } ↓ static const char* classAinit( const char *pData) { char num_ = *pData; ++pData; //etc return pData; }
公開しない関数はstaticにしておけ。 無闇とキャストするな。 C型のキャストは禁物。 sizeof(char)は意味が無い。 つーか、char *をint *にキャストしてもまともに使えるとは限らんぞ。
> 公開しない関数はstaticにしておけ。 これはやめろ
ダメなの?
無名namespaceでくくった方がいいんじゃね?
ヘッダに書かなければどっちでも同じだろ
staticで内部リンケージにするのは非推奨になってなかったっけ?
C++03ではdeprecated C++0xでは廃止
Koenig Lookupを賢く使おう
なんだ。廃止ってdeprecatedじゃなくなったって意味か。びびった。
コンパイラが怒ったら本気だす
>>130 まあADLがなかったら標準C++ライブラリはあり得なかったからな
132 :
117 :2011/07/23(土) 15:36:46.42
いろいろありがとうございます ぬーCはホント黒魔術だ >つーか、char *をint *にキャストしてもまともに使えるとは限らんぞ。 void* かpritf %pの方がよかったのか。 いいわけだけど、C++型のキャストは書きにくいからC形式のキャストを使ってしまう。 使いにくくするのも目的の1つなんだろうけど、自分のコードの悪い癖ですね
intはワード境界に置かないとアクセスできないCPUもある。 アクセスできる場合でも速度上のペナルティ食らう。
バスエラー
>>133 thx
そういう理由ですか
ほんとに複雑な言語だな
勝手にコンパイラがやってくれる最適化とか、アライメントでつい最近壮大な時間はまった。
#programa pack(push, 1)
#program pack(pop)
これを知らなかった
仕様を知らないのが、バグの温床にもなる
怖いな
#pragma だけどな
#pragmaはコンパイラ独自拡張だけどな
#pragmaそのものは標準だろ
#pragma once はもう標準にしろよ
0xでは標準になったよ
#pragunma
なんだうそか
まぁ、VCとgccで使えるからいいや
え、嘘なの? 0x▽
146 :
sage :2011/07/24(日) 01:05:19.38
const int& w = mWidth; const int& h = mHeight; Array2D< unsigned char >& o = mObjects; mWidth,mHeight, mObjectsはそれぞれメンバ変数なんですが この参照の使い方がわからないので教えてください
const int& w = mWidth; const int& h = mHeight; w = 100; h = 200; bool a = (w == mWidth); bool b = (h == mHeight); この地点で a == true、b == true ってこと?
何が判らないのかよく判らん。 単に、一時変数として使いたいだけでしょ。
単に安全性と見やすさの為にconst参照で束縛したようにしか見えんが、なんか問題あるのか? どうせその後にw,n,o使ったなんかの処理あるんだろ?
streamのsentryオブジェクトの役割というか概念が分かりません。 例外安全の為らしいですが、どういう状況の時に役に立つのでしょうか?
pthreadとかの関数ポインタの実体は、friend関数にするべきですかね? クラスのメンバー関数にして、それを型キャストしてpthreadに入れるとワーニングが出るんですが。
コンパイラはgcc(g++)です。
154 :
デフォルトの名無しさん :2011/07/24(日) 22:22:56.68
関数ポインタをキャストということが、どれだけ異常な事態かわかってる?
「関数ポインタのキャスト」は異常と言えば異常だが、正常でもある。
>>152 のは異常。
>>154 わかってないですね
教えて頂けると嬉しいです。
>>155 friniedにした方が良いという事でしょうか?
メンバー関数はptheadには渡せない。staticメンバー関数なら渡せる。
人気言語じゃないから
>>157 なので、関数ポインタの型キャストをしたのです。
警告がでますが、正常に動きます。
friendの方が良いということでしょうか?
161 :
デフォルトの名無しさん :2011/07/24(日) 23:31:08.49
>>156 void(*a)() = (キャスト)printf;
a();
↑
何が起きるか考えてみな
>>152 が何をしたいのか理解できない俺はおかしいのか?
163 :
デフォルトの名無しさん :2011/07/24(日) 23:38:46.98
スッドレという言葉が出てるのに想像できないのはおかしいね
スッドレ!
>>157 大抵の実装ではキャスト無しで通ってしまうが、ほんとうは extern "C" の付いてる
pthread の関数に extern "C++" な static メンバ関数へのポインタは渡せない。
>>160 キャストってのは↑の問題のことか?
よくわかんないからコピペ推奨。
>>161 よくわかりませんね。
class A{
void *func(void *p);
};
pthread_create(NULL, NULL, reinterpret_cast<void* (*)(void*)>(&A::func), NULL);
において、
このキャストが悪い理由がわかりません。
結局、friendにした方が良いとおっしゃりたいんですかね?
167 :
デフォルトの名無しさん :2011/07/24(日) 23:48:25.22
>>166 func を実行する相手がいないだろ
アクセス制御とは無関係な問題だ
>>167 funcの実体がないという事ですか?
割愛したんですが、
xxx.h
class A{
void *func(void *p);
};
xxx.c
A::A(){
pthread_create(NULL, NULL, reinterpret_cast<void* (*)(void*)>(&A::func), NULL);
}
void *A::func(void *p){
return NULL;
}
取りあえず、クラスのメンバ関数にするか、frindでAにアクセスする方が良いかを聞きたいのですが…
>>166 これはfriendとかそういう次元の話じゃないな
>>169 では、funcがclass Aにアクセスするにはどうすればいいですか?
void *func(void *p <- これ pthread_createの第四引数にthis渡せば普通にAのメンバ呼べるでしょ
174 :
デフォルトの名無しさん :2011/07/24(日) 23:58:14.76
>>170 func の実体じゃない、func の対象
クラスにアクセスって、自分が言ってることを冷静に考えてみな
>>151 ライブラリ実装側が、個別の出入力ごとに事前操作と事後操作を入れられるようになる。
オブジェクトにすることで事後操作が正しく実行されることを想定できる。
こんなところかと。たぶん。
>>173 やっと納得できる答えがありました。
どうもありがとうございます。
なんかずれてる思考だな。この先苦労しそうな人。 ていうか、頭固すぎ。
178 :
デフォルトの名無しさん :2011/07/25(月) 01:09:32.28
多重継承クラスのメンバポインタや 仮想関数のメンバポインタがからむと 発狂しそうだな、このお方 sizeof の違う reinterpret_cast とか平気みたいだし
コードの書き方で、人生の心配までされたのは初めてだw C++って最近暇つぶしに書き始めたばかりだから、先輩諸氏には到底及ばんと思う。 結局、ワーニングでるけどこれにしました。 pthread_create(NULL, NULL, reinterpret_cast<void* (*)(void*)>(&A::func), NULL); privateにアクセス出来ないのは結構痛いので。
sizeofが違っても、reinterpret_castしても大丈夫だと思うのだが… 陰口もいいけど、合理的な理由も付けて欲しいね
>>179 それじゃやりたいことができないだろう。
A のインスタンスをスレッド内で作成できるなら別だが。
>>179 メンバポインタからやり直した方がいいよ
>>180 確かに sizeof は本質ではないが、サイズとは無関係に reinterpret_cast 自体が大丈夫じゃない。
大丈夫だと思うならまずその理由を言ってみろよ。
>>184 ダメな理由を述べよ
てか、教えないがグダグダ言われてもな…
嫌なら答えなきゃ良いのに、腐った死体ばかりだなw
君たち偉大な技術者には敵わないから、おおめに見てくれや。
教えてもここにいる技術者に突っ込まれるしな 相手に語らせればつついて遊べるし
>>185 動かなかった。
スレッドは実行されるが、メンバ変数にアクセスしたところで落ちた。
勉強して出直すわ。
friendにして、明日試してみる。
それにしてもメンバ関数を無理やりキャストして使うってすごい発想だな
そうか? むしろ、メンバ変数を参照するには、それしか思いつかんかった。
>>190 >friendにして、明日試してみる。
結果報告ヨロ
メンバ関数ポインタという物を全く理解してないのがこれでわかるな・・・
boost::thread tr(boost::bind(&A::func, this, NULL)); もうこれでいいよ
簡単に考えてみようじゃん? メンバ関数は中で this ポインタを使えるじゃん? hoge.Save(); って呼び出すと、メンバ関数Saveの中で this(= hogeのアドレス)が使えるじゃん? ってことはメンバ関数は裏で hoge(インスタンス)のアドレスが勝手に渡されてるってことじゃん? ってことは普通の関数とメンバ関数は別物ってことになるじゃん?
理解させるだけ無駄だな
A::funcはスタック上にvoid*とthisが積まれていると想定しているのに対して、pthreadは void*しか積んでないのでおかしな事になる。(thisには多分pthread_createルーチン内の リターンアドレスが入っていると思う) スタックの清掃は呼び出し側で行っているようなので問題ない様に見えるけど、 やってる事はスタックオーバーフローと大して変わらない
std::cout << reinterpret_cast<int>(&A::func) << std::endl; 面白いからやってみろよ
>>180 ,187
N3290 5.2.10 [expr.reinterpret.cast] p6 より。
"The effect of calling a function through a pointer to a function type that is not the same
as the type used in the definition of the function is undefined."
これまで流れを見るに、これで理解してもらえるとは思わないが。
自分で考えない奴が理解できるわけがない
なんか、早朝から俺を懸命に貶す作業をしてる奴ら乙ww
「相談室」というスレタイで来たのに、ベテランの公開オナニー場とは詐欺なスレだなw
>>193 間違いなく、ただの関数ポインタって思ってるからな。
昨日の結果を鑑みると、何か間違ってるようだが。。
盆休みにでも、徹底して勉強したい。
>>197 解説ありがとう。
唯一、技術的にCプログラマな俺にもわかるように説明してくれたのはあんただよ。
>>199 せっかく出典出してもらったのに悪いが、君の予想通りわからないっぽい。
せめて日本語なら…
>>187 reinterpret_cast はどこで覚えたの?
どういう解説したら「reinterpret_castしても大丈夫」「ダメな理由を述べよ」なんて
発想になってしまうのか興味があるな。
>>201 > 「相談室」というスレタイで来たのに、ベテランの公開オナニー場とは詐欺なスレだなw
書籍等で学んでいることが前提だよ。その上でわからない場合の相談室。一から十までこのスレで学ぶ気か?
キミは基本を全くわかっていないのに、どこから仕入れてきた知識かしらんけど、見よう見まねでfriendとか言い出してる。
これじゃ、C++の初心者でも簡単に弄れる。弄ってるのはベテランじゃなくて初心者だろう。
面倒くさいから正しい書き方教えてやる。なぜこうするのかは書籍で学べ。
#include <pthread.h>
class A {
private:
void member1() { }
public:
static void* thread_func(void *data) {
A &self = *reinterpret_cast<A *>(data);
self.member1();
....
return NULL;
}
};
void aaaa()
{
pthread_t th;
A a;
pthread_create(&th, NULL, A::thread_func, &a);
}
>>204 > 面倒くさいから正しい書き方教えてやる。なぜこうするのかは書籍で学べ。
「正しい」ねぇ・・・
> A &self = *reinterpret_cast<A *>(data);
static_cast だろ。
> pthread_create(&th, NULL, A::thread_func, &a);
>>165 あと pthread_create() のエラー処理な。
>>206 リンク先が全然根拠になってない件。
少なくとも C++2003 では標準の範囲外なわけだ。
さらに C++2011 で変換自体が認められたとしても変換後の値自体は
unspecified で、動作は保証されない。
全然自然じゃない。
暗黙変換の逆変換は C++1998 からずっと static_cast の役目。
>>207 void*からオブジェクトのポインタへの変換後の動作が保証されないのは
static_castも同様。つーか保証できるわけがない。
だからこそ、reinterpret_castでいいじゃんという話がでてきてる。
210 :
デフォルトの名無しさん :2011/07/25(月) 12:56:40.78
ビット列を変えずに型だけ変わったことにしたければ reinterpret_cast 暗黙変換の逆なら const_cast や dynamic_cast という場合もある 上記いずれにもあたらない「明示的な型変換」がしたいとき static_cast よって 204,206 vs 205=207 は 204,206 の勝ち # この法則にも穴があるが今の流れとは関係ないので放置
とりあえず全てstatic_castを使って対応出来ない場合のみ 他のキャストを使用するって方針なのかもよ reinterpret_castだと(やるかどうかは別として)間違えてvoid*以外を渡してもコンパイルエラーにならないし
>>211 まあreinterpret_cast使うなら任意の不完全型でもいいからなw
voidは「static_castでも変換できる不完全型」なのでせっかくだから俺はこのstatic_castを選ぶぜ!ってやつがいてもおかしくない。例えば俺とか
僕はCスタイルキャストちゃん!
>>211 テンプレートを作ってコンパイルエラー検出。
template <class T>
T hoge_cast(void*p)
{
return reinterpret_cast<T>(p);
}
>>203 入門書にかいてあったよ。
結構平気でvoid *に値突っ込んだり、取り出したりしてたから
>>204 そうカリカリするなよ。
一応、入門書は走破して、実際にコードを書き始めたわけさ。
スレタイに入門者・初心者お断りといれればどうよ?
あと、サンプルありがとな。
早速試すわ。
>>208 お前の人生には迷惑かけないから、ゆるしてちょ
喧嘩はやめてくれ。たのむ
ttp://ideone.com/BlmAq サンプル書いてみました。「メンバへのポインタ」でググるといいかも
実際に書いてみると、自分の知識もずいぶんと曖昧だと思いました
21行目でreinterpret_cast<int>(this)がエラーになる理由と
67行目の&演算子を外すとエラーになる理由がよく分からないです
>>217 散々叩かれた俺が言うべきか分からんけど、
一つ目は(64bit cpuでは)intではケタがたりないのでは?
>>217 staticメンバ関数ってようは普通の関数だからthisとか使えない
220 :
デフォルトの名無しさん :2011/07/25(月) 22:05:29.74
禿本よめば一発で済むことをまあgdgdと長いこと・・・
>>217 pthreadの件については、戻り値と引数が同じ関数なら型キャスト出来ると思っていた。
少なくとも今まで上手くいかなかった事がないので、
生涯わからんと思うけど、
C++において、メンバ関数の型キャストは危険と覚えておくわ。
ttp://ideone.com/nG9M6 普通のポインタ:
メモリ上の直接のアドレス
メンバへのポインタ:
インスタンスの先頭アドレスからのオフセット、
なのでインスタンスと一緒に使わないと意味がない
普通の関数ポインタを、メンバへのポインタに reinterpret_cast するのは
危ないのではないかと思う
>>209 > void*からオブジェクトのポインタへの変換後の動作が保証されないのは
> static_castも同様。つーか保証できるわけがない。
なんでそう思ったの?
static_cast の動作として T* → void* という標準変換の逆変換が含まれることは
きちんと規格で定められているよ。 N3290 だと 5.2.9 p7 で。
>>210 > ビット列を変えずに型だけ変わったことにしたければ reinterpret_cast
reinterpret_cast でビット列が変わらないと期待するコードに移植性は無いよ。
5.2.10 p3
[ Note: The mapping performed by reinterpret_cast might, or might not, produce
a representation different from the original value. ?end note ]
ポインタを別のポインタ型にキャストして、元に戻してから使う限りは static_cast も
reinterpret_cast も同程度の保証があるけど、
>>204 について言えば最初の変換が
暗黙変換なのだから戻すのは static_cast じゃないといけない。
戻すのに reinterpret_cast を使うのなら、最初の変換も reinterpret_cast でなければ
ならない。
pthread_create(&th, NULL, A::thread_func, reinterpret_cast<void*>(&a));
>>223 > なんでそう思ったの?
当たり前だろ。void *として渡されてたポインタが変換先のオブジェクトへの
ポインタであったことなんか保証できないんだから。
>>224 暗黙変換の逆変換がstatic_castで出来るというだけで、暗黙変換の逆変換を
static_castでやらなければいけないなんて、どこにも書いていない。
>>225 > 当たり前だろ。void *として渡されてたポインタが変換先のオブジェクトへの
> ポインタであったことなんか保証できないんだから。
そこの保証が無い場合はどのキャスト使おうがアウトなんで話してもしょうがないでしょ。
> static_castでやらなければいけないなんて、どこにも書いていない。
static_cast では、暗黙変換の逆変換ができると定められている。
reinterpret_cast では、暗黙変換の逆変換ができると定められていない。
(変換自体はできるが値が unspecified になる)
どっちを使うべきか、もうわかるよね?
> reinterpret_cast では、暗黙変換の逆変換ができると定められていない。 > (変換自体はできるが値が unspecified になる) 妄想規格 wwww
>>227 ちがうの?
5.2.10 [expr.reinterpret.cast] paragraph 7 (
>>206 のリンク先)に unspecified って
書いてあるみたいだけど。
>>228 The result of any other such pointer conversion is unspecified.
これら以外のポインター変換の結果はunspecified
「確かに、フジテレビの方針は目に余るものがあります。ペ・ヨンジュンブームのころから
韓流ドラマをやたら放送したり、女子フィギュアでは浅田真央よりキム・ヨナに寄せた
報道をして批判を浴びたりしたことがありましたが、最近ではさらに拍車がかかっている
ようで、社内にも微妙な雰囲気が漂っています」(フジテレビ関係者)
フジテレビや産経新聞は「フジサンケイグループ」の傘下だが、同グループのサンケイ
スポーツからは4月に韓国エンターテインメント情報のタブロイド誌「韓Fun(カンファン)」が
創刊されるなど、今年に入って"韓流押し"に本腰を入れてきているという。
「フジは他にも、今年4月に渋谷と恵比寿に同時オープンしたK-POPの常設公演会場
『Kシアター』に出資。系列の音楽出版会社はKARAらK-POPアーティストの版権を
買いまくっている。七夕に放送された同局の情報番組では『少女時代のように足が
綺麗になりますように』『KARAのライブに行けますように』などと書かれた短冊を
映り込ませ、女子アナたちもことあるごとに韓国旅行の魅力をPR。まるで韓国国家の
宣伝企業と化している状態ですよ」(スポーツ紙デスク)
そうしたメディアと視聴者との温度差が露見した形となった今回の騒動。現在のような、
キー局による露骨な"利益誘導型"の放送が続けば、さらなるテレビ離れが進むことは
避けられないだろう。
http://news.livedoor.com/article/detail/5732069/
>>229 これら = reinterpret_castでT1 *→T2 *→T1 *とすると元の値に戻りますよーとかnullはどのポインタに変換してもnullですよーなど
でしょ?
んでその「これら」には
暗黙の変換でT1 *→void *に変換して
そのあとreinterpret_castでvoid *→T1 *に変換すると元の値に戻りますよってのが含まれてるの?
ってのが
>>228 の言いたいことなんじゃね?
今ちょっと調べられないけどどうなの?
>>231 半端な知識でいいがかりつけてきた
>>205 が引けなくなって粘着してるだけだから気にすんな。
「これらの変換」が「T1*をT2*に変換したものを元に戻す」の事で、それ以外はunspecifiedと
いうのならば、↓これがunspecifiedという事になってしまう。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int bbb(sockaddr *sa);
int aaa(struct sockaddr_in *sin)
{
return bbb(reinterpret_cast<struct sockaddr*>(sin));
}
すなわち、「これらの変換」とはその前(スタンダードタイプでかつT2のアライメント要求が
厳しくない、またはどちらかがvoid)の変換も含む。
>>232 > いうのならば、↓これがunspecifiedという事になってしまう。
C++03 までは unspecified なコードだね。
> すなわち、「これらの変換」とはその前(スタンダードタイプでかつT2のアライメント要求が
> 厳しくない、またはどちらかがvoid)の変換も含む。
で、
>>204 のコードでは void* data → A* だから「どちらかがvoid」に含まれ、
その結果は static_cast<A*>(static_cast<void*>(data)) となる、つまり
static_cast<A*>(data) になる、と C++11 では新たに規定されることになった。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#658
234 :
デフォルトの名無しさん :2011/07/26(火) 15:27:51.46
>>222 そのメンバポインタの話じゃないだろ
>>226 > static_cast では、暗黙変換の逆変換ができると定められている。
いちいち突っ込むのもアホくせえほど無茶苦茶やなw
>>234 N3290 5.2.9 p7 で定められてるらしい(>223)ぞ。
>>232 はC++03でも正しい。
「voidのアライメントなんて定義されてねー」と言いがかりつけてくるのがいるので、
voidが特記された。
5.2.10 p7
A pointer to an object can be explicitly converted to a pointer to an object of
different type. Except that converting an rvalue of type 懼pointer to T1懼?�
to the type 懼pointer to T2懼?� (where T1 and T2 are object types and where the
alignment requirements of T2 are no stricter than those of T1) and back to its
original type yields the original pointer value, the result of such a pointer
conversion is unspecified
化けた。
ま、
>>233 が規格理解してない半可通という事が証明されてしまったわけだ。w
5.2.10 p7
A pointer to an object can be explicitly converted to a pointer to an object of
different type. Except that converting an rvalue of type "pointer to T1" to the
type "pointer to T2" (where T1 and T2 are object types and where the alignment
requirements of T2 are no stricter than those of T1) and back to its original type
yields the original pointer value, the result of such a pointer conversion is
unspecified.
239 :
238 :2011/07/26(火) 15:44:19.26
>>237 void* は "pointer to an object" ではなくてですね。
> ま、
>>233 が規格理解してない半可通という事が証明されてしまったわけだ。w
お前もな。
そもそもなんでこんなに reinterpret_cast が大好きなんだろう? 危険性や移植性が増えるだけだろうに。
242 :
デフォルトの名無しさん :2011/07/26(火) 15:58:30.32
>>235 template <typename a>
int b(int c)
{
a d;
d = c; //暗黙変換
return N3290_cast<int>(d); //ふーん、すごいなあ・・・
}
243 :
デフォルトの名無しさん :2011/07/26(火) 15:59:40.73
>>241 それじゃお前は↓このように書け。大変だな。www
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int bbb(sockaddr *sa);
int aaa(struct sockaddr_in *sin)
{
return bbb(static_cast<struct sockaddr*>(static_cast<void*>(sin)));
}
C++形式のキャストそのものが嫌いな俺はどうしたらいいんだぜ
よく首にならないな
>>241 今は
>>231 の2段落目 "んでその「これら」には……が含まれてるの?" のYes/Noを議論してるので
それが実際にコーディングする上でミスを誘いやすいか否かはまた別の問題として扱ったほうがいいんじゃないかな
>>237 でもその文面に void の特記が含まれてないお
というか現行標準の 5.2.10/7 には未だ void の特記は
含まれてないと思うお
ttp://ideone.com/NlHSk 確かに 5.2.10p7 の Converting... の文だけでは
A* => void* => A* のような void* を含む変換では、元に戻る確証が得られないような気がする
ただ、最初の文によると void* を経由して static_cast すれば、reinterpret_cast が実現できるので
reinterpret_cast<A*>( reinterpret_cast<void*>( &A() ) )
は
static_cast<A*>( static_cast<void*>( static_cast<void*>( static_cast<void*>( &A() ) ) ) )
= static_cast<A*>( static_cast<void*>( &A() ) ) /* (!) */
と同じこと
そして、5.2.9p13 によれば、(!) の式は元の値に等しくなるとある
「ただ、…」以降の部分は、確証がもてんです
というか、実務で問題なく使えれば、もうそれでいいかなあ。。
ああ、抜けがある。。ごめんなさい void* gf( void* ) { A().operation(); return NULL; } ところで、戻り値の NULL の型はどのような扱いになるんですか?
十分に討論して、それが済んだら3行でまとめてくれ
誰がどの点に対してどういう意見なのか分かりにくいので反論という形にせずに
自分の認識を書いてみる。
5.2.10 はあくまで reinterpret_cast の項なので p7 の 2 回の変換が共に
reinterpret_cast の場合にのみ成立する(元に戻る保証がある)、というのが
俺の解釈で、>205 も同様の解釈なのだと思う。
>232 については sockaddr_in と sockaddr が無関係の型なので、bbb の中では
reinterpret_cast を使って戻していると想定されるため unspecified ではない(と想定される)。
一方で、暗黙の型変換の逆方向の変換ができるとは reinterpret_cast では規定されていない。
static_cast は 5.2.9 で規定されている。
実際、(reinterpret_cast の変換が処理系定義なので)処理系に依存するけど元に戻せない例を
作る事が出来て実例が
http://ideone.com/L7ZuL 後出しで多重継承かよ、というかもしれないが 5.2.10 の規定に継承について書かれていない以上
多重継承かどうか等に関わらず元に戻せる保証がないと読むべき、というのが俺の主張。
>>254 インチキ
reinterpret_casterの呼び出しの暗黙のC*->B*への変換で変更されている。
職場の人が変数も関数も全部publicにして困るんですけどどうしたらいいですか。 言うと怒るし。
classじゃなくてstructにすればpublic要らないですよ。と教えてあげましょう。
#define public private して職場の人を困らせてあげましょう
260 :
248 :2011/07/26(火) 22:43:02.85
流れ理解してなかった。ごめんお (´;ω;`)
261 :
デフォルトの名無しさん :2011/07/26(火) 23:03:55.06
>>256 COBOLerかな?
シングルトン一本槍とか、10進ライブラリにご執心とか?
>>222 ああ、俺への回答か。
ありがとう。
今日、昼休み中考えてて、俺なりに納得してみた。
class A{
void *func(void *arg){
reurn NULL;
}
};
の場合において、
reinterpret_cast<void* (*)(void*)>(&A::func)
というキャストは、A::を取る目的でつかったんだが、
A::を取る事は即ちclass Aのメンバでなくなるという事かなと。
なので、class Aのメンバにアクセスしようとすると落ちると。
Cとかアセンブラの場合、関数ポインタは関数の先頭を指すアドレスにすぎないけど、
(だから、強引なキャストで良いと思ってた)けど、
C++ではそうではないんだなと。
>255 暗黙の変換を元に戻せるかどうか、を確認してるんだから暗黙の変換がないと意味がないじゃん。
T* p = ...; void* vp = p; assert(static_cast<T*>(vp) == p); // (1) assert(reinterpret_cast<T*>(vp) == p); // (2) (1) static_cast (5.2.9) C++03 でも C++11 でも OK 。 (2) reinterpret_cast (5.2.10) C++03 では可能な変換として挙げられていない。 C++11 では OK 。(DR #658, #1120 による変更) とりあえずここまでは合ってる?
Cは関数の中に関数を作ることができるみたいですが C++では似たようなことはできないのでしょうか
0xならラムダ式が使える
関数オブジェクトを作ればC++でもいけるな
>>265 Cではできないよ
それができるのはGCCの独自拡張じゃないかな
>>265 void Foo(void) {
struct Local { static void Bar(void) { /*^o^*/ } };
Local::Bar();
}
270 :
デフォルトの名無しさん :2011/07/27(水) 18:29:41.56
>>264 おまえ
>>207 か?
ここ「まで」って何を勝手に限定してるんだよ
> 暗黙変換の逆変換は C++1998 からずっと static_cast の役目。
これだけ大きく出たんなら「任意の」暗黙変換の逆がすべて static_cast であることを示せ
予定じゃ来年だしC++11とかいってる
>>207 ,233,264は同じやつなんだろうな
そしてたぶん
>>205 も
272 :
デフォルトの名無しさん :2011/07/27(水) 23:51:17.31
EclipseにCDTでほぼデフォルトのままでC++ by Jim Congerを組み込んでみたのですが、 g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\blowfish\blowfish.o ..\src\blowfish\blowfish.cpp In file included from ..\src\blowfish\blowfish.cpp:5: ..\src\blowfish\blowfish.h2:268: warning: missing braces around initializer(長いのでとりあえず略) こんな感じでエラーになってしまいました。 どこに問題があるのでしょうか?
273 :
272 :2011/07/27(水) 23:53:06.05
それはエラーじゃなくて警告なんで
>>265 >Cは関数の中に関数を作ることができる
どう作るのか教えてください
>>272 二次元配列を{{}, {}, ...}って形でなく{...}の形の初期化子で初期化してるからじゃないかな。
277 :
272 :2011/07/28(木) 00:25:00.43
ありがとうございます これは特に気にしなくていいメッセージでしたか、 確かに276の言うとおりなソースになっていました。 これのエラーメッセージの後にさらに g++ -oサンプル.exe src\main.o src\blowfish\blowfish.o src\blowfish\blowfish.o:blowfish.cpp:(.text+0x0): multiple definition of `CBlowFish::CBlowFish()' src\main.o:main.cpp:(.text+0x0): first defined here と関数系のエラーが出ているのですが、 ファイルに#ifndefとかを追加していますし、 試しにとコマンドでg++ main.cpp(←blowfishをインクルードしているだけ)をやると コンパイルが通るのですが、 このエラーは何が原因と考えられるでしょうか?
>>277 main.cppでblowfish.cppをインクルードしてるのが原因だろ
unsigned char red,green,blue; unsigned int color =(red<<16)|(green<<8)|blue; これの使い方わかりますか 赤青緑それぞれ一バイトの数値を持っていてcolorにその赤青緑を代入する ときビットシフトがかかる と思ってたんですが実際やったらうまくいきませんでした サンプルのお手本なんですが使い方を教えてください
うまくいかないってどうなったんだ
>>280 まさかと思うが、red, green, blueに赤青緑を代入してないだろうな。
283 :
272 :2011/07/28(木) 01:32:59.26
>>279 インクルードを消したら、
クラスを使おうとする時に未定義エラーで通らないですよね。
>>280 red,greenをunsigned intにキャストしてからシフト
Observerパターンを実装しようと考えています SubjectにObserverを登録したいのですが 登録用メンバ関数 Subject::Attach( boost::shared_ptr<Observer> &src) にObserver自身のshared_ptrを渡せなくてこまっております。 このような場合どうしたらいいでしょうか
shared_from_thisを使うか設計を見直す(オブザーバーの内部に参照カウントをもたせるなど)
#include "GameLib/Framework.h"
unsigned char red,green,blue;
unsigned int color =(red<<16)|(green<<8)|blue;
namespace GameLib{
void Framework::update(){
unsigned int* vram = videoMemory();
red=0xff;
color=static_cast<unsigned int>(red);
vram[200*width()+100]=color;}}
>>280 なんですが
できなかったんでもう一度確認してもらえますか
>color=static_cast<unsigned int>(red); この時に勝手にビットシフトがかかると思ってるのか?
>unsigned int color =(red<<16)|(green<<8)|blue; >red=0xff; >color=static_cast<unsigned int>(red); うわ、予想の遥か下を行く低空飛行で壁に激突しとるがなw
面倒だから正解教えてしまおう。 unsigned int color =(static_cast<unsigned int>(red)<<16)|(static_cast<unsigned int>(green)<<8)|static_cast<unsigned int>(blue); 携帯からだからtypoあるかも
>>289 将来、リアクティブプログラミングが可能になれば有り、かも。
関数型言語とかのほうから来た人なのかな。 colorが他の変数の参照をキャプチャして遅延評価されるなにかなら最初に考えてたコードで思ったとおりに動いたんだろうけどな。
原始的にこれで #include <iostream> #include <iomanip> using namespace std; int main() { unsigned char red(0),green(0),blue(0); #define color static_cast<unsigned int>(((red)<<16)|((green)<<8)|(blue)) red=0xff; cout << setbase(16) << color << endl; }
func(bool b) { if(b) { TRUE } else { FALSE } } funcT() { TRUE } funcF() { FALSE } この場合、TRUEとFALSEの処理をインライン化させたいなら 普通にfunc(boolean)と呼ぶよりboolean ? funcT() : funcF()とした方が良いですか?
inline付ければいいんじゃね
それくらいわかってますしそういう問題じゃないです
funcT、funcFは別にfuncを経由しなくても呼べちゃうけどそれはいいの?
>>299 boolで分けたのは例え話なので、そういうところは考慮してないです
>>300 trueの処理とfalseの処理を他で使いまわすつもりがないなら前者で
>>296 >func(bool b) { if(b) { TRUE } else { FALSE } }
なんでfunc()からfuncT()やfuncT()を呼ばないの?
例え話に突っ込んでどうするの?
どうしてもインライン化したいなら書き方によるコンパイラの微妙な振る舞いの差に頼るのではなく 処理系依存の強制インライン化キーワードでも使うべきなのでは?
305 :
デフォルトの名無しさん :2011/07/29(金) 22:52:15.80
つーか、ただ単に if と ?: の性能差が聞きたいだけじゃないのか?
template についての相談というか質問なんですが なぜ、ヘッダーファイルに書かなければならないのでしょうか? 理由を教えてください。
VC++のフォームアプリケーションで アラームつき時計つくりたいんだが textBoxに入れた時間(アラーム時刻)と 現在時刻を合わせるのに苦労してるんだが textBoxに入れた時刻を数値にフォーマットするにはどうしたらよいものか
>>307 mktime(), strftime()
>>306 別にヘッダファイルに書かなければならないというわけではないが、
とりあえず(厳密な説明ではないが)以下を理解しな。
・templateはインスタンス化してクラス定義や関数定義を生成するためのもの。
・templateをインスタンス化するにはtemplateの定義が必要。
・templateのインスタンス化はコンパイル時に行われる。
・コンパイル時にコンパイラが参照できるのはコンパイル中のソースとそこにincludeされたソースだけ。
そのうえで考えてみな。
複数のソースで利用される汎用的なtemplateの定義はどこに置いてどのように利用するのが自然で使いやすい方法か?
http://www.twitlonger.com/show/c1dqum フジテレビ内部者からの告発
フジテレビは内部で戦っています。
ホリエモン買収対応で、ソフトバンク系SBIに助けてもらったので、朝鮮系グループが
経営側でチカラを出してきましたが、報道部はサンケイ新聞とともに、朝鮮系グループに
喧嘩を売って戦ってます
どうかみなさんの応援で助けて下さい。
朝鮮系グループのしつこさとえげつなさには、正攻法では戦えないです。
テレビ側が言うのはおかしですが、ネットで話を盛り上げて助けて下さい。
盛り上がれば多くの芸能時の人の耳にも入り、さらに話が大きくなると思います。
日本のメディアは瀕死状態です。 助けて下さい。行動を起こして下さい。
応援お願いします。
オーバーフローするとバグるけど オーバーフローするには何万年とかかかる みたいな場合でもオーバーフロー検知と対応コードを書くべき?
いつ、どんな使われ方をされるか分からないのなら、書いておけ。 「2000年まで使われることはない」という思い込みでY2Kは起きた。
>>312 書かない理由が説明できないなら、書くべき。
説明できるならコメントで添えておくべき。
エラー等の通知を行う際、例外と戻り値ではどちらが良いでしょう? 出来れば理由もお願いします
316 :
デフォルトの名無しさん :2011/07/30(土) 17:52:59.06
292471210647年問題かw 某大学院で「正義とは本質的に何か」って授業やってたのと似てるな
>>315 返り値
そんなこと聞くような奴はそうしといたほうがいい
例外安全というものがあって、その辺を理解せずに適当にぶん投げるとろくなことにならない
>>317 例外安全って言葉知りませんでした。
戻り値にしときます
320 :
312 :2011/07/30(土) 19:16:35.97
いまのCPUで何万年でも未来のCPUでは現実的な速度で終わるかもしれない ということで例外処理書くことにしました。まる
>>315 例外のほうが良いよ。
戻り値は戻り値に使えないと嫌でしょ。
使うときにいちいち分岐書かないといけないし。
>>318 例外安全性を壊さずに例外を使うという発想は無いのか?
>>321 そんな気がして、「例外」を使ってみようかと思いました。
>>322 否定されたから、やめとこうかなと…
調べてみたけど、例外安全ってのを考慮するようなプログラムでもない。
googleスタイルだと例外禁止してるみたい。 ゲーム用途でも例外使ってない所が多い。
325 :
デフォルトの名無しさん :2011/07/31(日) 00:03:56.04
禿さまご乱心の特にひどいところだからな
finallyつけろ つけなさい つけてくれ
だが断る!!
ゲームだが例外とRTTIは外してたな 重く遅くなるから 組み込みもそうなんじゃね だが局所的に例外使いたいシーンがでてくる そんなときはwhileとフラグとマクロで疑似例外
RTTIはともかく例外ってそんな遅くなるのか? tryブロック入るのと出る時のオーバーヘッドぐらいじゃねーのか ループ内じゃなくて外に置けば問題ないとおもうが
参考 >そこで、ゲームエンジンでの構造化例外処理を完全に無効にすることには強力な論拠がある。 >これはノーティドッグで採用されているもので、エレクトロニック・アーツやミッドウェイで私が従事していた >ほとんどのプロジェクトでも使った方法である。ゲーム機の限られたメモリや処理能力を考えると、 >ゲーム機で動作するゲームエンジンでは、SEHは決して使うべきではないだろう。 >しかし、パーソナルコンピュータ上で実行されることを想定したゲームエンジンであれば、 >何の問題もなくSEHを使えるかもしれない。 >ゲームエンジン・アーキテクチャ ジェイソン・グレゴリー著
>>331 「誰が言ったか」じゃなくて「なんでそうなるのか」を示さないとなんの説明にもならないよ
そのレスからじゃジェイソンが例外アレルギーってことしかわからないよ
>>332 この後にその論拠となるURLがいくつか紹介されてるんだけど書くのめんどくさくなった。
#include<iostream> using namespace std; int main() { char word[20]="Hello"; cout << &word[0] << endl; } word[0]のアドレスを表示しようと上のプログラムを書いたのですが、「Hello」と出力されました。 word[0]のアドレスを表示するためにはどうしたらいいのでしょうか。
cout << (void*)word << endl;
std::hex
>>331 Windows の SEH と C++ 例外がごっちゃになってるようなのも怪しいな。
なんだ例外のほうが速いのか
>>205 とかを釣ろうとしたんじゃね
まあiso.orgには来年2月とかあるからそっちの話かもしれないけど
コンテナを拡張メンバ関数で拡張しようとしたとき、コンテナの中身に依存してる場合
it=array|find_name<A*>("test");を
array|find_name("test");にする上手い方法無い?
std::vectorを継承しろは禁止で。
一回作っちまえばvectorを継承するより使いやすそうなので
http://codepad.org/w2fsi44V
int x,y=0; こういう初期化の仕方するとエラーになるので int x,y;x=0;y=0;こういった書き方しているんですが まとめて変数を初期化するやり方教えてください
x=y=0;
int x=0,y=0; じゃないの?
350 :
343 :2011/08/01(月) 03:26:43.28
拡張メンバの利点が解らない
>>350 日本語は下手じゃないけど礼の概念が存在しない民族が、よく分からないのに改造するからだろwww
>>353 まさしくそれだ。ありがとうございます。
result_ofにこだわりすぎて、混乱してた。
ちなみにC++テンプレートテクニックという本を参考にしてました。
>>352 いやすみません。言い訳させてもらうといろいろ書いてたの消して
眠かったんです。
今さらですが
>>344-345 レスサンクスです。
>>351 拡張メンバ関数の利点
・一回作れば、再利用しやすいと思う
・何となく見た目がいい。関数に突っ込むよりもメンバー関数として持ちたい。
・タイプが少ない、find_ifとかstd::for_eachとかめんどい
・myvectorをprotected継承やhas std::vectorの設計で作った場合、myvector is not std::vectorなので func(std::vecor) みたいな関数に放り込めないので再利用しにくい
・通常の継承にした場合、使い方次第では解放漏れの恐れがある
std::vectorのデストラクタにvirtual着いてないから
>>355 > ・何となく見た目がいい。関数に突っ込むよりもメンバー関数として持ちたい。
へルパー関数(find_name(array,"test")とか)と比較したときの利点はこれだけだな。
それも
・演算子のどれかを標準的な意味とは異なる意味でオーバーロードするのでぱっと見で誤解と混乱を招く。
という欠点とのトレードオフだ。
templateでポリモーフィックな型かどうか判別する方法はありますか? dynamic_castが使えない型にはstatic_castを実行したいのですが、 判別方法が分からず困っています。 やりたい事は↓みたいな事です。 template <bool> void* foo() { return dynamic_cast<void*>(p); } template <> void* foo<false>() { return static_cast<void*>(p); } template <typename T> void* bar(T* p) { return foo<IsPolymorphic::RESULT>(p); }
>>357 Boostか0xのis_polymorphic
>>358 ,359
そのものずばりなクラスがあったのですね。
全く気がつきませんでした。ありがとうございました。
シングルトンのインスタンスはポインタと参照どっちを返すのがいいですか
普通は参照ですね
メモリー管理をクラス任せにするとメモリー消費は大きいが 自分でやれば節約になる。
誤爆?
メモリーの盗用と借用の違いだよ。
聞かれてもいないのに何語っちゃってんの
誤爆って聞いたからその答えがこれだろ。 何もかんでも一から説明するほど行数はないのでな。
アホはスルーしましょうよ
行間を読むということのできない池沼が増えましたね。 まあ一生そういった書物には縁の無い人たちでしょうが・・・(笑
速度効率はいいとして空間効率ってどうやって上げてんの?
>>363 誤爆かどうかは別にしても、意味が分からんのだが。
メモリー管理を自分でやることによって節約になるっていうのは、どういう状況なの?
何が節約できるの?
>>373 >>363 はたまにC++関連スレに出てくるアンチRAIIの人じゃないかと思える
リソース管理クラスに任せっきりだと不要になったリソースをブロックを抜けるまで無駄に保持し続けるけど
自分で不要になった時点ですぐ解放するように管理すればそういう無駄が出ないってことじゃないだろうか
>>374 RAIIは解放忘れに対しては安全かもしれないけど自由度が低いのが問題
いつも同じ解放の仕方をしたいとは限らないからクラスに解放処理を埋め込むのは良くない
>>377 普通に作業してりゃ例を挙げるまでもなく随所で見ることができる問題だろ
むしろRAIIで全て完全に無駄なコストなくスマートに解決できたプロジェクトなんてものがあるなら教えてくれ
99%のリソースはデストラクタで解放するようにしてるけど それで問題が出たことなんてないんだけど 問題出ないようにそうしてるんだし
共有/非共有、エラー処理、etc これらをオブジェクト単位、あるいは文脈ごとに 切り替えたいまたは新しい処理を追加したい って要求はどうやって解決してんの?
>>378 ごめんわかんない。
とりあえず一個でもいいから、例を見せて。
RAIIのとかを進める外人のやつはC++でJAVAを再現しようとする間違った考えの持ち主で アメリカ人の無能さを前提に考えているからであって手先の器用な日本人にはあわない。 日本の狭い道路をでアメ車に乗って走るようなもの。 翻訳本にばっか頼ってるからこういう間違った考え方がひろがるんだよ。
わけがわからないよ
それは勉強不足なのでは?
RAII使って素直に設計しろよ
解放に失敗したときの例外処理どーすんの?っと
重要なことだから何度も言うけど、 大雑把で適当なアメリカ人にはどうしても必要なものであるが 繊細で見えない所まで拘りを持つ日本人には逆に厄介なものになる。
用途別のRAIIオブジェクトを使えよ
RAIIを使わない理由になってないよな
オブジェクト指向は紙の上でだけでやっておけば良いんだよ。 オブジェクト指向は不必要と入ってないよ。 オブジェクト指向に踊らされるのはよくないといってるの。
デストラクタでエラー出たら死ぬやん 揉み潰すのは苦肉の策って感じでスマートじゃないし 放置なんてしたら即解雇、リトライループにはまったらユーザーを怒らせるだけ RAIIは永遠にこの問題を解決することができない だからリソースは安全なポイントでまとめて手動で返すのが常道
アメリカ人にとってはそれ以上にメリットの方が大きく感じるほどプログラマーの質が低いのだろうな。
結局C言語だけで良かったんにゃ
失敗するなら手動で解放する 失敗しないならデストラクタで解放する これだけのことじゃないのか
>>390 オブジェクトごとにRAIIobj持たせようとしたらテンプレートか動的削除子になるが
いつも要るわけじゃない機能にコストを払うぐらいならマネージャで管理させたほうがいい
>>394 破棄処理でエラーの出る困ったリソースについては、デストラクタじゃなくて
明示的な破棄処理を提供すればいい。
そういうケースがあるとしても、それとは別に RAII が問題なく適用できる場面が
多くあるのだから、全部ひっくるめて「間違っている」とか「良くない」とかいう話に
するのはおかしい。
>>398 特殊な用途を持ち出しても RAII 一般を批判する根拠にはならないよ。
ちょっと言い方が悪かった 日本人でA型で長男にはRAIIは必要ない。 日本人でB型で次男には特に必要。
RAIIは安全のために実行効率と柔軟性を犠牲にしてるから結局宗教論争に帰着するんだよね 使うべきところで使って使うべきでないところでは使わない以上の議論は無駄 そういう意味でRAII全否定とか99%RAIIですがなにか(キリッ)みたいな偏った人はちょっと頭固すぎだなと思う
そういえば夏だったな
もう夏か厨が現れると夏を実感するね
>>394 それはRAIIの問題ではなくリソースの性質から来る問題なので
RAIIを使わなくても問題になるしRAIIを使わなければ自動的に解決されるわけでもない。
要はRAII不要と言ってる奴が、一番RAIIに不当に高い評価をしているでFAだな テクニックなんだから向かない場面で使わないのは当たり前
実行効率はともかく、エラー処理はデストラクタから例外投げられれば済む話だった もう言っても仕方ないことだけど
結局クラスに解放処理を組み込むのがよくない理由はなんだったの?
RAIIの型に解放メンバ関数を追加しても何も問題ない リソースを取得するメンバ関数を追加するのはダメだけどな。少なくともRAIIではなくなる
デストラクタ内で何が何でもケリをつけねば!みたいな脅迫観念があるのかなぁ。 ただのシーケンスでしかないのに。 無理なもんはどう書こうが無理なのに。
真面目な話、みんなメモリ管理以外にRAII使ってる?
オブジェクトがリソースの確保解放を請け負うなんて馬鹿なクラスじゃ ループ中はもうそのクラス使えないなwww使ったら遅すぎて苦情が来るぞ
実測したの?
魚おおおおおおおおおおおおおおおおおおおおおおおおおお
>>408 そんなことを言う奴は、デストラクタが例外を投げる型に対応した
uninitialized_copy() を設計・実装するの刑に処す。
>>414 windowsでmutexの取得/解放に使ったことがある
>>415 ループの中で構築する必要があるならRAIIを使うか使わないかに関わらず構築コストはかかるでしょ
ループの中で構築する必要がないならRAIIの使用に関わらずループの外で構築すればいい。構築済のオブジェクトを使う分にはどちらも変わらないよ
>>419 特定の処理前にどれだけのオブジェクトが必要かわかるならいいけどね
処理中に必要な数計算して動的に生成しなきゃだめなケースとか日常茶飯事だろ
それともそういうケースが絶対に存在しないものとして無視したクラス設計にするわけ?
RAII信者は理想論者。現実が見えてない
それ設計が悪いんじゃね・・・
>>420 RAII を使うと「処理中に必要な数計算して動的に生成しなきゃだめなケース」で困るってこと?
さっぱり状況が見えてこないんだが。
もう釣りってことでいいんじゃね? まともなことひとつも言ってないし
パフォーマンスの悪化と無駄なエラーの可能性を生じさせる点でRAIIは出来損ない バカのための安全装置としてはシンプルで効果も見込める点で優秀
ってバカは言ってたよ
ってバカは言ってたよ
RAIIはエラー検知がめんどくさいのがやだわ 返り値も無いし例外も投げれないから、グローバルなエラーログみたいなスマートじゃない方法で調べなければならない
RAIIって問題だらけだったんですね 勉強になりました
std::vector の値をstd::map のsecond に代入するスマートな方法を教えてください
リソース管理の話題だったら、ファクトリの話もしてほしいな
>>431 です
>>432 1行でなくても全然OK です
algorithm や for_each とかcopy を使った方法を教えてください
兎に角for やwhile を使わない方法であればcool です
>>434 です
関数オブジェクトでやる方法が知りたいです
vectorの要素それぞれをmapのsecondに入れたいってことかな 各要素のfirstはどうするの?
>>437 それってboost ですよね?boostは別にかまわないんですけど、関数オブジェクト勉強したくて
聞きたかったんです。
>>436 そのとおりです
あらかじめmapコンテナにデータは入っていて、secondのデータを入れ替えたいのです
>>438 boostを使うということは
>>434 の理に適うと思うのだけど
STLでなければならないなら始めからそう言えばいいのに
coolじゃない関数オブジェクトを自分で書いたらいいと思うよ 使うところだけを見ればきっとcoolだよ
>>430 最初からこう書いとけば黙って消えてくれたのか。次の機会に覚えてたらこうしよう。
443 :
デフォルトの名無しさん :2011/08/05(金) 01:40:04.64
初歩的なことかもしれませんが他人のソースでこんな記述を見つけました unsigned short b:2; で、これはただ単に2ビットだけの数値として扱っていることは理解したのですが、 この2ビットだけの数値で配列を作ることは可能でしょうか?
無理
ビットフィールドはアドレス取れないのと配列がポインタ互換なのがあわさって配列にはできないんだよな
>>443 できた。
struct _2bits { unsigned int b:2; };
_2bits array[10];
それは、構造体の配列。
クラスのインスタンスが作られるとき、コンストラクタに無効な引数が入ってきた場合、 コンストラクタ内でデストラクタを呼び出してインスタンスを破棄する、ってアリ?
無しに決まってんだろ 例外出せよ
>>448 Foo::Foo( int arg ) { // コンストラクタ
int* p = new int [100]; // ← もし直接newで確保した場合、これは片付ける必要がある
if (arg == invalid) {
delete [] p; // 解放してから
throw std::invalid_argument("blah blah"); // 例外を投げる
}
...
}
生newではなくてコンテナやスマポを使えば例外スタック巻き戻しで解放してくれる
えーマジ生ポ? キーモーイ 生ポが許されるのは小学生までだよね きゃははは Foo::Foo(int arg) try : p() { this->p = new int[arg]; } catch(...) { delete this->p; // 漢ならfunction try-catchで後始末だぜ }
//安全が保障されるまでメンバにストアすらしない漢気 Foo::Foo(int arg, int *dummy=NULL) try : p() { dummy = new int[arg]; this->p = dummy; } catch(...) { delete dummy; }
>>452 15.3 p10
"Referring to any non-static member or base class of an object in the handler for a
function-try-block of a constructor or destructor for that object results in undefined behavior."
だから仕様にfinally追加しろって言ってんだろおおおおお!!!!!!
動的配列が必要ならvectorで。
>>456 動的配列を戻り値で返したい場合はどうしますか?
次期C++ならMove semanticsがあるからvectorをそのまま返す
どうせコピーコストが問題になるような現場じゃないから現行でもそのままでおk
次期は知ってるのですが、vectorに大きなデータを入れたい場合も あるじゃないですか。1998年規格にauto_ptrがあってそれの配列版が 無いというのは、どういう設計なんだろと思いまして。
unique_ptrでおk
インスタンスはリークの意味が不明
わかるだろあほ
意味不明だよアホ
コンストラクタで例外が投げられているのでデストラクタは呼ばれないが newしたメモリは解放されます
>>460 関数の引数を参照にして値をいれるオブジェクトを渡せばいい。
Cのころから(そのころはポインタやポインタへのポインタを引数にしてたけど)あるデザインだ。
(あくまでも返却値で返さなければならないならそれこそどういう設計なんだろ、だ)
>>470 >返却値で返さなければならないならそれこそどういう設計なんだ
なんかの一覧を作成して返すってのは、普通じゃないの。
vectorの入れ物だけ渡してそこに値が詰められるって方がcrazyだとおもうけど
クレイジーだぜぇ〜。この
>>471 はよぉ〜『常識が通じない』ってやつだぜ〜!
>>467 メイン関数を抜けた時点でdeleteが呼ばれるんですよね?
なのにデストラクタは呼ばれないのですか?
475 :
デフォルトの名無しさん :2011/08/06(土) 21:55:08.52
どうしても一時オブジェクトで返す必要があるかどうかってだけだろ C の流儀から抜けたから何だっつの
> vectorの入れ物だけ渡してそこに値が詰められるって方がcrazyだとおもうけど
>
>>470 がCの流儀から抜けられないだけだろ。
iteratorを受け取る関数にiteratorかinserterを渡してコンテナに値を詰めてもらえ。
こういうiteratorを受けてその参照先に代入していく関数はC++でよくあるデザインだが
これはCのmemsetやmemcpy等のデザインと本質的に同じものだ。
つーかmove用のオブジェクト作って代用すればいいじゃん
>>476 ならオマエは文字値取得も↓こうやってるんだな?
void get_config(const string &key, back_insert_iterator<string> &item);
//設定値取得
string s;
get_config("item1", back_inserter(s));
s.clear();
get_config("item2", back_inserter(s));
文盲が多いな。 >これはCのmemsetやmemcpy等のデザインと本質的に同じものだ。 auto_ptrの所有の概念でそのCから脱却したのに、 配列だけどうして標準クラスで簡単にできないのかという質問だろ。 参照を渡せとかinserter使えとかmove用作れとかは答えになってない。 標準委員会がお疲れだったんじゃね
vector使えって禿が言ったから…
確かに禿はvectorを使えと言っていたね。 vectorじゃauto_ptrの代わりにならないのに
unique_ptr入ったからもういいじゃない
初歩的な質問なんだけど、unique_ptr<int[]>って、どうやってサイズ取得するの?
new[]したときに指定したんだから覚えてろよ
>>478 流れ読まないで噛み付いてるから意味の通らない突っ込みになってないか。
その例で順序いらない・重複したら新しい設定で上書きならコンテナ決め打ちで
void get_config(map<string,string>& config, string const & rawtext);
でいいだろ。
順序いる・重複許可なら
template<class T> void get_config(T iter, string const & rawtext);
vector< pair<string,string> > v;
get_config(back_inserter(v), raw);
とかな。
>>485 mapは関係ないんじゃ。一件の文字列値取得でしょ。Cでいう get_config(const char key[], char buf[], size_t buf_size); に対応するものが
>>476 説では get_config(const string &key, back_insert_iterator<string> &buf) になるんだよね。
>>478 はstringを例に配列も値として返したいと言っているんだろ。僕だったら string get_confg(strint const &key) にするね。
>>484 mjdsk!? じゃあ関数の戻り値に使えないね(´・ω・`)
>>476 は
>>470 の
> 関数の引数を参照にして値をいれるオブジェクトを渡せばいい。
に対する
>>471 ,472の突っ込みに対する反論だろ。
その流れを
>>478 が理解せず
>>476 がオブジェクト本体の参照を渡すことはするなって言ってると思って突っ込んだのがずれてる。
491 :
478 :2011/08/07(日) 03:48:27.28
>>489 理解してないのはアンタじゃないの?
>>460 配列データを戻り値として返したい
>>470 戻り値は設計ミス。ポインタのポインタ(orポインタの参照)を使え。
>>471 データ取得なのだから戻り値で欲しい。受け取りvector(の参照)を渡すのは嫌だ
>>476 入れ物のinserterを渡せ
>>478 では、char配列の文字列が欲しい時も、受け取るためのinserterを渡すんだな
>>478 (=俺)は「受け取りのための変数を渡すのが汚い」と言ってる。
vector本体の参照でもinserterでも同じこと。
ちなみに
>>470 は 用意したメモリに書き込むことを目的としたmemcpy/memsetの例を、
データを戻り値として欲しいという
>>460 の話に持ってくるのは変だと思う。
>>490 汚いな。
0xのmove使わなきゃ簡単にできないんだね(´・ω・`)
相談です。 >頻繁に動的にクラスインスタンスが生成破棄される という場合、生成用の関数を用意してshared_ptrで管理するのか、 それとも管理用のインスタンスpoolを作って、そいつに管理させてIdで間接的に管理するのか、 どっちが良いのか迷ってます。 ケースバイケースかと思うのですが、 判断の基準になるようなものってありますか?
個別での管理に迷いが生じるような状況なら逆に迷わずまとめて管理したほうがやりやすいよ。 いちおう判断基準になりそうなのはこのくらいかな? ・同時に存在するインスタンスの数:多い-まとめて管理、少ない-個別に管理 ・時間当たりに生成・破棄されるインスタンスの数:多い-まとめて管理、少ない-個別に管理 ・個々のインスタンスの使用範囲:プログラム全体-まとめて管理、生成した関数の内側だけ-個別に管理 ・インスタンス群全体に対する操作(条件にあうインスタンスの検索とか):行う-まとめて管理、行わない-個別に管理
>>493 え?
自分で書いてるとおり、個別のインスタンスへの参照を保持したいときは
shared_ptrで、IDで管理したいときはpoolじゃないか。
後から取得するときにshareするものを探したいならpoolが必要でしょ。
shared_ptr管理はshared_ptr所有側がインスタンスを管理する。
あなたの言うpoolはpoolが最終的にメモリを破棄する。好きにすれば
>>493 ボトルネックでshared_ptrは最初から選択肢として無いわこれクソ遅いスマポとして有名だから
だからプールにするか、あるいはアロケータをカスタムする方が柔軟で無駄もなく将来性がある
>>493 まず何を心配しているのか明らかにするべき。
対象が実行時間効率なのか空間効率なのかすらわからないようじゃ話にならない。
そしてターゲットがわかったらとりあえず素直なコードで書いて、対象について実測するべき。
実測もせずになんとなくで pool とか用意するのはよくない。
>>493 >>頻繁に動的にクラスインスタンスが生成破棄される
にたいして、どうして
>という場合、生成用の関数を用意してshared_ptrで管理するのか、
なんだ?
頻繁に生成とshare/poolは関係なかろう
499 :
493 :2011/08/08(月) 01:18:55.20
ご指摘色々ありがとうございます。 一番気にしているのはコードの可読性で、 規模が大きくなったり、複数人で開発をするときの秩序を求めてます。 linux,android,iphone,windows で利用される可能性があります。 品質が上がるなら、速度はよほどの事が無い限り犠牲にしても構いません。 shared_ptr() を用いる方法(インスタンスを利用コード側で管理する方法)は、 その場しのぎでさっさと解決するには良かったのですが、 長期的に見るとインスタンス生成破棄タイミングが散らばって、 バグを生みやすいかなぁと漠然と感じまして…。 pool形式なら、メモリ再利用もできるなぁなどと、色々思いを馳せておりました。 速度面でもpool方式の方が良さそうですね、こちらの方針で行ってみようと思います。 ありがとうございました!
ぶっちゃけるとアロケーター作っておしまい
501 :
493 :2011/08/08(月) 01:35:01.13
>>496 ,500
アロケーターは難度高そう。勉強してみます…
boostにpoolアロケータがあったと思う
1. 処理なしの仮想デストラクタ virtual ~Hoge() {} 2. 純粋仮想デストラクタ virtual ~Hoge() = NULL; ... Hoge::~Hoge() {} この2つの違いって何? メリットとデメリットを教えて欲しい
>>504 まず、純粋仮想関数の定義に NULL が使えるとは限らない。ふつうに 0 が正しい。
わざわざ記述量の多い後者を使ってこんな間違いを仕込むぐらいなら前者のほうがいい。
実質違わないと思うけど、後者だと派生クラスで明示的なデストラクタを書かないと
いけないと思う人が増えそう。
サブルーチンコール先(処理先のアドレス)があるか無いか 1が「行き先はあるけど(一度コールするけど)何もしないで戻る」で、 2が「そもそも行き先が無い」 じゃね? &(Foo::Hoge) で取り出した時、それが null かそうでないか
2ならHogeはとりあえず抽象クラスになる. 1だと,Hogeに他に純粋仮想関数が無い場合には具象クラスになる.
509 :
デフォルトの名無しさん :2011/08/09(火) 12:32:37.80
そもそも pure にすべき関数を具体的に挙げられないときにまで abstract という手段にしがみつくのは本末転倒だろ そーゆーことを考えるやつの頭の中が何教か、おおかた見当がつく
おおかた見当付くとか偏見と思い込みに縛られるのは あまり良い考え方でない。 理由のバリエーションを想像するべき
>>508 俺がその理由で純粋仮想デストラクタを作るのはデストラクタ以外のメンバが存在しないときだけだな
ほかの全ての実装が提供されてるのにデストラクタだけは派生の実装が必要になるという状況が想像できない
なんでも何教とかなんでも信者とか言って、そこで思考停止するヤツって、 もう自分の技量よりもネット上で戦う事しか考えてないよね。 頭おかしくなってる
>>514 デストラクタへのポインタは取れないし、純粋仮想関数へのポインタがヌルになるわけでも
ねーよ
若干亀ってしまった。すまない
>>505 > まず、純粋仮想関数の定義に NULL が使えるとは限らない。ふつうに 0 が正しい。
単純に記述ミスしていた。指摘あり
>>514 513じゃないけど
純粋かそうでないかは単に「派生によってオーバーロードする必要があるかないか」でしかないよ
その理由によってメンバポインタが0になるってことはないし
純粋仮想関数は定義を持つこともできる。もちろん呼び出すこともできる
>>507 その違いは一応把握しているが、それぞれの記述が抽象・具象であることを示すための手段であるのかどうかが気になる
インスタンスを作成させないことが目的であれば、protected コンストラクタを宣言する方法が一般的だし、
それだけの違いであれば、記述が面倒な2番は不要かなと
ん?2番は空処理「{}」にしてあるが、何か処理を入れたらどうなるんだ?どのタイミングで実行されるんだ?
まさか速度やサイズに影響したりしないよな
519 :
デフォルトの名無しさん :2011/08/10(水) 22:02:53.54
初心者です、質問させてください。 1>device.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall CString::~CString(void)" (??1CString@@QAE@XZ) が関数 __unwindfunclet$??0CDevice@@QAE@XZ$0 で参照されました。 このエラーはCStringが宣言されていないよ、と言われている解釈していいのでしょうか?
クラスは宣言されてるけど呼び出した関数が存在しない・・・みたいな
CString::~CStringのソースコード(cpp)かそれをコンパイルしたものが見つからないって言ってる
大体の場合実装部分にクラス名::をつけ忘れてるか引数を間違えてる
523 :
519 :2011/08/10(水) 22:34:35.82
ありがとうございます うーん、CStringクラスは標準インクルードにあるはずだから コンパイルしたものがないか、何か別の要因ということですかね・・・
524 :
デフォルトの名無しさん :2011/08/10(水) 22:40:46.09
志村〜 LNK LNK
>>523 >うーん、CStringクラスは標準インクルードにあるはずだから
ちゃんと、ある事を確かめた?
>>525 「はず」と書いてしまいましたが定義を遡るとCStringクラスははいっていました
デストラクタってlibに入ってんじゃねーかな
C++始めて少し 未だnewの使いどころわからず
new = malloc() delete = free() と思ってほぼ間違いなし。
コンストラクタ 「…」 デストラクタ 「…」
>>528 newが分からないというより、
メモリの動的割り当てのメリットがわからないってカンジ?
動的確保の使いどころが分からないっていうのは幸せなことだな 単純で小さいプログラムを書く必要しか生じてないってことだし
>>518 純粋仮想はオーバーライドさせるための手段でしかない
純粋仮想デストラクタは純粋じゃない仮想デストラクタが実行されるのと同じように実行されるよ
だから純粋仮想であっても定義は必要
>518 コンストラクタをprotectedにしてもインスタンスを作れなくなるわけじゃない. 単に作れる相手を制限するだけ. 例えば,純粋仮想関数f()を持つクラスを作ったけど あとからf()を純粋仮想じゃなくする変更をしたときにそのクラスがうっかり 具象クラスになってしまった なんてことが起きると嫌だから 個人的には抽象クラスなら必ず2で書く. デストラクタに=0を付けることで 「僕はこのクラスは絶対に抽象クラスにしたいんだー」という強い意志を表明する.
派生クラスから基底クラスへデフォルトコピーコンストラクタを使ってメンバ変数を代入したいのですが これって可能ですか?
>>535 代入と初期化をごっちゃにしてるといつか酷い目に遭いますぞ。
>>533 ,534
抽象クラスは純粋仮想デストラクタを宣言定義すべきなんだな
そして、必要であればそのデストラクタにメンバ変数の始末処理を書く、と
勉強になった
std::map std::set に加えて C++0x では unordered_set unordered_multiset unordered_map unordered_multimap これらのハッシュコンテナが追加されましたが、<key, value> value を基準にソートでききるような使い方ができる、コンテナがあれば教えてください。
>>539 std::set<value>
とか
std::map<value,key>
とか
std::vector<value>
とか
std::list<value>
とかじゃね?w
>>thx です std::map<value,key> これって、key とvalue を入れ替えて使ってことですね
>>540 #include <iostream>
int main()
{
int a, b;
while (std::cin >> a >> b) {
// 何か処理
}
}
今日本語対応のプログラムを書いているのですが、文字コードがよくわかりません。 1.ワイド文字やマルチバイト文字の具体的なエンコードの指定はどうするのか 2. ソースコード自体の文字コードは何か関係あるのか 3.vc++の文字セットをunicodeにしているのにchar配列に日本語をいれておいても文字化けせずに表示できるのはなぜか 根本的な理解がないのかもしれません。誰か教えてください。
vectorでpush_backに失敗した場合(メモリ確保失敗で) でもプログラムを進めるとしてsize自体は変わらないのでしょうか? forでsize分回したとしても普通に問題はないのでしょうか? 気になったので教えてください。
>>545 とりあえず一般的な基本。
プログラム作成過程ではそれぞれ異なるかもしれない
・ソースファイルの記述に使う文字集合・符号化方式(各ソースごとでも異なるかもしれない)
・コンパイラが内部で使う文字集合・符号化方式
・実行ファイルで使う文字集合・符号化方式(一つの実行ファイル内でも複数が使われるかもしれない)
が使われていてそれらを問題なく扱うには
・全ての文字集合・符号化方式を統一しておくか
・必要に応じて適切(かつその環境で実際に変換可能)な変換を行う・変換を行うように指定する
必要がある。
>>545 > 1.ワイド文字やマルチバイト文字の具体的なエンコードの指定はどうするのか
どの段階・どういう意味でのエンコード指定かわからないが環境や段階に応じて
・事前に適切にエンコードしたものを用意
・コンパイルオプションで指定
・ソースの記述で指定
> 2. ソースコード自体の文字コードは何か関係あるのか
X->Yのただ一つの変換しか出来ないのに頼むならともかく
B->Aの変換もC->Aの変換もB->Cの変換もできるのに頼むなら、これはBですB->Aの変換をしてください、と頼まないと正しく変換できないだろ。
つまり状況によっては関係ある。
>>545 1.VCはwchar_tがUTF-16固定。マルチバイトはSJIS固定
2.無い。VCはSJISで書こうがUTF-8で書こうが同じバイナリーになる
3.VCはprintfがロケールに従いUTF-16をSJISに変換する
>>547 それはUnixの話。VCは違う。「一般的」なんて嘘つくな
皆さんありがとうございました。
>>551 「は?」じゃねえよ。意味の無い書き込みしやがって。
ソースの文字コードが何であろうとコンパイラがUTF-16に変換するんだから
ソースも統一しろなんてデマ流すな
いえいえ
>>547 の何に突っかかってんのか分からん。めちゃ丁寧じゃん
win/xbox360の開発なら困らないけど
macやlinux、スマフォ、ゲーム機、組み込み機 etcだと困るからそっちの挙動を一般的っつってんじゃないの
普通はどの環境でも成り立つ方法を一般的って言うよねー
VC++って書いてる奴にWinで通じない話をされてもねー
>>557 Mac,Linuxを考えたら「UTF-8に統一しろ」ってアドバイスするのが適切だろ。
今時20世紀のようなJIS/EUC/SJIS混在の頭でいるジジイは引退した方がいい
>>546 >if an exception is thrown by an insert() function while inserting a single element, that function has no effects.
>if an exception is thrown by a push_back() or push_front() function, that function has no effects.
>>560 UTF-8BOM統一の方がいいだろgccも新しいのは通る
>>536 どうもありがとうございます。
基底から派生へってやるとエラーなんですよね、自分なりに工夫してみます。
簡単な方法があるなら教えてもらいたいですがw
>>537 アドレス確定してからすぐに初期化して、その後アドレス変更せずに継続的に行う処理だったので代入と勘違いしてました。
知識と経験が不足してるので精進したいと思います。
>>562 BOM付って非標準じゃなかった?バイト順入れ替わることないし
たまにトラブルからBOM無しに統一した方がいいだろ
と思ったけどよく考えたらBOM無しでトラブったこともあるな orz どうすりゃいいんだ
BOM付けているのは、notepadしか知らないんだけど、他にもあるんだろうか BOM付けると、ASCII文字だけからなるUTF-8ファイルをasciiエンコーディングと見なせないから 今後BOMは撲滅されると勝手に予測
>>564 BOMはUnicode規格およびISO/IEC 10646で規定されている。
つまりBOMを扱えないソフトは「UTF-8対応」とは言えない。
>>566 UTF-8の規格はBOM有り無しどっちでもいいのか
じゃぁ問題がなければBOM付きで統一した方が日本では便利そうだな
>>567 GCCはシバソ問題があるから
今まで対応しなかったんだろ。
安易につけた方が良いとは言えないだろう。
Unixではファイルの先頭の「#!/usr/bin/sh」などを 読んで動作を決めてたから、先頭の#の前にU+FEFFが入ると困る。 という問題だと思う
shbangか
>>568 ソースファイルはコンパイラに対しての入力データファイルだから、
シバンで問題が起きるはずない。
単にアンチマイクロソフトが多かっただけでは?
Visual Studioを使わずにC++で開発をしようとしています。 .NET Frameworkが入っていないPCでも実行できるexeファイルを作成したいです。 試しにhello.cppに #include <iostream> using namespace std; int main(int argc, char const* argv[]) { cout << "Hello C++!!" << endl; } と書いてから vcvars32.batを実行して cl /EHsc hello.cpp を実行すると、hello.objとhello.exeができました。正常に実行できました。
574 :
573 :2011/08/14(日) 05:41:38.49
dumpbin /DEPENDENTS hello.exe すると --- Microsoft (R) COFF/PE Dumper Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file hello.exe File Type: EXECUTABLE IMAGE Image has the following dependencies: KERNEL32.dll Summary 4000 .data 5000 .rdata 2000 .reloc 11000 .text --- と出力されました(空行は抜きました)。 KERNEL32.dllにしか依存していないので、.NET Frameworkが入ってないPCでも動作すると思っているのですが その認識で合っていますか? あと、exeのファイルサイズが100KBほどあるのですがそんなもんなんですか? 大したプログラムではないので、もっと小さくなってほしいのですが...。
>>574 .NET関係ないから、その認識で合ってる
関係あるのは、C#やVB.NET、あとC++のフリした別物の、C++/CLI の時だけ
ちなみに、VC++使ったって、意識的にC++/CLIとかにしない限り、 別に .NET関係ないぞ
577 :
573 :2011/08/14(日) 06:50:58.95
>575-576 ありがとうございます。 VC++を使わないのは半分趣味みたいなものです。 あまり大きなのを作るつもりではないので、 いちいちVC++を起動するのがめんどくさいなあと思って。
静的リンクだもんでかいのはしょうがない
>>578 複数の自作ツールを導入する時に、共通dllみたいに括り出せないんだっけ?
>>574 間違っちゃいないけど、Cライブラリの話と勘違いしてないか?
.NET Frameworkが必要か確認するなら、SDK付属のIL Disassemblerで開けるかどうか。
dumpbinはどちらかというとCライブラリが動的リンクか静的リンクかの確認に使う。
日本の新聞、テレビは在日中共の手に 落ちてるし国会はすでに中共の指導下にあるから、 日本原住民は主権を完全に失っている。 日本国憲法下、当然民主主義が守られ、主権は 日本国民にあると思い込んでいる。あるいは ちょっと気づいているけど、見ない振りしてる お馬鹿な民族。そんなお馬鹿は滅びさるのみである。 新聞、テレビが民主党政権を支えているから民主党は 安泰。新聞テレビに叩かれるか、無視されるかしかない 自民党や右派政党が政権をとることは永遠にありえない。 主権がない国民はどんな政権を立てようとも無意味 政府をいくら批判しても無駄、選挙なんて民主主義の ごっこ遊びに過ぎない・・・主権がないんだから
>>581 右派政党・自民党は、愛国心をあおりながら、実は合衆国に尻尾をふっている、別の意味での売国奴であることを理解していないとは。
これが「ゆとり脳」ですか。
アイちゃん頑張りすぎだろ
basic_string の pop_front って定数時間?線形時間?
規格は basic_string の complexity は明示してないらしい
http://www.sgi.com/tech/stl/basic_string.html > Note that the C++ standard does not specify the complexity of basic_string operations.
実際に規格書見ても sequence の要件を満たすくらいしか書いてないように見えますが
処理系依存・・ですかねえ
newを使って解放しないままループを何回も実行した場合 while(1){ int *p=new int[10]; } newはループごとに作られるのですか それともループの2回目以降無視されるんですか ちなみに while(1){ int *p=new int[10]; delete p[]; } これだと毎回newしますよね?
staticじゃねえんだ毎回に決まってるだろ
>>586 毎回 new される。そして
while(1){
int *p=new int[10];
}
ならば前の p の内容も失われてしまい、delete もできず、アプリが終了するまで、放置された存在になってしまう。
589 :
31 :2011/08/17(水) 00:21:16.83
while (1) { int r = rand(); } rand() が二回目以無視されるはずがねぇだろォォォ!
590 :
31 :2011/08/17(水) 00:22:21.08
あッ まぁいいか
別スレッドで無限ループでrand()を繰り返し実行して 乱数が欲しくなったときにそのスレッドの乱数の値を得れば完全ランダムじゃね?
VC2010 expressです。参照を用いると可変個引数な関数が動作しません。 ↓ダメ void hoge(hogehoge& a, ...) { va_alist ap; va_start(ap, a); } 参照でなくポインタなら動作します。 ↓おk void hoge(hogehoge* a, ...) { va_alist ap; va_start(ap, a); } 参照で記述したいのですが、どうすれば良いのでしょうか? なお、関係ないとは思いますが、hogeはメンバ関数ではありません。
596 :
デフォルトの名無しさん :2011/08/17(水) 02:19:03.12
>>592 これからの乱数発生器の姿ではないかな
ハードウエア乱数発生器からソルトを加えつつアプリに返し
バックグラウンドで統計評価しながらスコアをボットで集めて
次世代への課題を提起するという「宇宙乱数」をここに提唱する
>>595 その動作は未定義だから参照使うな
どうしても参照使いたいなら
void hoge(hogehoge& a, int i,...) とか間になにか挟め
598 :
デフォルトの名無しさん :2011/08/17(水) 09:56:45.25
それができたとして va_arg(ap,hogehoge&) とかどーすんだよ 呼び出し側で値渡しされてしまったものを後で参照ともし言えても 値渡しへの参照じゃ呼び出し側から見て左辺値に見える動きが作れないぞ 禿がちゃんとヒントくれてるんだが...
完全ランダムなんてこの世に存在するのか?
601 :
デフォルトの名無しさん :2011/08/17(水) 17:01:40.71
それは証明されていないはずだが
完全なランダムって何? 因果律的なものと関係ある?
STLにfind_endがあってfind_firstが無いのって何故なのでしょうか? [first1, last1) からサブシーケンス[first2, last2) を探す場合、STLだとどう実装できるのでしょうか?
std::searchがある
そんな関数あったのか・・ ひょっとして、サブシーケンスを検索するだけでなく、サブシーケンスを置換するアルゴリズムもあったりしますか?
find_end() 配列1の一部と配列2が部分一致したら、その最後の位置を返す find() 配列を走査して値が最初に一致した要素の位置を返す find_first_of() 配列1の一部と配列2が部分一致したら、その最初の位置を返す find_if() 配列を走査し、最初に条件に一致した位置を返す for_each() すべての要素に対して、指定された振る舞いを実行する search() 配列1の一部と配列2が部分一致したら、その最初の要素の位置を返す search_n() 連続した個数の要素を見つけ、その位置を返す 何が無いって?
要素の数が変わるような変更はコンテナ自身にしか出来ないよ
出力にinserter渡せば要素の追加はできる。 部分置換はコンテナの範囲eraseと範囲insertを使うのが基本で要素数が変わらないならアルゴリズムのcopyで上書きかな。
>>597 そうですか。しょうがないのでポインタで我慢します。
でも、言語仕様に...組み込んでるんだから、va_start(ap)だけで充分だと思った。
これなら、func(...)も記述出来るし。
その言語仕様で参照でないパラメータを先行させることに決まっているんだからぁしょうがない。 つーか、コンパイラを作る立場で考えたら先行パラメータがないと面倒なことが判ると思うよ。 それが理由で古いコンパイラでは先行パラメータが必須だったから仕様はそれを追認した形だね。
stdargの手法は先行するパラメータのアドレスから可変個引数のスタック上の位置を もとめるという、コンパイラに手を入れずに可変個引数を実装するvarargsの手法を そのまま使っていますが、 ..を導入してコンパイラに手を入れたのに、古い手法をそのまま使ってるのは頭悪い と思いました。 コンパイラは可変個引数がスタック上のどこに置かれているか知っているので、すん なり実装できると思いますよ。
612 :
デフォルトの名無しさん :2011/08/18(木) 18:53:36.97
古いコンパイラに先行パラメータなんかねえよ main(argc) { extern prntf(), exit(); /* すべての関数が 0 個以上の可変引数だった */ printf("%s", **(char***)(&argc + 1)); exit(0, argc, 2, 3, 4, 5); }
アプリケーション作成して見たいんですが、何か言い本ないでしょうか? 難しい本は絶対に無理なので簡単な本(入門者向け)でお願いします。
CUIなのかGUIなのか、GUIならプラットフォームは? 使用するコンパイラぐらい書いとけ
VC++2100 expressです。
CUIでwindowsと言えばよろしいでしょうか?
>>615 簡単な本しか読む気が無い場合、C++を選択する時点で間違っていると思う。
C#とかの方が良いよ。
GUIでした。
一番有名なのはC++じゃないですか。 それは有能という証明になりませんか? 入門者はまずは基本から学ぶべきだと思いますがね。 難しい本は後の話ですよ。
自己解決しました。
>一番有名なのはC++じゃないですか。 >それは有能という証明になりませんか? 材料にはなり える かもしれないが、 証明にはならない。 何故なら内容次第、場面次第だから
C++よりCUIに興味を持ちました。 また質問にきてやるよ。
623 :
デフォルトの名無しさん :2011/08/19(金) 10:04:39.59
>>615 2100ってなんだよwww
ExpressだとWindows GUIやるのに大変だと思うよ
>>619 >入門者はまずは基本から学ぶべきだと思いますがね。
そう言うならアセンブラからやれよ。
void question() { if(0xffff == 0xffffffff) { // ここにくる? } }
void question() { if(0xffff == 0xffffffff) { // 絶対にこない。最適化でコードさえ生成されないかもしれない。 } }
-1 == -1
0xffff != -1
void question() { if(0xff == 0xffffffff) { // ここにくる? } }
とにきみいしならくる
I16L32でも来ねえ
intの範囲が-128〜127のC++コンパイラのような何かならそうなるかもしれない
そんな処理系なら0xffはunsigned int 整数拡張した結果が0xffffffffになることはない
-1と-1が等しくないって計算機として致命的で
バカ?
638 :
デフォルトの名無しさん :2011/08/19(金) 17:47:41.28
>>635 そんな処理系なら整数拡張もないんじゃね?
拡張どころか警告つきで切り詰められるだろこの例だと
intが-128〜127なのはC++の規格に反する
そういやそうだな
>>634 もC++コンパイラのような何かっていってるじゃないか
short s = -1; long l = -1; if(s == l) // これはどうなの
一部の人、基本わかってるか?整数リテラルは0か正の整数になるんだぞ (たとえ8進や16進表記でも)(例えば-1234という表記は負符号演算子-と整数リテラル1234) だから0xffffffffはunsigned int型の4294967295になる(intが32ビットの環境なら)。 それをint型にキャストすれば多くの処理系ではint型の-1になるってだけ(実装依存で-1にならない実装も仕様上はありえる)。
!mokuton
>>10 ↑
これポインタ
クリックすると10の中身見れるよね
明日始まります。参加のご協力お願いします。 @『フジテレビ抗議デモ』 日程 8月21日(日) 時間 13:30〜 場所 お台場 青海北ふ頭公園 (船の科学館 となり) A『国を売るメディア(フジテレビ)を糾弾する緊急国民行動』 日程 8月21日(日) 時間 15:00集合 16:00出発 場所 お台場シンボルプロムナード公園「滝の広場」 (ゆりかもめ「テレコムセンター」駅前) 注意事項:デモで使用可能な物は「日本国旗関連のみ」です。 それ以外での抗議は禁止です!マナー違反は注意を促してください。 ケガ人が出ないよう気持ちの良いデモを行いましょう。
>>647 まず、その下らないスレ違いの抗議参加者を募集する愚行に抗議する
ただの荒らしだからNGしとけ
スコープを抜けたときにデストラクタが呼び出されるようにしたいのですが 変数受け取りを強制する事はできますか? test_class(); //直後にデストラクタが呼ばれるのでエラーとしたい test_class o(); //OK
>>650 こんな感じか?
struct Hoge {};
#define Hoge() YouSuck()YouAreFired
int main() {
Hoge g(); // OK
Hoge(); // エラー
}
-- gcc
Hoge.cpp: In function 'int main()':
Hoge.cpp:5:3: error: 'YouSuck' was not declared in this scope
Hoge.cpp:5:3: error: expected ';' before 'YouAreFired'
-- vc
1>Hoge.cpp(5): error C2146: syntax error : missing ';' before identifier 'YouAreFired'
1>Hoge.cpp(5): error C3861: 'YouSuck': identifier not found
1>Hoge.cpp(5): error C2065: 'YouAreFired' : undeclared identifier
652 :
650 :2011/08/21(日) 08:56:20.46
>>651 おお!巧いですね
ありがとうございます
void test() { hoge() // 1 piyo() // 2 // どちらの呼び出しもエラー・例外の確認を行わない } bool hoge() { if (条件式) { return true; else { return false; } } void piyo() { if (!条件式) { throw ex; } } @とAのどっちかが呼び出しの速かったり遅かったりする?
>>653 処理系の実装による。
ただ普通は例外が実際にスローされなければオーバーヘッドは小さい
条件式が真の場合はどちらも一緒。return falseよりthrow exはかなり遅い。
::て名前空間参照ですよね someNameSpace::func()みたいな ::の左側に何もない場合はどういう意味ですか?
グローバル名前空間にあるって意味
意図はつかめませんが意味はわかりました 心に停めてコード眺めてみます。どうも
659 :
71 :2011/08/22(月) 18:20:29.07
660 :
71 :2011/08/22(月) 18:21:33.69
あッ まぁいいか
Linux や Windows における静的ライブラリや動的ライブラリ (lib*.a とか lib*.so とか *.dll)のフォーマットや作り方、 リンカの動作や解析の仕方について、何かよい解説書や Web ページを探しています ご存知の方いらっしゃれば、ご教示下さい
664 :
デフォルトの名無しさん :2011/08/22(月) 20:39:35.22
std::setって何に使ってる? 俺は、リスナーのポインター登録用とか、値の登録済みかの確認用ぐらい。 B木とかに使えるかと思ったけど、ランダムアクセス イテレーター使えないから結局std::vector使う事になった。 なんか、もっと活用できる用途はないのかアレ?
665 :
デフォルトの名無しさん :2011/08/22(月) 21:00:16.75
>>664 ・uniqueするのが面倒なとき
・ユニークな要素が一定個数貯まったら処理をするというロジックを実装したとき
・優先順位付き待ち行列風にデータを扱うとき
>>664 sequence containerに対するuniqueはコピーを伴うので、要素のコピーが重かったり、
イテレータや参照の無効化が困る場合はsetの方が有用。
また引数や戻り値のようなインタフェースとして中身に同じ値が入っていない事を
言外に保証したい時に使うこともある。
構造体に配列みたいにデータを一度にコピーしたりする方法ってあったようなきがするけど やり方忘れました。教えてください。
memcpyすれば それか、コピーと言うより初期化の話なら Foo foo = {値、値…} では
>>668 struct Foo {
...;
};
Foo a, b = {...};
a = b; // ←これで一度にコピーできるよ。メンバにポインタを持つなら代入オペレータをオーバライドしてね
たとえば、配列に音楽のデータが入っていて 配列から一瞬で構造体にヘッダーだけコピーするようなほうほうです。
>>673 だから、代入で済むことをmemcpy()する理由がないだろ。
まさかと思うが、ansi以前のレガシーCのように構造体の代入ができないと思っているわけではなかろ?
>>672 その配列と言うのは、例えばファイルのバイナリイメージがchar配列に入っていると言うことか?
だとしたら、こんな感じ。
char buffer[AnySize];
struct Foo foo = * static_cast<Foo *>(buffer);
>>674 はみ出てもいいんですか?
有難うございます。
あーいけね、static_cast<>()じゃなくてreinterpret_cast<>()ね。 はみ出るって言うか、>674の例だとsizeof(Foo) <= AnySizeでないとダメ。
>>674 いや、一つ二つならそうだけど、POD型構造体配列のコピーとかもちょっと意識してただけ
>>678 構造体配列のコピーと言うことなら納得。取り敢えず、std::copy()を使うけど。
>>674 アライメントの問題があるから、このケースこそmemcpy()の方が安全かもしれない。
逆に、アライメントの問題があるからこそバッファ自体をアライメント境界に置くようにするけど。
アライメントの問題がなくて、参照したいだけならポインタで持っててもいいかと。
struct Foo const * foo = reinterpret_cast<Foo *>(buffer);
一般論として 元の構造体データ -> (シリアライズ) -> 汎用データ -> (デシリアライズ) -> 復元された構造体データ をやりたいときはもとの構造体データの内部表現とシリアライズ方法がわからなければ正しく復元できない
C++0xはアスペクト指向が無いから駄目だ。 終わりだ。
682 :
661 :2011/08/23(火) 18:52:41.45
お前がそう思うんならそうなんだろう お前ん中ではな
ごくたまにクラス定数を基本クラスにしているソースがあるのですが これは正しい実装方法なのでしょうか?
>>684 クラス定数を基本クラス、の意味がよくわからない
どういうこと?
>>685 class ConstXXX {
public:
static const int aaa;
...
};
class XXXXX : public ConstXXX {
....
};
こんな感じです。
>>686 あまりそういう実装が良いとは聞いたことがないし、
わざわざ継承する理由も見つからない。
javaで定数インターフェースという使い方はあるが、
悪い使い方と言われている。
>>686 やはり良くない使われ方ですよね。
どうもありがとうございました。すっきりしました。
ATLみたいなテンプレートライブラリで決められた名前の定数を用意したりとかはあるな class Class : public Base<Class> { enum { A = n }; みたいな。AはBaseの方で使われる
あぁ非公開のままだった protectedかpublicで捉えてね
template<typename A, typename B> struct is_same { static const bool value = false; }; template<typename A> struct is_same<A, A> { static const bool value = true; }; template<typename T> struct IsInteger: is_same<T, int> {}; たぶん別の話だが、こういうメタ関数を作ることはたまにある。
実装はCで行う。 C++は使いたくない。 classは重そう。 VMコンパイル型じゃないので(+ 1 2)とかするたびにインスタンスが作られてしまう 処理系作成のときにオブジェクト思考の概念はいらない 宗教上の理由。 それに Scheme内でのオブジェクトの表現用にScm_Numクラス, Scm_Stringクラスとか作って、そいつらはScm_Objectを継承して…とか馬鹿げてる(と思う)。 ていうかNLispでやって懲りた。 型安全じゃないキャスト(void*へのキャスト)を多用したい
どこの誤爆だ
てめーの日記帳にでも書いてろ
classが重いとか アホがデマばら撒くのやめてほしいわ
わざわざC++スレでやるあたりアホが自分の無能を晒してるだけだな
ぐぐったらどっかのブログのコピペっぽい
イテレーターをつかうとバッファリングされなくて遅い ストリームを使うと一般性が無くなる このホコタテはどうしたら直りますか?
はぁ?
お前には聞いてない。 他の方よろしく。
ホタテおいしい
人をおちょくって楽しいなんて最低の人間だな。 死ねよ。
もう少し人にわかるように聞いた方がいいよ
なんでプログラム板はID表示されないのん(´・ω・`)
重そうってなんだよwww
矛盾とは両立不能な命題が同時に真であるというものだな。 イテレータとストリームの関係のどこに矛盾があるのか?
この板もレベル低くなったな 質問レベルも煽り耐性も
相談しようとして2ch開いてついでにスレ巡回してたら質問内容忘れてしまいましたどうしたらいいでしょうか
忘れるくらいなんだから大した質問ではないんでしょう
相談するまでの人生をやり直せば思い出すのではないでしょうか
711 :
デフォルトの名無しさん :2011/08/25(木) 20:38:20.66
クラス継承は遅いよ
http://codepad.org/vk5y3IX0 36行目,hoge.doSomthing(5) を呼び出したいのですが
35行目で
Line 35: error: invalid initialization of reference of type 'CHoge&' from expression of type 'const CHoge'
となってしまいます.どうやればよいでしょうか?
>>713 CHoge const &hoge = *itr;
>>715 doSomthing は const 修飾してないから、
それじゃ 36 行目でエラーになるだけ
>>714 素直に CHoge をコピーして
CHoge hoge = *itr;
とするか、クラス設計として妥当と判断できるなら
CHoge::x を mutable にする
@@ -7 +7 @@ class CHoge
- int x;
+ mutable int x;
@@ -15 +15 @@ class CHoge
- void doSomthing(int n)
+ void doSomthing(int n) const
失礼、後者のほうに抜けがった @@ -35 +35 @@ int main(void) - CHoge& hoge = *itr; // + const CHoge& hoge = *itr; //
コンテナ内の要素を直接変更することがあるならsetを使うのは妥当ではないな
>>713 みたいな状況では不合理さもでてくるけど整列条件に関わる部分を変更させないために
set内の要素は参照しかさせず直接変更はできない
>>713 setは大小比較の結果が変わると破綻するので、変更が許されていない。
変更しないならdoSomethingをconstにする。
変更するけど大小比較に影響しないなら
for ( auto itr = c.begin(); itr != c.end(); ++itr )
x &i = const_cast<x&>(*&*itr);
720 :
713 :2011/08/26(金) 04:03:43.70
visualC++で char *aargv[]; void p(char *c[]) { } int main (int argc, char *argv[]) { p(aargv); return 0; } と書くとリンク時に error LNK2001: 外部シンボル ""char * * aargv" (?aargv@@3PAPADA)" は未解決です といわれます。 どう書けばいいでしょうか?
そんな馬鹿な書き方誰に習ったの
え?簡略化してるので実際はTCHARのargvをcharのargvに変換してますが……
このスレってCの質問も兼ねてるのかい
まあCでコンパイルできるソースであってもC++でコンパイルしようとしてるなら許容範囲でいいんじゃないか > char *aargv[]; これは配列の要素数が不明なので不完全型であって(ここでは)aargvは定義されない。
スタック領域とヒープ領域の使いわけですが、 C++ではスタック領域をメインとして使うのがいいのでしょうか? C#だとほとんどのクラスのインスタンスはヒープにおくようになっていたと思います。
そうだったのですか。aargvにはmallocしたchar*のポインタ配列を入れてもどってくるけれども、宣言するときにダミーの配列を入れてみます。 くだらない質問だったみたいですが、答えてくださってありがとうございます。
>>727 ヒープでなければならない理由がなければスタック
char **aargv; void convArgv(wchar_t *argv[], char *dst[], int argc) { std::wstring src; std::string tmp; dst = (char**)malloc(sizeof(char*) * argc); for (int i = 0; i < argc; i++) { src = argv[i]; narrow(src, &tmp); //wstring→string if((dst[i] = (char*)malloc(sizeof(char) * (tmp.length() + 1))) == NULL) std::cout << "メモリ確保に失敗した。" << std::endl; strcpy_s(dst[i], tmp.length() + 1, tmp.c_str()); } } int _tmain(int argc, _TCHAR* argv[]) { convArgv(argv, aargv, argc); if (argc > 1) free(*(aargv + 1)); return 0; } と書いて実行すると、下から3行目のfreeで思いっきり落ちるけれども 同じ理由でしょうか?
void convArgv(wchar_t *argv[], char**& dst, int argc) ってやれば落ちないよ
なんですと。書いてみます。
void convArgv(wchar_t *argv[], char**& dst, int argc) { std::wstring src; std::string tmp; char* p; char** aap; dst = (char**)malloc(sizeof(char*) * argc) for (int i = 0; i < argc; i++) { src = argv[i]; narrow(src, &tmp); //wstring→string if((p = (char*)malloc(sizeof(char) * (tmp.length() + 1))) == NULL) std::cout << "メモリ確保に失敗した。" << std::endl; strcpy_s(p, tmp.length() + 1, tmp.c_str()); aap = dst + i; *aap = p; } } できました。こんなかんじです ありがとうございます
friend... 危険スグル... 多用の癖がある奴が入ってきた為に、OOPのプロジェクト壊滅... orz
>>734 次からはJavaでやろうぜ。
つーかfriend制限とかの規約作ってなかったんかい…。
friendも実装の移譲程度の使い方しかしないんなら便利だと思うけどな。
Javaだとfriendもpartial classも無いからswingとか使うと1ファイルの中がごちゃごちゃしてたまらん…。
736 :
デフォルトの名無しさん :2011/08/26(金) 21:55:54.97
悪用厳禁≠全面否定 goto 君だって throw になって名誉回復したし 禿の大嫌いな define だってバリバリ現役
>goto 君だって throw になって名誉回復したし gotoとthrowが同じに見えるなんてかわいそうだな。 throwは呼び出し元に飛ぶもので、コード書いた時点では飛び先が決まってないんだぞ。 >禿の大嫌いな define だってバリバリ現役 テンプレートとconstとインライン関数があるのに、バリバリ現役はまずいだろう。
738 :
デフォルトの名無しさん :2011/08/26(金) 22:56:58.32
>>737 その意味では計算型 GOTO (FORTRAN ではなく BASIC の)なみのワルだよな
コード書いた時点で飛び先が決まってないのは関数ポインタや longjmp でも同じだし
C++ では template 内で多重定義解決させるときも飛び先は知るわけないよな
goto と throw が構造化定理における何者かという本質が見えてないおまえさんこそご愁傷様だよ
assert の代わりに dynamic_cast でも使っているのか?
規格と実装をごちゃまぜにする馬鹿
gotoは構造化を壊すが、常に構造化の上位に向けてスローされる例外は
構造化に反しない。
>>738 はバカなの?死ぬの?
741 :
デフォルトの名無しさん :2011/08/27(土) 01:32:21.20
>>740 おまえが死ねよ
カタカナ表記したからって構造化との関係は変わらないぞ
742 :
デフォルトの名無しさん :2011/08/27(土) 01:51:10.62
寝落ちよろ
構造化を壊す?gotoの使い方ってどんなのっすか?
744 :
デフォルトの名無しさん :2011/08/27(土) 02:15:50.86
寝落ちる
char* p; char a[]; の違いってなに? 同じだよね
上は定義 下は宣言 全く違う
>>745 上はcharへのポインター(アドレス)を格納する変数の宣言および定義。
下はcharを複数格納する配列の宣言。要素数は決まっていない。
748 :
デフォルトの名無しさん :2011/08/27(土) 23:49:33.89
多次元配列に関する質問です。 Nを自然数としてN次元配列を扱いたいとして、 二次元や三次元などNが事前に決まっている場合は 問題ないのですが、このN自体を変数として実行時に N次元配列が二次元だったり三次元だったりするような コーディングは可能でしょうか? かなりテクニカルな実装になっても構わないので もし可能でしたら教えてください。 よろしくお願いします。
1次元配列を動的に確保して普通にインデックス計算するだけでおk
>>748 float* array;
array = new float[3 * 4];
delete[] array;
もしくは、
std::vector<float> array;
array.reserve(3 * 4);
で、いいんじゃね?
751 :
デフォルトの名無しさん :2011/08/28(日) 00:31:31.36
>>749-750 確かにそれも一つの解決ではあるのですが、
あくまでも目的は多次元配列として扱うということになります。
理由の一つとしては、多次元配列の構造を持っている1次元配列の
演算の手間があります。実際 M_1*M_2*... M_N というN次元配列を
1次元化する場合、インデックスの変換は
(m_1, m_2, ..., m_N) -> sum[n=1 to N] m_n product[k=n+1 to N] M_k
となりますが、こうやって作成した1次元配列の演算が非常に面倒になるため
各種演算の手間を軽減するために多次元のまま扱いたいのです。
配列ラップしてoperator ()とか使ってカプセル化すれば?
と、考えていましたが
もしかしたら高次元の場合でも
そんなに手間でもないような気もしてきました…
もう一度考え直してみます。
(ずっとageてしまってました。すみません)
>>752 それは配列要素を持つクラスを作成して、そのクラスに
利用したいオペレータを追加する、ということでしょうか?
これも検討してみます。
次元が静的なのか動的なのか
>>751 仮にちゃんと多次元配列作っても、大抵の処理系じゃ内部の
アドレス計算は一次元配列と同じになるのでは?
>>751 > こうやって作成した1次元配列の演算が非常に面倒になるため
どこがどう「非常に面倒」なんだ?
ツリー構造を作ればいいんじゃないの template <typename T> class Node { public: virtual Node & GetChildNodeByIndex(size_t index) = 0; virtual T & GetValue() = 0; }; template <typename T> class ValueNode { public: virtual Node & GetChildNodeByIndex(size_t index) { throw x; } virtual T & GetValue() { return this->value; } private: T value; }; template <typename T> class ContainerNode { public: virtual Node & GetChildNodeByIndex(size_t index) { return this->childNodes[index]; } virtual T & GetValue() { throw x; } private: boost::ptr_vector<Node> childNodes; };
あ、NodeはValueNodeとContainerNodeのスーパークラスね
イテレーターって下位互換性だと思っているひと多いですよね。 OUTPUT ITERATORはITERATOR同士を比べて終端を調べられないから下位換性無いですよね イテレーターって互換性みたいなのは無いと考えるべきかOUTPUT ITERATORを例外とするのか どう考えればいいですか?
別物です
>>759 図にするとこんな感じ。OutputとInputがそれぞれ基底にあって、一本道の関係ではない。
┌→Input Iterator
├→Output Iterator
Forward Iterator
↑
Bidirectional Iterator
↑
Random Access Iterator
だから、Input Iteratorであればよいという状況ではOutput Iteratorがのけ者に感じるだろうけど、
逆にOutput Iteratorであればよいという状況であれば今度はInput Iteraotrがのけ者に感じる、ということだって起こる。
よくわからないからベン図で表してくれ
いいね!いいベン図だよ!
outputだけ仲間はずれだな。
そういえばイテレータって結局なんなのか把握できてなかったな
発音するときもイテレーターって伸ばさないやつが出てきてうざいから イテレータという書き方止めてくれる? どうしても伸ばしたくないならイテレートルといえば?
単にfor文のインデックスにオブジェクトを格納するというだけだろ
いや、構造とデータの分離。
メインはメーンな
インデックスをインデクスというやつもウザイ。
>>769 三音以上の(カタカナ)英語の語尾に長音をつけないのって、
JISでそう決められてるんじゃなかったっけ
パソコン通信で情報量を減らすために語尾を延ばさないようにしたのが始まりだろ。 昔は一文字いくらとか決まってたらしいし。
インデックシング
メートルでもメーターでもなくメータというやつとか テンソルでもテンサーでもなくテンサというやつとか ブチ殺したくなる。
知らんがな。
インディクス
783 :
デフォルトの名無しさん :2011/08/29(月) 16:35:34.40
禁書 idx;
無駄に「ヴ」を使ってる奴は後ろから頭を引っぱたきたくなる
ヴぁーか
クラスメンバvoidポインタって宣言できますか? 自分のクラス内のクラスメンバポインタを集めたコンテナをstaticで用意したいんだけど・・・
できるよ
余裕。
素人には無理だ 怪我をしないうちにうちへかえんな
自分のスキルより少し高いものをやる、 それが成長へのコツ
自分でやればわかることをわざわざにちゃんで聞いてる時点で…
C++のクラス設計 or 実装についての質問です。 汎用的な通信手続きを定義した抽象クラスAを継承して、 実際の通信を行う具象クラスB、具象クラスCを定義しました。 実際に通信を行う関数Dに Aのポインタを引き渡して処理をさせようと思うのですが、 この場合、関数Dを呼び出す側が具象クラスBまたはCを知っている必要が あると思うのですが、こういうものなのでしょうか? 実装の詳細を知りたくないために抽象クラスを使用して処理できるようにしたのに、 具象クラスの内容を呼び出し元が知っている必要がある事に違和感を感じたのですが。
> 関数Dを呼び出す側が具象クラスBまたはCを知っている必要が あると思うのですが いいえ
class Hoge { private: int x, y; bool flag; class Statics { public: Statics() { this->members.push_back(&Hoge::x); this->members.push_back(&Hoge::y); this->members.push_back(&Hoge::flag); } std::vector<void Hoge::*> members; // 'void' 型が不適切に使用されています。 } static statics; }; できません><教えてください><
>>795 むちゃくちゃなコード書きやがるなwwwwww
Hogeクラスのメンバをstaticメンバに保存しておきたいってこと?
>>793 抽象化に失敗しています
設計からやり直しましょう
>>793 ファクトリ関数Eがあるなら呼び出し側はA、D、Eだけ知ってればいんじゃない
>>796 そうそう、staticなコンテナ(
>>795 ではHoge::staics::members)に追加するのは何時でもいいんだけどね
800 :
793 :2011/08/29(月) 23:44:47.50
回答ありがとうございます。考え方に問題がありそうなのはわかったのですが、 下記のようなコードに対してどんな形で対応すればよいのでしょう。 というか、そもそも具象クラスの情報はどこが持つのが 良い設計なのかわからなくなってきました。 class A { A(); virtual ~A(); }; class B : public A { B(); virtual ~B(); }; class C : public A { C(); virtual ~C(); }; void D(class A *p) { } int main() { // Dを呼び出す際にはB or Cの型情報が必要? D(new B()); return 0; }
>>800 DからみてB,Cは抽象化されてるからそれでいいよ
どこまで抽象化したいかは場合による
必ずどこかで具体的なクラスを生成しないといけない
>>800 例えばの話、BとCの抽象クラスAが存在しなかったのなら、関数Dは
void D1(B * p)
void D2(C * p)
の2つ必要になる
処理内容がほぼ同じ関数を2つ記述しなければいけない
>>799 保存しておきたいのはインスタンスのポインタ?値?
保存しておいていつそれらは削除するのか?
クラスがコピーされたときの挙動は?(コピーコンストラクタと代入)
このあたりで実装の仕方がかわるから、そこんとこkwsk
>>803 クラスメンバであるインスタンスを指すポインタを保存したいのではなく、
クラスメンバであるインスタンスを保存したいのではなく、
クラスメンバへのポインタを保存したい
クラスstatic変数であるコンテナクラス(vectorなりlistなり)に保存しておき、削除は行わない
static変数に保存するので、コピー操作には関わらないはず
805 :
793 :2011/08/30(火) 00:07:16.51
>>801 >>802 ありがとうございます。
抽象化のやり方としては間違っていないのですね。
関数DにとってはAという抽象的なクラスで操作できるので抽象化できている、と。
となると、後の悩みはどこで具体的なクラスを生成するかのようです。
作ってるアプリケーションによってもやり方は違うようなので、
オープンソースのアプリでも見ながらちょっと考えてみます。
ありがとうございました。
>>804 一度インスタンス化したオブジェクトが破棄されると
staticに無効なポインタが保持されたままになるが大丈夫か?
またメンバ関数へのポインタは、
クラスのポインタがあれば取得できるから、保存するならクラスのポインタかな
こういうことがしたいんじゃねとエスパー #include <stddef.h> class Hoge { private: int x, y; bool flag; class Statics { public: Statics() { this->members.push_back(offsetof(Hoge,x)); this->members.push_back(offsetof(Hoge,y)); this->members.push_back(offsetof(Hoge,flag)); } void* MenberToPointer(Hoge* p, size_t idx) { return void*(char*(p) + menbers[idx]); } std::vector<size_t> members; } static statics; };
>>808 書いただけでコンパイルもしてないからわからんが別にHogeが継承されてても使える気はする
てかこんなコードやめとけ考えなおせ
offsetofを使って正しい結果が返ると保障されているのはPODの場合だけ
>>809 だが・・・メンバ変数に・・・C#でいうところの"属性"を持たせたいッ・・・!
属性の1つとして"プロパティ名"を持たせて、ハッシュに保存したいんだ・・・ッ!
というか、これができると繰り返し記述しなければいけない部分が減って俺得になる
>>810 なるほど・・・
クラスメンバ全てにPOD性を強要することはできないから厳しいかな
てかswitch〜caseでメンバのポインタ返しても同じ動作だと思うが 配列に入れたい理由をもう一度考えてみるべき
なんか言ってることがずれてる人(たち?)、メンバポインタ・メンバ関数ポインタを勉強しとけ(普通のポインタとは違うぞ)
うむ・・・説明している間に何かがおかしいことに自分で気付いた感 一旦構造を見直してみるわ
the Bends
>>795 できた・・・
template<typename T> void push_back_member(T (Hoge::*p)) { members.push_back(reinterpret_cast<char Hoge::*>(p)); }
template<typename T> T (Hoge::*nth_member(int n) const) { return reinterpret_cast<T Hoge::*>(members[n]); }
・・・できたが、 nth_member() の宣言に死相が出ている。
817 :
816 :2011/08/30(火) 01:59:14.85
>>817 なるほど、すばらしい
> members.push_back(reinterpret_cast<char Hoge::*>(p));
「pod型名 Hoge::*」にキャストしてまとめればよかったのか
自己流で少し整理&色々追加
インスタンス関数にプロパティ名をつっ込んで、インスタンス変数へのポインタを取得できるようにしてみた
http://codepad.org/O2ZCNV14
>>818 あー、要らない括弧を付けすぎていたのか。
T Hoge::* ってわりと素直に使えるのね。
>>818 > (p->*get_member_by_name_core<char>(name)
reinterpret_cast で作ったポインタは元の型に reinterpret_cast で戻してからじゃないと使えないよ。
これだと全部のポインタを char Hoge::* として使ってるから、元々 char のメンバ以外に使うと
未定義動作になっちゃう。
質問です。 下記のようなコードにおいて、test1 ってなにものになるんですか? class CTest{ }; int main(int argc,char* argv[]) { CTest test1(); return 1; }
CTestのインスタンス
>>823 私もそう思ってたんですが、下記のコードはコンパイル通りません。
こんなエラーが出ます:
request for member `func' in `test1()', which is of non-aggregate type `CTest ()()'
以下コード:
#include <stdio.h>
class CTest{
public:
void func(){printf("func.\n");};
};
int main(int argc,char* argv[])
{
CTest test1();
test1.func();
return 1;
}
void func(){printf("func.\n");};←' ; '要らない
>>825 ?
補足すると、
CTest test1;
と書いた場合はもちろん正常に動作します。
CTest test1();はCTest型を返すtest1関数だと解釈されてしまってる
824 ではないが、 CTest test1; のような気がする、なぜなら CTest test1 = CTest(); だとコピーコンストラクタが動くことになるが、そうならない方法もあったような。
>>827 おおお、そうか、なんか引っかかってたんだそういうことかー!!?!!
ありがとうございますありがとうございます。
改定新版 C++基礎講座 impress が間違ってるのか。8.6.2あたり CTest test2(CTest test0); // test2.func() // test0.func();
>>830 ユーザー定義型のせいでまどわされないようにCTestをintに置き換えてみよう
int test2(int test0);
「C++で最も奇妙な解析」ってやつだっけ
178 :名前をあたえないでください :2011/08/23(火) 02:49:19.37 (p)ID:IWpZ4iGT(2) 某メディアの人間だが、こんなお話が。 ・フジの話は広告業界では大いに話題になっている。フジは火だるま状態。 広告をまともに出せないんじゃないかというレベル。 ・韓流問題も大きかったが、あのタイミングでセシウム米問題が出たのが致命的だった。 あれでミキハウスがフジ系列から完全に手を引いた。 他のスポンサーも一気にフジから逃げ始めている。 ・セシウム米がなかったらここまで大きな広がりになっていなかったかも。 韓流との合わせ技で、「このメディアはもう終わっているんじゃないか」という認識が広がった。 やはり米という日本人の琴線に触れるところでやらかしたのが厳しかったのでは。 ・収拾はつかないかも。落としどころがないから。 それこそ全面謝罪して解社的出直しやるしかない。
VS2010にて. コンストラクタにサイズ渡したらそれで固定, 要素もそこで保持するだけで解体されるまでそのままなコレクションがほしいんだ とりあえずunique_ptr<T[]>で保持してたんだけど, どうせならbegin-endのiterationくらい使ってみたい(STL自体とC++11の新要素平行して学習中) 静的なサイズじゃないからスタックには置けない=arrayは使えないけど 可変でなくていいからvectorは十分にしても必要ではない気がする. 丁度必要十分なコンテナって(準標準くらいまでのイメージのライブラリで)存在する? それとも,サイズ変動なければvectorより速くはほぼならないから要らないってことだろか.
boost::array
>>835 arrayってその意味合いのつもり.
…std::arrayとboost::arrayってできること変わってないよね?
arrayって生の配列の単なるwrapであって,
コンパイル時点でサイズ決定してなきゃだめだよね.
サイズはTemplate引数だったと思うし.
実行時に大きさ指定できるのであれば確かに理想.やり方知りたい
boostでいいならunique_ptr<T[]>にboost::make_iterator_rangeかませればいいんじゃないか まあ素直にvector使えよってかんじだけど
俺はそれで悩んだ結果、std::vector<unsigned char>とかを使うことにした
素直な方法がvectorでいいのならそれでよかったんだ 疑問に思えたのに知らないままにして,変な自己流通してたら勿体無いな,と. 折角だからmake_iterator_range調べてみる,ありがとう
なんか書き方がうざい
馬鹿の考え休むに似たり
ネット上のファイルをダウンロードするにはどうしたら良いでしょうか? 環境は Linux、GCC です。
「猫ネット」本にやり方書いてあった
wgetでいいよ
845 :
842 :2011/09/01(木) 18:43:00.26
>>843 >>844 ありがとうございます。
現在Perlで行っている処理を高速化するためにC++で書き換えています。
Perlではネット上から取得したhtmlファイルなどを
直接変数にぶち込む手段(LWP::UserAgent)が用意されています。
C++で、system( "wget URL -P dest-dir") を行った場合
一度ファイルが生成されてしまうため、
ほぼ同じアルゴリズムのC++とPerlのプログラムを比較すると
HDDへのアクセスとメモリへのアクセスの差から
Perlの方がスクリプト言語ながら圧倒的に早い結果が出てしまいます。
何か対策は無いでしょうか。
できればLinux環境が良いですが、VC++で何とかならないか、とも考えています。
vcならwininetでも使えば これ以上はスレチ
>>845 curlとかでも使うと楽かもね
ネットワークのプログラムスレにでも行くといいよ
849 :
845 :2011/09/01(木) 22:07:11.23
>>849 C++なら、普通に boost::asio が真っ先に出るべき
ついでに、 boost::thread も使いたくなると思うので、合わせて見るべき
ダウンロードだけなら、30行も書かずに望みは叶うとおもうよ
特にスレチでもない
ちなみに、WindowsでもLinuxでもUnixでもおk
class Base { // 仮想デストラクタを持たない }; class Derived : public Base { }; Base * p = new Derived(); delete p; これは未定義動作のはずだけど、 Derived * p = new Derived(); delete p; Q. これは許可されていますか?
されてます
おkありがとう
国家公安委員会委員長に山岡賢次
何コレwwwwwwwwwwwww死ぬの?
http://ja.wikipedia.org/wiki/%E5%B1%B1%E5%B2%A1%E8%B3%A2%E6%AC%A1 山岡 賢次(やまおか けんじ、旧氏名:藤野 賢二、ふじの けんじ、旧氏名における旧姓:佐藤、金子、1943年4月25日 - )
は、日本の政治家。衆議院議員(5期)。パチンコチェーンストア協会政治分野アドバイザー[1]。健全なネットワークビジネス
を育てる議員連盟顧問。
民主党副代表、民主党広報委員長。民主党国会対策委員長、参議院議員(2期)を歴任。
パチンコチェーンストア協会政治分野アドバイザー
wwwwwwwww
吹いたわwwwwwwwwwwwww
言語習得に役立つ本か資料を教えてください。 記述の方法とかはVBやってたんで分かります。 無数にある関数とかそれを使ったプログラムなど 自分でガリガリコーディングする題材になりそうなものないですか?
857 :
デフォルトの名無しさん :2011/09/03(土) 20:43:15.34
禿本 演習問題てんこ盛りで「答えはこれ1つ」と押しつけてこない
c++がわかったらc言語も理解できんの?
なぜ未だに時代遅れのCなんか使っている人がいるのか という点で理解できない
ガベージコレクションがないとやっぱきつい
>>859 CでかいたらC++より高速でサイズが小さい。
ライブラリが貧弱だけど、なんでも自作できるひとがCをつかうから問題ない
>>861 CとC++で同じプログラムについて実行速度やバイナリサイズに差が出るわけないと思うんだけど、
なんかそんな差を生じるような違いってあったっけ?
いつの時代の話してるんだよw
C言語でC++の機能をより高速かつ軽量に実装できるのか?
なぜC++の機能を実装する必要がある 実装したいのは作るプログラムの機能であって、C++の機能を実装したいのではない 目的と手段を入れ替えるのよくない
C言語でC++の機能を(使うより)高速かつ軽量に実装できるのか? 括弧内が省力されてるだけでしょ
STL使うより自分で自己参照型構造体使ってリストとか実装した方が早いし軽いだおr
それC++でもできるでしょ?
Cランタイムもサイズ大きくて邪魔だよな必要な部分だけ自分で書いた方が早いし てかそもそもCコンパイラとか存在意義が不明だし 普通にバイナリエディタでEXEやELFファイル書けばいいし
なら半田ごてで電子回路設計からやれや
871 :
デフォルトの名無しさん :2011/09/04(日) 08:03:28.98
半田ごてで電子回路設計なんかできるかよ
朝鮮人はミスを謝らない
HDLでかいたらCより高速でサイズが小さい。 ライブラリが貧弱だけど、なんでも自作できるひとがHDLをつかうから問題ない
何度も言っているけどC++の標準ライブラリですら使えない環境があるんだよ
人が環境を変えるのを待つんじゃない お前が環境を変えるんだ!
それがどうかしたのか
クラスの継承も使っちゃダメって言われるところもあるな
そういう環境でならC風のクラス実装を使えばいい C++の言語の継承機能はべつに使わなくてもいい
それは底辺だね
開発ツール売りたいところがC++を推してきたけどそれももう過去の話 ところがSI業界だけはいまだにC++が最先端だと思ってるという
継承の使い道がいまいちわからない
大手でも底辺
業務系ソフトを作るならC#(とくかく楽) 速度を求められるソフトを作るならC++(ゲーム開発はこれいったく←【なぜか変換できない】) 本当に資源が限られたファームウェア開発とかならC(保険の意もかねて)
C++の速度が問題になるのは仮想テーブルのポインタを参照するからだろ stlで処理速度が気になるなら、自前でありきたりなデータ構造実装しなおして、 テンプレートメタなプログラムでも書けば早いんでねーの? 最近の新しい言語を色々と齧ったおかげでか、実はc、c++だけで良い気がしてきたぞ
リファクタリングさえし易ければ・・・ 構文解析さえし易ければ・・・
clangに期待しましょう
本当に倉田ら無い質問ですけど。 STLのスタックってベクトルみたいにサイズ超えたらゼンコピじゃなくて? リストみたいに一個ずつくっつけていく形式ですよね。 言い換えるならpushの時間は常に不変ですよね?
第2テンプレートパラメータに依る
じゃあ、デフォでお願い致します。
stackのデフォのコンテナはdeque
dequeのpush_backは定数時間なので dequeを使ったstackのpushも定数時間です
すいませんGCCのマクロの使い方の説明してあるサイトおしえてください。
※次のレス参照 @では const ポインタを渡されるような条件・場合では、渡されたポインタが指す先を変更しない クラス Hoge はコンストラクタで渡されたポインタ(pTarget)を対象に何かしらの処理をするクラスなんだけど、const と 非 const のどちらでも受け取れるようにしたい どうやって記述するのがおすすめ?
896 :
895 :2011/09/07(水) 17:35:40.42
@ class Hoge public: Hoge(Piyo * pTarget) : pTarget(pTarget) {} private: Piyo * pTarget; }; Piyo p; const Piyo pc; Hoge(&p); Hoge(const_cast<Piyo *>(pc)); A class Hoge public: Hoge(Piyo * pTarget) : pTarget(pTarget), pTargetConst(NULL) {} Hoge(const Piyo * pTarget) : pTarget(NULL), pTargetConst(pTarget) {} private: Piyo * pTarget; const Piyo * pTargetConst; }; Piyo p; const Piyo pc; Hoge h1(&p); hoge h2(&pc);
897 :
895 :2011/09/07(水) 17:38:28.20
あ、
>>896 は目標を達成できる記述の例であって、他の方法があれば教えて欲しい
どっちでも受け入れるならconst操作しかしないんだろうと考えて struct Hoge { Hoge(Piyo const * p) : p(p) {} private: Piyo const * p; }; どっちも受け入れて非const操作をするならバグの元なので別の方法を考える
899 :
895 :2011/09/07(水) 18:09:21.81
いや、そういう回答は要らないんで 非 const ポインタを渡されるパターンでは、渡されたポインタが指す先を変更する const ポインタを渡されるパターンでは、渡されたポインタが指す先を変更しない
ポインタと同時に変更するかどうかのフラグ持つだけでいいじゃない
>>889 ,893
vectorでもlistでももちろんdequeでも末尾での挿入・削除は定数時間。
ただしここでいう定数時間は計算量が要素数には依存しないという意味で
処理時間が常に不変という意味ではなく、規格では具体的な処理時間についてはなにも保証しない。
>>899 人が親切に馬鹿なことやめろって忠告してやってるのにね
独学じゃアホなコード大量生産するだけだぞ
903 :
895 :2011/09/07(水) 20:16:45.14
>>902 >>898 > Piyo const * p;
これは未熟者の自分からみて比較的珍しい、カッコイイ記述ですね
うわ…
>いや、そういう回答は要らないんで ↑こういう一言が余計で、そして態度悪い。 他人に、案なり答えなり尋ねてるんじゃないの?って言う。 人間性疑うわ
906 :
895 :2011/09/07(水) 23:14:20.40
>>905 お前は揚げ足取って
> struct Hoge {
> Hoge(Piyo const * p) : p(p) {}
> private:
> Piyo const * p;
> };
みたいな馬鹿な回答した奴を擁護するつもりか?
態度が悪い回答者が質問者を弄るのはよくある話だ
俺はその回答(?)者をさらっと投げ捨てただけだし、何も問題はない
そして質問内容は事故解決したから、もういい
下らない論争も勘弁
907 :
デフォルトの名無しさん :2011/09/07(水) 23:23:28.83
>>906 もういいんなら消えろよ、ゴミレスしてねえで
もうよくねえんだろ? 毒吐きてえんだろ? おい便所虫
>>906 擁護とかどっちの味方みたいな話じゃなくて、
実際に目の前でこんな話してたら、普通は相手が例え馬鹿な回答したとしても、
「すみませんが、そうではなくて」 と、「意図の説明」 をするだろっての。
伝わってなかったのかなと。 解決させたくて話しかけてるんだから。
どっちの擁護とか、そういう発想やめなさい
909 :
895 :2011/09/08(木) 00:28:22.36
>>898 の回答が「解決させたくてしたレス」に見えるのか?
俺には人をおちょくっているようにしか見えない
1. 自分がそのおちょくりに対してガッカリしてしまった
2.
>>898 がアホなレスをした
ただそれだけの話
>>907 安価されないor話題に飽きたら消えるよ
実は
>>899 を書いた直後に達成してた。それはもういいです
>>909 違う。解決させたくて話しかけてるんだから、伝わらなかったら意図の説明するだろってのは、お前の事。
「どっちがおすすめ」 か聞きたかったから、このスレの人間に話かけたんだろ?
それで望まない返答もらったんだろ? その時、伝わってなかったのかなと、
もしも目の前で話をしてたら、質問の意図をお前は説明して、解決に向かおうとするだろ?
他人のことじゃなくて、お前自身の事だよ。自省と会話の話だよ
そして
>>898 のレスは、別におちょくったんじゃなくて、彼はそう思ったんじゃないの?
それに対して無礼な態度を取ったのは
>>895 の方に見えるよ。読み返してごらんなさい
まるで自己中な子供だ
まだ夏休みだっけ?
913 :
デフォルトの名無しさん :2011/09/08(木) 00:47:58.89
>>909 なるほど、安価しておちょくって欲しいのかマゾ野郎
便所の落書きとコーラスがそんなに楽しいかいw
914 :
895 :2011/09/08(木) 00:56:41.35
>>895 >@では const ポインタを渡されるような条件・場合では、渡されたポインタが指す先を変更しない
(また、Aでは const ポインタと非 const ポインタ 2 つを保存しようとしているので、const・非 const 操作どちらとも使用としていることは明白)
>>898 >どっちでも受け入れるならconst操作しかしないんだろうと考えて ...
>... どっちも受け入れて非const操作をするならバグの元なので別の方法を考える
const操作しかしないんだろうと → まず質問をよく理解してないか、天邪鬼なレス
別の方法を考える → 思考停止、または質問の投げ捨て
だから必要無いと答えたんだよ?
>>914 型消去とoperator ->使えばいいよ
これで完結なのでもう寝ようね
916 :
895 :2011/09/08(木) 01:02:21.37
あぁ、よく見たら最初から質問に答える気が無かったんだな
>>902 >人が親切に馬鹿なことやめろって忠告してやってるのにね
だからそういう(
>>898 )レスをしたんだね
そしてそこまで目標じゃないだろうに、何で止めてくれたのかね
917 :
デフォルトの名無しさん :2011/09/08(木) 01:04:03.49
>>914 > まず質問をよく理解してない
何か悪いのかよ?
理解して欲しいのは誰だよ?
おまえ努力の方向が間違ってるんだよ
コンパイルエラーするたびに規格票を破り捨ててるようなものだ、ただのキチガイ
大体この糞クラスをどこでどう有効活用するのかが気になる
919 :
895 :2011/09/08(木) 01:14:30.72
質問した内容が分からないのであれば、そう言ってくれなければ質問者も分からない
アプリが動きません><→windows再インストールしろ と同じレベルの回答をしておちょくられたから、
「あ、これは相手にされてないし、相手するのも無駄だな」と思った
馬鹿にされたから馬鹿にし返した。それだけの低レベルな話だろ
>>918 お前は糞ライブラリ糞クラスの改修を手伝わされる気持ちがわかりますか?
このレベルの人間にライブラリ任せるのはまずいだろ
あ、任せるような企業だから
>>896 みたいなコードになるのか
なんだ底辺だったのか それなら心が荒んでもしょうがない かわいそうに
922 :
デフォルトの名無しさん :2011/09/08(木) 01:33:00.89
>>919 おまえ、こう言っただろ
> まず質問をよく理解してない
> そう言ってくれなければ質問者も分からない
どっちなんだ?
矛盾した話が通じないのは、その話をした者以外の誰にも責任ないぞアホ
923 :
895 :2011/09/08(木) 01:44:27.92
む、矛盾・・・? どの内容がどの内容と矛盾しているのか教えてくれ。語尾に色々付けたがる君
通りすがりにエスパー 質問者の質問内容が理解出来なかったら、回答者は「日本語でおk」と返せ と言ってるんだろう
>>919 はなんで逆切れしてるの?質問する人間の態度じゃないよね
926 :
デフォルトの名無しさん :2011/09/08(木) 01:48:22.63
>>923 はははは、世の中みんな「天の邪鬼」ばっかりで気の毒だねー
お前ら明日も仕事だろ寝ろ おれは休みなんで夜更かし(^^)
928 :
895 :2011/09/08(木) 02:03:48.06
>>924 お前はそれで心が許すのかもしれないが、俺が何かしらの質問に応答するときはそんなことは言わないな
答えられる可能性があるのであれば分からない点を質問者に尋ねる
答えられそうに無いのならそもそもレスしない
>>925 誰もキレていない。既に論争ごっこの場になってるだろ
本当にキレてるか、単なる・・・まぁいいや。そういう奴が1人紛れてるがな
はー流石に疲れた
そろそろ俺は抜けますよ。逃げじゃないっすよ?俺を逃げさせたら大したもんですよ
929 :
デフォルトの名無しさん :2011/09/08(木) 02:11:10.76
自意識過剰もここまでひどいと病的だな どこの馬の骨とも知らんやつが、どう応答したかろうが、疲れようが、逃げようが、公衆にとってどうでもいい よっぽど聞いて欲しかったんだろうな、もっと身近な人に言えばいいのに 駅前で不特定多数を叱り飛ばしてる危ないオヤジそのものじゃんw
逃げじゃないけど疲れたって…… まぁいいや、今日は何をほざいてくれるのか楽しみに待っていよう。
環境依存かもしれませんがテンプレートの特殊化って数に上限はあるのでしょうか。 極端な話、1万くらい特殊化したクラスを作れるでしょうか。
メモリ許す限り問題なかったはず、 再帰的な特殊化ならデフォルトオプションのVC++2010で約500前後が限界。
>>901 亀レスだがvectorの末尾に追加は要素数に依存するんじゃないか?メモリの確保にいった場合
平均すると同じくらいの時間になるようになってるとかはあった気がするけど
934 :
デフォルトの名無しさん :2011/09/08(木) 22:43:11.23
要するにどのような保証もできませんてことだろ
935 :
931 :2011/09/08(木) 22:58:03.63
>>932 ありがとう。普通の特殊化なので少し安心しました。
使ってるのがBCBでまだちょっと不安なので問題が起きた時
対処可能に書いときます。
vectorの末尾追加は償却定数時間だな
キャパシティをオーバーした時ってコピーが走るから定数時間ってのも変じゃね。
空きが足りなくなるたび1024要素の領域をリストとして追加、 読み出し時にリストを結合して1配列化。 結合した領域に空きがなくなると、また1024要素の領域を 結合した領域に続けてリストとして生成。 こんなコンテナ作ったらO(1)のvectorより、たやすく10倍以上の速度を出せた。 しかし、最適化を書けたstringの+=には全く勝てんかった。 アレはどうなってんだ?化物みたいにはええぞ。
>>939 そういうのは等価でない処理を比較してて結局正当な比較になってないことがほとんど。
>>940 char型ないしintを放り込むなら、
stringで+=もvectorでpush_backも条件は同じじゃん。
char[]を突っ込んだりするなら話は別だろうけど。
>>941 実際に比較に使ったコードを曝して味噌。
ついでに、コンパイラとコンパイルオプションもね。
本人は気付いていないところで等価になっていないんじゃないかと私も思うよ。
stringで思い出したけど、 std::stringとMFCのCStringでは、どっちが速いのでせう?
知らないけどその2つは速さで使い分けるもんじゃないだろ
i18nとl10nが関係ないなら、比較対象になるかと思ったんですがね。
qsort() はコピーが発生する時 1 バイトずつコピーして遅いから std::sort() を使いなさいって言われた 16 歳の夏
コールバック呼び出しのオーバーヘッドもあるな
>>940 要素の追加が多くて参照が少ない という条件下なら
vectorよりも
>>939 のコンテナが速そうだと思うけどな
測定後ボトルネックがわかったら
特定条件下で速くなるようなコンテナを作ることはたまにあるよ
可変長引数による文字列生成処理を自前で書く際、 Cならvsprintf()(かその安全化版)のお世話になると思うのですが(例↓) int custom_varstring(char* buf, size_t n, const char* fmt, ...) { va_list ap; va_start(ap, fmt); int r = vsprintf(buf, fmt, ap); va_end(ap); return r; } いまどき固定長のバッファ(上の例のbuf)を呼び出し元で用意するとかダサい気がします。 C++のostream風にすっきりstd::stringな世界だけで解決したいのですがどうすればよいのでしょうか。
>>949 バッファの確保をしながら vsprintf() を呼び出す関数を作るとか、
boost::format 採用するとか。
>>950 dクス
バッファを確保しながらvsprintf()を呼び出す方向でやろうかと思います
よく考えたら、printf()風の書式指定とか引数省略記号"..."とかはCの世界の遺産なので、
C++の世界にそんなもん持ち込むからにはコードがダサくなるのも仕方ないかなという気がしてきた、、
可変長引数一般の実現について言えば、ostreamの<<演算子みたいなものを自前で実装して
呼び出す人にもそれを使ってもらえば良いわけだし(boost::formtの%もこの方針ぽい)
可変長引数テンプレートを使おう
>>942 ごめん。古い話だからコンテナ部分しか残ってないわ。
コンテナ晒すから、自分の納得するようにベンチしてみて。
あと、コンテナの内部的に使うことを目的としてたから、
バイトデータがベースでジェネリックじゃない。
そのへんも納得するようにやってみとくれ。
http://codepad.org/enAH4P4O >>948 そうだね。参照は頻繁じゃなく、散発的な追加が多い状況を想定して作ったよ。
ま、それにしてもstringの+=の速さは異常。
>>949 ostringstreamの事いいたいんじゃないの?
そんなおもちゃは作ってないけど、 CADは仕事で作ったな。
>>955 それC++で作ってるらしいけど、料理出来ないの?車磨けないの?って言った?
>>958 そういやうちのコンパイル形式書いてなかった。これだけ。
gcc -O3 source.cpp
そっちはVC?
codepad: BinalyPool; 90000 vector<Byte>; 120000 vector<Byte>::reserve(cnt); 130000 deque<Byte>; 110000 basic_string<Byte> 120000 //面倒なんで型名省略 g++: time: 70000 time: 130000 time: 150000 time: 100000 time: 120000 clang: time: 60000 time: 140000 time: 130000 time: 100000 time: 100000 なるほどね。 前見たときは、string最強だったんだけど なんか条件が違うんだろうね調べてみるわ。
> string最強 basic_string& operator+=( const charT* s); に途中に'\0'を含む配列を渡してて途中までしかコピーしてないと推測
963 :
962 :2011/09/12(月) 02:35:30.19
あっ、下のURLは忘れてくれ c_str()は内部バッファへのポインタを返すメソッドだと勘違いしてた
964 :
958 :2011/09/12(月) 09:10:17.73
class Hoge { static const int DefaultValue = 3; // 1.1 static int GetDefaultValue() { return 3; } // 1.2 static const std::vector<int> EmptyVector; // 2.1 static const std::vector<int> & GetEmptyVector() { static const std::vector<int> v; retrn v; } // 2.2 }; 1.1 と 1.2、2.1 と 2.2 は、それぞれどちらを定義するべき? 場合によるのであれば、どういう条件で使い分けるべき?
別にどっちでもいいけど メンバ関数にした場合は、あとで中身をいじれるってよく言われるね
空のvectorをコピーする意味が判らん。 clear()が用意されているんだからそれで充分じゃないのか? もし必要なら、初期化するメンバ関数を用意してその中でclear()を呼べばいいし。
馬鹿は無理して発言しなくていいです
2.1と2.2のような使い方に関しては、 初期化タイミングをコントロールできる/できないという違いが 選択基準になることがあるかな。
constexprがない環境だと1.1はコンパイル時定数として使えるが1.2は使えないからその辺を気にするときとか int i1[DefaultValue]; // 可 int i2[GetDefaultValue()]; // コンパイルエラー
コンパイル時に必要なら1.1 それ以外なら1.2と2.2 初期化のタイミングがいつでもいいならその日の気分で良い
だれか つぎすれ たのむ
断る
立ててくる
誰だこのはげおやじ
Bjarne Stroustrupの悪口はそこまでだ
978 :
965 :2011/09/13(火) 21:00:29.81
レスありがとう 初期化順序がどうでもいい変数については 1.1 または 2.1 の記述を使うようにします
>>978 空のvectorを返す理由を、馬鹿な私にも分かるように説明プリーズ。
そもそもデフォルト値をクラスのメンバーで表現する事が変だけどね。 普通は、デフォルト値を表すオブジェクトを用意すべき。 それをクラスでやるかファクトリーの形で提供するかは 好きにしたらいいけど。
>>975 テンプレこのままでいいの?
二つ目のスレdat落ちしてるみたいだが
んじゃちょっとだけ立ててくる
>>979 あれじゃね、constだし空のオブジェクトを単一にして節約みたいなことすんじゃね。
そこまで考えてないと思うけど。
map["key1"] = &Hoge::EmptyVector;
map["key2"] = &Hoge::EmptyVector;
map["key3"] = &Hoge::EmptyVector;
map["key4"] = &Hoge::EmptyVector;
map["key5"] = &Hoge::EmptyVector;
std::vector<int> instance;
map["key2"] = &instance;
みたいな。
std::vector<int>を使うことを承知している(=Hogeに閉じ込めない)のなら、 std::vector<int> EmptyIntVector; map["key1"] = & EmptyIntVector; で何がいけないんだ? やっぱり判らん。
>>986 間違えたconst std::vector<int> instance;ね。
参照しかしないならチビッと意味があるだろうね。
あとnullの代わりに&EmptyVector == map[key];って事が可能ではある。
俺ならそういう用途にvector自体を使うことはないけど。
なんらかのNullオブジェクトを用意するわ。
単純にメモリを解放するためじゃね? 代入よりswapを使うことが多いと思うけど
うめ
例えとして空のヴェクたを出しただけで実際はなんか値が入ってるんだろ サンプルコードのスミまでつついて揚げ足とろうとやっきになるのはム板住民の悪癖だ
しゃあない。ヴェクた使いだらけのム板だもの。
つか代入じゃメモリは解放されない気がしてきたから
>>989 は忘れてw
>>991 そんな殺伐とした雰囲気が良いんじゃねえか。女子供はすっこんでろ。
うめ
ume
うめ
うめ
999 :
○ :2011/09/14(水) 15:11:59.29
四十年勤め上げた会社を退職し早二十年、何やら張り合いの無い日々を送る内、大学生の孫に「退屈しのぎに行って見たまえ」と勧められた2チャンネル。 当初は「こんな電腦掲示板、何たる幼稚加減」と馬鹿にしていたものの、行って見ると存外に面白い。 華やかな色彩の髪と目を持つうら若き乙女に「ゆとり乙」と何度と無く罵られるにつけ、食うや食わずで慌しく過ぎ去った学生時代が自ずと思ひ返され、「戦争さえ無ければ、小生もこのような青春が送れたやも知れぬ」と独りごちることもしばしば。 すっかり虜となつた今では、孫の部屋から白銀色のノートパソコンをせしめては書斎に篭り存分に「祭り」を堪能する毎日を送っている。 同年代の友人達が痴呆や重い病に悩まされるなか、老いて尚矍鑠としてオフ会に向かう事が出来るのも、ひとえに2チャンネルのおかげかと思えば、再三に渡る「半年ROMってろ」の罵り文句も、何やら「まだまだ死ぬには早いよ」と言われているようで愉快極まりない。 ひとつ間違えれば自らが乗り込んでいた機体と同じ名前を持つコテハンに出会える日を樂しみにしつつ、今日もディスプレイに向かう。 それでは、壱千ゲット。「原文は.batスレ」
うめ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。