C++ 相談室 part5
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNG0002デフォルトの名無しさん
NGNGhttp://www.boost.org/
STLport
http://www.stlport.org/
とりあえずこんだけ
過去ログ
Part1
http://piza.2ch.net/tech/kako/980/980175292.html
Part3
http://pc.2ch.net/test/read.cgi/tech/1003832761/
Part4
http://pc.2ch.net/test/read.cgi/tech/1009071535/
Part2 はワカラン
0003デフォルトの名無しさん
NGNG0004デフォルトの名無しさん
NGNG0005 v(^・^)v
NGNG0006デフォルトの名無しさん
NGNG0007デフォルトの名無しさん
NGNGClass *const &cls = new Class;
のように*constを入れなくてはいけない理由はなんですか?
Class &cls = new Class;
でもいいじゃないかと思うんですが。
0008デフォルトの名無しさん
NGNGなぜ”*”ではなくconstが必要と思ったのかなぞだが、
Class *&cls = new Class;
or
Class &cls = *(new CLass);
だろー。しかしなんつー使いかただ・・
0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNGclass A{
int const aa;
A(){aa=123;};
};
ではエラーになってしまいます。
0011デフォルトの名無しさん
NGNG0012デフォルトの名無しさん
NGNGA():aa(123){};
基本だろ、キホンッ!
0013デフォルトの名無しさん
NGNG0014デフォルトの名無しさん
NGNGClass&* で受けるんなら const 要るみたい(g++3.0.3)
っつか,どーゆー時にこーゆー使い方が必要なんだ?
>7 よ
001514
NGNG○Class*&
0016デフォルトの名無しさん
NGNGv(^・^)v Class*&
0017デフォルトの名無しさん
NGNGb = a[0];
と
a[0] = b;
で、違う関数が呼び出されるようにすることは可能ですか?
また、可能ならばどのように宣言すればいいのでしょうか?
0018デフォルトの名無しさん
NGNGC C::operator[](int) const;
C& C::operator[](int);
0019デフォルトの名無しさん
NGNG{
static const int I = 12345; // O.K.
static const int* const Ptr = &I; // O.K.
static const int& Ref = I; // N.G.
};
↑の S::Ref でコンパイルエラーが出ます。
参照は実体(メモリ領域)が必要になるようです。
Ptrの様にコンパイル時解決で済む静的参照を定義することはできませんか?
言語仕様としてこれをNGにした理由がわかりません。
0020デフォルトの名無しさん
NGNG「宣言」と「定義」は違うだろ。
struct S
{
static const int I;
static const int* const Ptr;
static const int& Ref;
};
const int S::I = 12345;
const int* const S::Ptr = &S::I;
const int& S::Ref = S::I;
002119
NGNG???
S::I と S::Ptr はよくて、 S::Ref だけダメなのがなぜかという質問ですが。
ちなみに、gcc です。
0022デフォルトの名無しさん
NGNGその形で初期化出来るのは定数(constなもの)だけ。
const int&はconst int型の値への参照を表す普通の変数なので
そこでは初期化できない。
ためしてないからわからんけど、
const int const &ならそうやってできると思われ。
0023デフォルトの名無しさん
NGNG0024v(^・^)v
NGNGなんすかコレ?
0025デフォルトの名無しさん
NGNGgoogleとかで探してもいまいち見つからんのだが・・・
0026デフォルトの名無しさん
NGNGC++相談室のキャラクター。
かわいがってあげてください。
0027デフォルトの名無しさん
NGNG0028デフォルトの名無しさん
NGNG0029ひよこちゃん
NGNG今度は、structureとenumを勉強してるんですけど
enumってcinつかえないんですか?
これでカラー選んで入力させられるようになりたいんですけど
誰かヒントくださ〜い
enum ColorList {white, black, blue, green};
struct boatlist{
char name[50];
ColorList color;
float age;
};
0030デフォルトの名無しさん
NGNGこんな感じにメンバ関数のポインタを取得できることは
分かったのですが、これをクラスの外で呼び出そうとする
ことはできないのでしょうか?
普通に*pfunc();と呼び出そうとするとエラーになってしまいます。
0031デフォルトの名無しさん
NGNGエラーメッセージは以下です。
pointer to member function called, but not in class scope
0032デフォルトの名無しさん
NGNGメンバ関数を呼び出すには、オブジェクトが必要。
Class *p;
Class c;
void (Class::*pfunc)() = &Class::func;
(p->*pfunc)();
(c.*pfunc)();
0033デフォルトの名無しさん
NGNGどうもありがとう。
でもどうも疑問が残るのは
Class* cls;
(cls->*func)();
としたときに実際のメンバ変数の領域がないはずなのに
なぜか関数func内でアクセスできてしまうんですよね。
どうしてなんでしょうか?
コンパイルエラーを出すべきところではないのでしょうか?
0034デフォルトの名無しさん
NGNG> なぜか関数func内でアクセスできてしまうんですよね。
> どうしてなんでしょうか?
C++ だとポインタは、実際には(実装依存だけど、ふつーは)単なるアドレス値
だから。
> コンパイルエラーを出すべきところではないのでしょうか?
そのぐらいの簡単なケースなら、警告レベルを上げれば警告してくれると思う
けど(変数を初期化せずに使用しています、とか何とか)。
ただ、一般論としては難しい。
void foo(Class* p)
{
p->func();
}
これで p が有効なオブジェクトを指しているかどうかを毎回チェックすると、
無視できないコストが発生するから。Java のように GC 前提の言語なら
null check だけで済むけど。
0035デフォルトの名無しさん
NGNGご丁寧に本当にありがとうございます。
g++では-Wallをオプション追加しても
警告は出ませんでした。
でも良く考えてみれば当たり前ですね。
Cでアロケーションした(つもりの)領域へ
確認無しに書き込むようなものですからね。
それがメンバ関数内で行われているという
違いだけで。
この辺は本当はアセンブラが読めれば
もっとC++の動作原理が分かるのでしょうか?
0036デフォルトの名無しさん
NGNGなんでもない戯言です。
アセンブラ勉強します。
すみません。
0037デフォルトの名無しさん
NGNGg++ だと、最適化をかけないと未使用変数のチェックができななかった気がする。
g++ -O -Wuninitialized
でどう?
0038デフォルトの名無しさん
NGNGでました!
: `class Class * cls' might be used uninitialized in this function
こんなの初めて知りました。
最適化かけて初めて警告が出たりするんですね。
ホントに勉強になります。。。
0039デフォルトの名無しさん
NGNGうぉ!漏れもそれ初めて知った!!感謝age!!
# っつーかそーゆー知識ってやっぱマニュアル熟読してたりするわけ?
004039
NGNG0041デフォルトの名無しさん
NGNG0042デフォルトの名無しさん
NGNG0043デフォルトの名無しさん
NGNG人のコードを読んで勉強したいっす。
0044デフォルトの名無しさん
NGNG私は、
マニュアル読んだり
本を読んだり
プログラミング言語 C++, Generic Programming, Exceptional C++, Effective C++,
More Effective C++, Effective STL, Modern C++ Design,
Inside the C++ Object Model (以上、目の前の書棚に並んでるヤツ)
ソースを読んだり
STLport, boost, ATL/WTL, gcc
メーリングリストを読んだり
って感じですが。隅々まで知ろうというのは無理なんで、最初から放棄してます。
メーリングリストは C++ 関係のをチェックしてもいいですが、意外と UNIX の開発
者が集まってるようなメーリングリストを読んでると、コンパイラやらネットワークや
らの面白い話が拾えることが多いです。freebsd-arch とかね。
0045デフォルトの名無しさん
NGNG色々とやられているんですねぇ。
自分の不勉強を反省。
0046デフォルトの名無しさん
NGNG適当
http://www.1cplusplusstreet.com/
http://www.mindview.net/Books/
http://freshmeat.net/
http://www.freecode.com/index/
004739
NGNGうーむ,やっぱそのくらいしないとダメか.
一応C++自体の知識に関してはそれらの本は一通り読んだから
それなりにあるつもりだけど,やっぱ英語の ML とか読まんとダメか.
boost や STL のソースはちょこちょこ読んだりするんだけどね.
まだまだだな,ヲレも.
004819
NGNG0049デフォルトの名無しさん
NGNGそもそも static な参照って使い道あるか?
005019
NGNGたとえば、メモリマップドI/Oの抽象化なんかはどうですか?
ポインタで -> にするのがいやなだけだったりしますが。
0051デフォルトの名無しさん
NGNG0052デフォルトの名無しさん
NGNGなんか使い道あるんでしょうか?
これが言語的に含まれるようになった
理由が良くわかりません。NestedClassは
まだなんとなく分からないでもないですが、
LocalClassのほうはさっぱり。
実際のプログラムで使ったことってありますか?
0053デフォルトの名無しさん
NGNGC 言語の時点でも nested struct や nested class は存在したから、まぁ自然な
拡張だと思うけど。
私は nested class, local class 両方とも、実際に使ってます。local class の代表
的な使い方としては、変数スコープに合わせて何かを処理するというのがありま
す。
struct MutexHolder
{
MutexHolder() { GetMutex(); }
~MutexHolder() { ReleaseMutex(); }
};
こんな感じの class/struct を関数内で定義して使うとか。もちろんグローバル
にい定義してもいいのですが、それだとグローバルな名前空間を汚してしまい
ますから。
nested class は、たとえば実装を Bridge パターンを使って隠す場合に
class Foo
{
struct Impl; // nested class
const std::auto_ptr<Impl> pImpl_;
public:
Foo();
~Foo();
// 他にメソッドいろいろ
};
と公開ヘッダで書いておいて、実装側で struct Foo::Impl を定義するとか。
別に nested class にせずに FooImpl というクラスを定義しても良いけど、
この方が関係が良く分かって良いかな、と。
Command Pattern を使う場合にも、各コマンドを操作対象のクラスの nested
class にしてます。
class TextSurface
{
public:
class SetTextCommand;
class SetFontCommand;
...
};
0054デフォルトの名無しさん
NGNG分かりやすい説明どうもです。
今までNestedクラスはクラス内に
ずらずら書き込むところを想定して
いました。
>struct Impl; // nested class
なるほど、classbodyは別にする訳ですね。
これなら分かりやすいです。
とてもいいことを教えていただいて
ありがとうございます。
MutexHolder!
羽暮らせて頂きます!!
感謝!
0055デフォルトの名無しさん
NGNGenum Foo;
のようにして先に宣言しておくことは、C++ の標準規格的に可能でしょうか。
VC++ 6 なら通るんですが、g++ 3.0.2 だとエラーになります。
g++ で通らないということは、99%、標準じゃないとは思われますが……
0056角度 -180..180
NGNGこれ、一行でかけますか?
0057デフォルトの名無しさん
NGNG0058デフォルトの名無しさん
NGNG構築が終わったインスタンスのメンバ関数のアドレスは確定してますよね?
処理系依存でもいいので方法はないでしょうか?
VC++6.0 を使ってます。
Delphi なら出来るというのは無しでお願いします。(事前にぐーぐるで調べたらその事についてのDelphi賛美ばっかりですよioi)
0059デフォルトの名無しさん
NGNG006058
NGNG&Hoge と method に分かれて解釈されてしまいました。
method はグローバルスコープのメンバじゃないと言われ
&に左辺値がないと言われてしまいました。
とここまで書いて自分の間違いに気づいたのですが、
クラス名を書けという事ですね。
this ポインタを通しては無理でしょうか?
いや、まアドレスを返すメンバ関数を作ればよさそうなので一応なんとか
なりそうです。ありがとうございます。
0061デフォルトの名無しさん
NGNG0062デフォルトの名無しさん
NGNGすみません。教えてください。
0063デフォルトの名無しさん
NGNG文字列をint型の配列に変えたいということですか?
0064デフォルトの名無しさん
NGNGすみません。教えてください。
0065デフォルトの名無しさん
NGNGC++はCと同じく、文字列は文字型の配列だよね?
それをキャストするの?
文字列を整数値にしたかったらatol,strtol,strtoulを使え。
0066デフォルトの名無しさん
NGNGarg = (arg%360)-180; かな?
006765
NGNG006866
NGNG0069デフォルトの名無しさん
NGNG> C++はCと同じく、文字列は文字型の配列だよね?
それでも使えるが、ふつー STL の std::string or std::wstring 使う。
0070デフォルトの名無しさん
NGNGi %= 180;
f = fmod(f, 180.0);
007156
NGNGすみません、やりたい事というのは、type float の値 (-∞...∞) を与えて、
それを -180 から 180度の間の値に修正したいのですが、良い案がおもいつきません。
>>66
% は float には使えません。。。
007256
NGNGありがとうございます!!!! fmod() を知りませんでした。感謝感謝です!
007356
NGNGと思ったら。。。うまく行かない。
f = 194.3
f = fmod(f, 180.0);
で f = 14.3 になりますが、実際は -165.7 が欲しいのです。
007462
NGNG3という値を文字列ではなく数値として扱いたい場合
String a = "3";
int b = 1;
b = b + a;
このやり方がどうしてもわかりません。
atoi()等は使えないですよね?
007556
NGNGarg = 194.3
arg = fmod(arg,360)-180
で arg が 14.3 度になってしまい、×です。 194.3度は-165.7度になってくれないと
0076デフォルトの名無しさん
NGNGそれぞれのコンストラクタに引数(一定の値ではなく0,1,2,〜という感じで)
を渡すことって可能なんでしょうか?
class hoge {
hoge(int a);
};
だとして
hoge *p_Hoge;
p_Hoge = new hoge[4] = {0, 1, 2, 3};
これじゃダメでした・・・(当たり前?
アドバイスお願いします〜
0077デフォルトの名無しさん
NGNGstinrg::c_str()
string::at(sstring::size_type index)
を使えば、atoi()も使える。
0078デフォルトの名無しさん
NGNG私も初心者だけど、
ループで回すしかないと思います。
0079デフォルトの名無しさん
NGNGarg = (fmod(arg,360) > 180) ? 180 - fmod(arg,360) : fmod(arg,360);
か?無理矢理一行で書くとすれば.
>76
そーゆーの出来ないよ.init(int i) みたいなメンバー関数作って for で回すとか,
for で回しながら一個ずつ vector に push_back するとかすればよろしいのではないかと.
それ以前に
hoge *pHoge;
じゃぁ new hoge[4] は格納出来ないけど・・・
008058
NGNGメンバ関数のポインタを void* に格納する事は不可能なのでしょうか?
(キャストできないと言われる)
なんとかしてメンバ関数にコールバックさせたいのです。
どなたか教えてください。よろしくお願いします。
0081デフォルトの名無しさん
NGNG>>79と似てるけど
arg = arg > 0 ? fmod(arg + 180, 360) - 180 : fmod(arg - 180, 360) + 180;
あるいは、2行になるけど
#define sgn(x) ((x) > 0 ? 1 : ((x) < 0 ? -1 : 0))
arg = fmod(arg + sgn(arg) * 180, 360) - sgn(arg) * 180;
0082デフォルトの名無しさん
NGNG0083デフォルトの名無しさん
NGNGstatic_cast
では、不可能でしたか?
reinterpret_cast
なら、可能だと思いますけど、
危険ですよね。
0084デフォルトの名無しさん
NGNGvoid* pF = reinterpret_cast<void*>( mem_fun );
でもダメか?
つーか、void* じゃなきゃ渡せないようなライブラリ相手だと、
メンバ関数のアドレス渡しても this ポインタが解決できないから
マトモに呼び出されんと思うけど。
008556
NGNGなるほどーーー。ただ、arg=-194.3 の時に答えが -194.3 になってしまいます。ここは165.7にならないと
>>81
すごい!!!!完璧です。答えもバッチグーでした。多謝 ::::))))
008658
NGNGreinterpret_cast でも駄目でした。というかエラーメッセージに
この変換が可能なコンテキストはありません。
と出ているのですが…、そうなんでしょうか。
>>84
呼び出し元も自分で書いてるんです。
>>82
スレッド(Win32)をラップしたクラスを作ろうとしているのですが、
スレッドのエントリー関数(実際には本物のスレッドのエントリーが呼ぶ)
をメンバ関数にしたいのです(staticな関数の場合はうまくいきました)
この作り方は変でしょうか?
0087デフォルトの名無しさん
NGNGまず、組み込み型 (int, long, ... ) を除いては、配列を動的に確保するのはやめた
方がいい。とくにデストラクタが仮想だったりすると、面倒なバグに出くわす可能性
が高いし、iterator がらみのアルゴリズムが使えなくなる。
C++ の流儀だと back_inserter を使って、こんな感じで書くのが良いんじゃない?
ほんとは template を駆使すると hoge::creator は generic な書き方も出来るんだ
けど、下準備がいろいろいるから hoge 限定ってことで。
---
#include <algorithm>
#include <iterator>
#include <iostream>
#include <vector>
#define NELEM(x) (sizeof(x) / sizeof(x[0]))
using namespace std;
class hoge
{
public:
hoge(int n) { cout << "hoge " << n << endl; }
struct creator
{
hoge* operator()(int n) { return new hoge(n); }
};
};
int
main(void)
{
const int param[] = { 0, 1, 2, 3 };
vector <hoge*> v;
transform(param, param + NELEM(param), back_inserter(v), hoge::creator());
return 0;
}
---
0088デフォルトの名無しさん
NGNG自分で書いてるなら、わざわざ void* にしなくても
そのままメンバ関数へのポインタ型で扱えばいいのでは?
0089デフォルトの名無しさん
NGNG> メンバ関数のポインタを void* に格納する事は不可能なのでしょうか?
無理です。
というか、そもそもメンバ関数でなくとも
- 関数ポインタ
- 変数ポインタ (void* を含む)
は全く互換性がないことになってます。規格上 sizeof(void *) と sizeof(void(*)()) が
違うこともあり得ることになってるし。
>>86
> スレッドのエントリー関数(実際には本物のスレッドのエントリーが呼ぶ)
> をメンバ関数にしたいのです(staticな関数の場合はうまくいきました)
無理。ふつーはスレッドのエントリ関数にパラメタを渡せるようになってるから、
1. static なメンバ関数を呼ぶ
2. そのメンバ関数で、引数から this を取得して、非 static なメンバ関数を呼ぶ
の二段構成にする。Win32 のウィンドウプロシージャのようにパラメタを渡す
領域がない場合には thunk を使って細工するとか、いろいろ。
0090スーパー初心者
NGNGできないんでしょうか?
0091デフォルトの名無しさん
NGNG部外者ですが、メモらせて頂きました!
009258
NGNG呼び出し先は固定にしたくないんです。
>>89
> - 関数ポインタ
> - 変数ポインタ (void* を含む)
>
> は全く互換性がないことになってます。規格上 sizeof(void *) と sizeof(void(*)()) が
> 違うこともあり得ることになってるし。
知らなかったです…。関数ポインタ版 void* みたいなのはないんでしょうか?
> 2. そのメンバ関数で、引数から this を取得して、非 static なメンバ関数を呼ぶ
あぁ!なんでこれに気づかなかったんでしょう!
static な関数内で偽 this ポインタを使う所まではやっていたんですけど
この偽 this でメンバ関数を呼べばよかったんですね。
とりあえず解決しました。
(本当はこれを応用して本物のダブルディスパッチとかできないかなぁ?とか考えていたので、そっちはポシャリましたが)
ありがとうございました。
0093デフォルトの名無しさん
NGNGごめん。タグって何ですか?
私も初心者なんで、ベンキョウのために。
0094デフォルトの名無しさん
NGNG> 関数ポインタ版 void* みたいなのはないんでしょうか?
一般的な関数に関しては、キャストして OK ってことになってます。
void (*pf)();
とでも宣言しておいて、これに「あらゆる型の関数ポインタ」を格納しても
大丈夫(呼び出すときに、元の型にキャストし直すのを忘れなければね)。
ただし、メンバ関数になると仮想関数の扱いがあるので、難しくなります。
たとえば
struct IObject { virtual void foo() = 0 };
とあるときに &IObject::foo は何を返すかと考えると「関数のアドレス」では
NG ですよね(なにしろ、純粋仮想関数なのでアドレスが存在し得ないわ
けだし)。
C++ での関数の抽象化には関数ポインタも使われますが、主役は関数オ
ブジェクト (functor) になります。mem_fun や Boost.org のライブラリ bind
あたりを調べておくと、将来、役に立つかもしれません。
0095スーパー初心者
NGNGclass {
char *p;
public:
(){p = new char[256];} //無名なのでコンストラクタ名がつけられない!(エラーになる)
virtual ~(){delete[] p;} //同上
}c;
0096スーパー初心者
NGNG0097デフォルトの名無しさん
NGNG0098デフォルトの名無しさん
NGNGunsigned char でどうして数字が扱えるのかわからないので教えてください。
charって文字変数しかあつかえないんじゃないんでしょうか?
0099デフォルトの名無しさん
NGNG> charって文字変数
C, C++ は char, short, int, long は全て「整数」型です。扱える数字の範囲が
違うだけ。
0100デフォルトの名無しさん
NGNGdouble Hoge(double d)
{
return (double) (short) (unsigned short) ((d * 65536 + 180) / 360) * 360 / 65536;
}
思わずこんなコードを書いてみるテスト……。
0101デフォルトの名無しさん
NGNG補足しとくと、半角文字は乱暴に言うと0〜127の128種類しか無いから、
その種類をブチ込んでるだけ。
0〜255のunsigned charや
−128〜+127の signed charだと、無駄が無いのさ。
基本的にunsigned char 又は BYTE を使っておく事を勧める。色々面倒有るから。
int c = 'A';
printf("%d\n", c);
putc(76);
以上を実行してみたらわかるかも。わかんないかも。
0102デフォルトの名無しさん
NGNGHoge h( value );
とするのか、
Hoge h;
h.Init( value );
とするのか、いつも悩みます。
前者だと、
class Hoge
{
private:
int m_value;
Hoge();
public:
Hoge( int value );
};
とした時に、value の渡し忘れを防ぐメリットが、
一方、後者だと value の結果(戻り値)が得られるメリットがありそうです。
こういう場合は戻り値が必要/不必要だけで判断していいんでしょうか?
0103デフォルトの名無しさん
NGNGコンストラクタも多重定義できるから両方使い分ければいい。
ただ、
結果を得たいだけなら別のメンバ関数用意した方がいいのでは?
0104デフォルトの名無しさん
NGNGC++ではどうするのが定跡なんでしょうか?
0105デフォルトの名無しさん
NGNGC++ でも例外を投げる
0106デフォルトの名無しさん
NGNG例外が発生するような処理は、極力、コンストラクタに書かないようにすべきだと思うが。
0107デフォルトの名無しさん
NGNG例外は例外。
善悪もなく、必要であれば使えばよいだけ。
て、どういう例外のことを行ってるかわからんけど、
例外っていうくらいだから例外なんだよな。
0108デフォルトの名無しさん
NGNG> 善悪もなく、必要であれば使えばよいだけ。
そのとおりだが。ただ C++ だと「コンストラクタで、あまりヘビーな仕事をさせない
方が良い」っつーのも、一理ある。
この前見つけたドキュメントを一つ。あとは (More) Effective C++ あたりにも、例外
に関するトピックがあったと思う。
Error and Exception Handling
http://www.boost.org/more/error_handling.html
> When should I use exceptions?
> The simple answer is: ``whenever the semantic and performance characteristics
> of exceptions are appropriate.''
0109激しくリロード (Class)
NGNG数字ならうまく逝ってます。
下のソースはdoubleだけど、d1、d2を文字にするには
どうしたらいいんですか?
#include <iostream.h>
class cls{
double d1, d2;
public:
double out();
};
double cls::out(){return d1 + d2;}
void main(){
cls c;
double* p;
p = (double*)&c;
*p = 1.1;
p++;
*p = 2.3;
cout << c.out();
}
0110デフォルトの名無しさん
NGNG> cls c;
> double* p;
> p = (double*)&c;
おいおい。
cls 型のインスタンスを、無理やり double にキャストしたらダメだって。とりあえず、
しばらくキャストは忘れましょう。キャストしなければ動かない場合には、何か自分
が間違ってると思った方が良いです。
> 下のソースはdoubleだけど、d1、d2を文字にするには
そもそも cls のメンバ変数 d1, d2 を、クラスの外から
- 設定する
- 取得する
拾ってくる方法がないじゃない。まずは、そのメンバ関数を作るところからスタート。
0111デフォルトの名無しさん
NGNGマテマテマテマテマテマテマテマテマテマテ
すげー無茶を(藁
せめてd1&d2をpuclicにして c.d1 = 1.1 ってするか、普通は
void cls::dataSet(double one, double two){
d1 = one; d2 = two;
}
として、 cls.dataSet(1.1, 2.3); なんて感じでやりゃいい。
で、文字って、charでなく文字列?
それならCString使ってみ。簡単だから。
0112デフォルトの名無しさん
NGNG> それならCString使ってみ。簡単だから。
std::string 薦めるだろ、ここ VC++ スレじゃないし
0113激しくリロード (Class)
NGNG初心者です。
難しい話はまだ分かりせん。
書いたソースはあれでも動いてます。
数字ならできるけど、文字列ならどういうソースに
すればいいか分かりませんか?
0114デフォルトの名無しさん
NGNG> 書いたソースはあれでも動いてます。
おいおい、動けば良いってもんじゃないぞ。たとえば仮想関数を一つ追加
した瞬間に、多くの処理系だと即死することになる。
先を急がずに、ちと調べろ。
0115デフォルトの名無しさん
NGNGワケもわからず適当に書いてみてたまたま動けばいいってもんじゃないののの!
0116激しくリロード (Class)
NGNG0117激しくリロード (Class)
NGNGp = (double*)&c;
でしょ。
ここではキャストしないとコンパイルエラーだよ。
上級者なら分かるはず。
0118デフォルトの名無しさん
NGNGできるが、それ以前の問題だ。
あと「文字列」って何をさして言ってる? C++ だと文字列といっても
- char[]
- wchar_t[]
- string
- wstring
といろいろあるんだが。VC++ だと、さらに
- CString (MFC)
- CString (WTL)
- CComBstr
- _bstr_t
- BSTR
なんつーのもアリだぞ。
0119デフォルトの名無しさん
NGNG0120デフォルトの名無しさん
NGNG0121デフォルトの名無しさん
NGNGdouble d1, d2;
public:
cls(a,b) : d1(a),d2(b) {}
frend ostream &operator << (ostream &os, const cls &c) { os << d1 + d2; return os; }
};
こんなもんコレで十分だ。
void main() { cls c(1.1, 2.3); cout << c; }
0122激しくリロード (Class)
NGNG数字なら、intでも成功した。
でも、char[]ではうまくいかない。
あの初心者的なソースの原型をできるだけ保って
d1、d2 をchar[]型でやりたいです。
0123激しくリロード (Class)
NGNGありがとう。でも難しくて分からなかった。
char[]型だとそう簡単にはいかないと思う。
0124デフォルトの名無しさん
NGNGclass clss {
string s1, s2;
public:
clss(const string &a, const string &b) : s1(a), s2(b) {}
friend ostream & operator << (ostream &os, const clss &c) { os << s1 + s2; retun os; }
};
void main()
{
clss c("ひげ", "もじゃ");
cout << c;
}
型をテンプレート化して
template<class T>
class cls {
T s1, s2;
public:
cls(const T &a, const T &b) : s1(a), s2(b) {}
friend ostream & operator << (ostream &os, const cls &c) { os << s1 + s2; retun os; }
};
void main()
{
cls<string> cls_str("ひげ", "もじゃ");
cls<double> cls_dbl(1.1, 2.3);
cout << cls_str << endl;
cout << cls_dbl << endl;
}
精進せいや
0126激しくリロード (Class)
NGNG0127デフォルトの名無しさん
NGNGを
os << c.s1 + c.s2
になおしてちょんまげ。
コンパイルしてないから他にもエラー有ると思う。
誰かなおしてニャンマゲ
0128デフォルトの名無しさん
NGNG言語仕様として NG なのは確定っつーことで、何をやりたいのか書いたほうが
良いと思うが。目的がはっきりすれば、良い代替案が出てくるかもしれないし。
0129激しくリロード (Class)
NGNG#include <iostream.h>
class cls{
char d1[50], d2[25];
public:
char out();
};
char cls::out(){return strcat(d1, d2);}
void main(){
cls c;
char* p;
p = (char*)&c;
*p = "1.1";
p++;
*p = "2.3";
cout << c.out();
}
これ直せる?
0130デフォルトの名無しさん
NGNGだから、ネタは他所でやれと…
本気ならば、まずは入門書から読み直したほうが良い。キャスト使ってどうこう
しようって時点で、C++ プログラマとしては終わってる。
0131デフォルトの名無しさん
NGNGC++ってそんなことできるんだ。
Cだと確実にエラーになるんだけど。初期値なんて設定できないし、メンバーを個別にstaticにできないし(staticは変数を宣言するときに使うものだもの)。
0132デフォルトの名無しさん
NGNGstruct S
{
static const int I;
static const int* const Ptr;
static const int& Ref;
};
const int S::I = 12345;
const int* const S::Ptr = &I;
const int& S::Ref = I;
つーか、何がやりたいんだ? ちなみにVC++6.0では>>19はIの時点で蹴られるが。
>>131
VC++では純粋仮想関数の宣言であるとみなされた上でエラー。
0133デフォルトの名無しさん
NGNGほっとこーぜ、もう。
0134131
NGNGなるほど。C++ではstructは構造体だけを表すわけではないんだ。
Cを使うのはやめてC++を勉強しようかな・・・・文字列型なんてのがあるみたいだし。これはかなり魅力的。
0135激しくリロード (Class)
NGNGがっかり。
原型が保たれてない。
0136sage
NGNG#include <cfloat>
using namespace std;
class cls {
char *tbl[2];
public:
operator char ** () { return tbl; }
double out() const
{
return atof(tbl[0]) + atof(tbl[1]);
}
};
class cls2 {
char *tbl[2];
public:
operator char ** () { return tbl; }
string out() const
{
return string(tbl[0]) + string(tbl[1]);
}
};
void main()
{
// 数値計算
cls c;
char **p;
p = (char **)c;
*p = "1.1";
p++;
*p = "2.3";
cout << c.out() << endl;
// 文字連結
cls2 c2;
char **p2;
p2 = (char **)c2;
*p2 = "1.1";
p2++;
*p2 = "2.3";
cout << c2.out() << endl;
}
できないこたないが
こんなコード書くやつがいたらクビだ。
0137デフォルトの名無しさん
NGNG原形がそもそもプログラムとして不完全過ぎるんだから
それを保って書こうってのがどうかしてる.
だから「ネタ」って言われるんだよ.
もーちっとC++勉強してみ.
キャストしてインクリメントっつーのが如何に無茶苦茶か良く分かるから.
0138デフォルトの名無しさん
NGNGあったり、メニューの背景をオーナードロウ
してたり、メニューの文字列の色を変更してたり
するんですが、どのようにやってるんですか?
ヘルプは見たんですが、ずばり答えてくれてなくて、
よろしくお願いします。
0139デフォルトの名無しさん
NGNGVCスレなりなんなり他のとこ逝け.
スレ違いだ.
0140デフォルトの名無しさん
NGNG良く頑張った!感動した!!
0141激しくリロード (Class)
NGNG文字列が数字に見えたのがいけなかった。ごめんなさい。
文字列でいいんです。
#include <iostream.h>
class cls {
char d1[50], d2[25];
public:
string out() const{
return strcat(d1, d2);
}
};
void main(){
cls c;
char **p;
p = (char **)c;
*p = "abc";
p++;
*p = "def";
cout << c.out();
}
0142sage
NGNGついでに
cout << c.out();
を二回実行したらどうなるか考えておけ。
0143激しくリロード (Class)
NGNG#include <iostream.h>
class cls {
char d1[50], d2[25];
public:
char out(){return strcat(d1, d2);}
};
void main(){
cls c;
char **p;
p = (char **)c;
*p = "abc";
p++;
*p = "def";
cout << c.out();
}
0144デフォルトの名無しさん
NGNGいい加減にしろ。
0145デフォルトの名無しさん
NGNG#include <iostream>
using namespace std;
class cls {
char d1[50], d2[25];
public:
char *out(){return strcat(d1, d2);}
operator char**(){ static char*table[] ={d1,d2}; return table;}
};
int main(){
cls c;
char **p;
p = (char **)c;
strcpy(*p , "abc");
p++;
strcpy(*p , "def") ;
cout << c.out();
}
0146激しくリロード (Class)
NGNGどや?無理だろ?
初心者のお前には目を細めれば寿司のネタに見える無い様だ。
初心者は豆腐食べてなよ。
0147激しくリロード (Class)
NGNGコンパイルはエラー無しだ。
145は<静的変数>を含む関数はインライン展開できないだな。
operatorってのを使わずに書けないの?
0148デフォルトの名無しさん
NGNG> じゃお前がいいかげんにソース書けや。
124 に書いてもらったソースが分からなかったんだろ… 処置無しだよ。
0149激しくリロード (Class)
NGNGoperatorを使ってないのも教えてほしいよ。
初心者な俺はoperatorなんて初めて見たもんだから。
0150デフォルトの名無しさん
NGNG原型崩すな、とか言うから145さんはoperator出してきてんじゃねーのか?
自分が何を逝ってるか分かってるの>>149
0151デフォルトの名無しさん
NGNGこの機会にoperatorについても学ぼうという向学心はないのか?
0152激しくリロード (Class)
NGNGclass cls {
char d1[50], d2[25];
public:
char *out(){return strcat(d1, d2);}
};
int main(){
cls c;
char *p;
p = (char *)&c;
p = "abc";
p++;
p = "def";
cout << c.out();
}
文字化け。
operatorについても学ぼうという向学心あるよ。
でも、今はoperatorなしでやってみたいんだ。
0153デフォルトの名無しさん
NGNGしかし 100 前後はわりと良スレだったのに、一気に荒れたな。
0154激しくリロード (Class)
NGNG場かは言ってよし。
そんなにじゃまならソース書け場か。
書けねーだろ。だから豆腐食べろってんだ。
0155デフォルトの名無しさん
NGNGこんなバカの為に有るスレじゃないんだから。
0156デフォルトの名無しさん
NGNG0157デフォルトの名無しさん
NGNG0158デフォルトの名無しさん
NGNG0159激しくリロード (Class)
NGNG俺も今から豆腐食べるから、俺と同じ場かは
無い知恵絞って考えようね。
#include <iostream.h>
class cls {
char d1[50], d2[25];
public:
char *out(){return strcat(d1, d2);}
//operator char**(){ static char*table[] ={d1,d2}; return table;}
};
int main(){
cls c;
char *p;
p = (char *)&c;
*p = (char)"abc";
p++;
*p = (char)"def";
cout << c.out();
}
0160デフォルトの名無しさん
NGNG145にお礼も言わないわ、態度がどんどんでかくなるわで
厨房街道一直線だな。
>>151
こんな他人任せの奴に、そんなものはありません。
016119
NGNGメモリマップドI/Oなハードで、コンパイラはgccを使います。
んで、ハードウェアのモードによってI/Oレジスタのメモリアドレスが変わるんですが、
変わるといってもその値はすでにわかっています。
#define MODE0_HOGE_REGISTER_ADDRESS (0x????????)
#define MODE1_HOGE_REGISTER_ADDRESS (0x????????)
で、レジスターの内容ビットをビットフィールドによって
操作可能にするための構造体を定義しました。
これは上記のモードが変わっても変わらないとします。
struct HogeRegister_t
{
unsigned X_IN:1;
unsigned X_OUT:1;
};
ここまでで、アクセスするためのコードはCで書くと、
void X_Out( BOOL signal )
{
(*(volatile HogeRegister_t*)MODE0_HOGE_REGISTER_ADDRESS).X_OUT = signal;
}
って感じです。
泥臭い上にモードも決め打ちになるのでもっとかっこよく書こうとして、
以下のようなコードを書きました。
enum MODE { MODE_0,MODE_1, };
template< enum MODE > struct RegisterMap
{
};
template<> struct RegisterMap< MODE_0 > // モード0レジスターマップ
{
static volatile HogeRegister_t& Hoge = *(volatile HogeRegister_t*)MODE0_HOGE_REGISTER_ADDRESS;
};
template<> struct RegisterMap< MODE_1 > // モード1レジスターマップ
{
static volatile HogeRegister_t& Hoge = *(volatile HogeRegister_t*)MODE1_HOGE_REGISTER_ADDRESS;
};
想定していた使いかたは、
const MODE theMode = MODE_0; // 以下のプログラムで使うモードを設定
typedef RegisterMap< theMode > theRegister;
void X_Out( bool signal )
{
theRegister::Hoge.X_OUT = signal;
}
ここまでソースに書いて、(・∀・)イイ!
とおもってたのですが、コンパイルしてみたら、、、
今のところの代替案は
static volatile HogeRegister_t* const pHoge = (volatile HogeRegister_t*)MODE1_HOGE_REGISTER_ADDRESS;
theRegister::pHoge->X_OUT = signal;
です。
なんかくやしいです。
0162デフォルトの名無しさん
NGNGclass X : public int {};
って駄目なんだ?
0163デフォルトの名無しさん
NGNGメモリマップドI/Oに使うのはどーかと思うけど。
0164デフォルトの名無しさん
NGNGなら、
volatile HogeRegister_t* hoge_regs[] = { (CAST)MODE0, (CAST)MODE1};
するとか、
#define MODE0_HOGE_REG \
(*(volatile HogeRegister_t*)MODE0_HOGE_REGISTER_ADDRESS)
にするとか、何もテンプレートとかつかわなくてもいい気がするけど。
0165デフォルトの名無しさん
NGNGそうしたら、何かうれしい?
つか、その親仮想クラスint(class)がもつ、
intなvalueにどうアクセスする気?
素直に、IntClassを定義して始めたほうが…
0166デフォルトの名無しさん
NGNGそれは俺もオモタ
>>165
実際にやりたいとかで無く、ただ単に疑問に思っただけでしょう。
0167165
NGNGC++の文法/予約語の追加とかが待ってるから、
駄目だ、という話ですが。
0168デフォルトの名無しさん
NGNGでもtemplateとからめて考えたら,
そういうこと (class X : public int {};) ができたなら
わざわざtraitsクラスを作ったりせずに済むかもね.
0169デフォルトの名無しさん
NGNG{
//困った、このintの区別をどうつけてやろうか...
}
017019
NGNGあ、そうか。危ないですね。気をつけます。
あー、、、なるほど。
>>164
配列にするのは、メモリ領域が必要になるので、いただけません。
そのマクロなら結構自然な形で書けますね。
妥協案としていただきます。
0171162
NGNGclass Time : public time_t {};
って書きかけて疑問に思ったわけさ
上のクラスの批判は無しね
0173デフォルトの名無しさん
NGNGfunc( TIME & );
class TIME : public time_t, public double {
TIME()
: *this( 4400)
, *this( 2.5 )
{}
method() { func( *this ) ; }//AGGGGGGGGGG.
}
0174172
NGNGclass X : public void (*func)(int n) {
};
対抗して関数を継承してみた。
0175デフォルトの名無しさん
NGNGclass IHoge { virtual void method(int)=0; };
class Y : public (void IHoge::*(int)), int [50], char [128], public new
{...};
0176デフォルトの名無しさん
NGNG0177デフォルトの名無しさん
NGNGclass Io : public #include <cstdio>{};
0178デフォルトの名無しさん
NGNG0179デフォルトの名無しさん
NGNG0180デフォルトの名無しさん
NGNGあいつを見る限りおれはC++とCを一緒に勉強しといて
よかったなと思ったよ。
0181デフォルトの名無しさん
NGNG> 激リロードがいくらCが出来る人だとしても
そんなわけないって。
滅茶苦茶なキャストやポインタ演算見れば、C も使えないことは明らか。
0182デフォルトの名無しさん
NGNGアクセス制限は自由にかえることは
できますよね?
0183デフォルトの名無しさん
NGNGjavaにあるObjectOutputStreamのようにオブジェクトをそのまま送る
っていうことはC++ではできないんでしょうか?全部char*型にいったん
直さないといけないんですか?
0184デフォルトの名無しさん
NGNGマルチポスト逝ってよし!
0185デフォルトの名無しさん
NGNG0186デフォルトの名無しさん
NGNG0187デフォルトの名無しさん
NGNGツールを使う(ObjectStore, MFC の CArchive など)しか方法がない。
面倒だし、やってる人は少数派だと思う。素人には略
0188デフォルトの名無しさん
NGNGかな。探してみます。とにかくオブジェクトを文字列に直して、送って、
またオブジェクトに変換しなおすっていう作業が時間がかかって
いやなんです。
0189デフォルトの名無しさん
NGNG簡単にいうと言語レベルでのサポートはないですよ
データがほしいだけなら
::write(fd,this,sizeof(*this))
でいいんじゃない?
0190デフォルトの名無しさん
NGNGシリアライズって。こういったことは共通の
ライブラリを使うことで解決すべきだと思うが。
0191デフォルトの名無しさん
NGNGどこまで言語や標準ライブラリがやるべきかは、難しいところだな。
ただ、C++ はリフレクションなどの機能を言語レベルでサポートしていないので、
シリアライズを実装しようとすると、Java などと比較すると余計な手間がかかる
のは確かだ。
(自分で書くと、わりとめんどい)
0192デフォルトの名無しさん
NGNG仕様:
整数型に変換できないこと。
あらゆる型のポインタに代入できること。
あらゆる型のポインタと等価比較できること。
class NullPointer{
private:
NullPointer(const NullPointer&);
const NullPointer& operator=(const NullPointer&);
void* operator&();
public:
NullPointer(){}
template<typename T> operator T*()const{ return 0; }
};
NullPointer nullPointer;
template<typename T> inline bool operator==(T* p, const NullPointer&){ return p==0; };
template<typename T> inline bool operator!=(T* p, const NullPointer&){ return p!=0; };
template<typename T> inline bool operator==(const NullPointer&, T* p){ return 0==p; };
template<typename T> inline bool operator!=(const NullPointer&, T* p){ return 0!=p; };
#include <cstddef>
#undef NULL
#define NULL nullPointer
0193デフォルトの名無しさん
NGNG先生!ウチの職場では
memset(buf,NULL,sizeof(buf))←こんなコードが蔓延しています
(0で初期化したいらしい)
それ使えません。
0194188
NGNGそんなやりかたできますか?調べてみます。
0195デフォルトの名無しさん
NGNG0196Java暮雨
NGNGなにか問題あるの?
0197Java暮雨
NGNG0198割り込み
NGNG0199デフォルトの名無しさん
NGNGNULL は 0 だ派の戦争が勃発するのでやめまっしょう。
0200Java暮雨
NGNG問題ないんじゃねの?
0201189
NGNGただし単純なクラスにしかつかえませんよ
ポインタをメンバにもってるクラスとかだと駄目ですよ。
0202192
NGNG0203Java暮雨
NGNGこれって何のためにそうするんですか?
0204デフォルトの名無しさん
NGNG浅いコピーってやつね。
あれって英語でなんていうんだっけ?シャローコピー?
0205デフォルトの名無しさん
NGNG全ての型に共通する初期値としてNULLを
考えてるのがいるんだよ。
0206193
NGNGスモールトークではNULLのインスタンスは1つしかありません。
(UndefindObjectの唯一のインスタンスだったかな?)
0208仕様書無しさん
NGNG現在TCPのパケットダンプツールを作成しています。
そこで拾ってきた数値・・例えば
45 00 00 28 64 f8 40 00 3d 06 a5 04 d3 13 a0 10 E..(d.@.=.......
c0 a8 00 07 00 6e 11 09 d6
を整形(人が識別出来る形)して表示する為にはどのようにすればよいのでし
ょうか・・・
このスレにお分かりになる方はいらっしゃいますでしょうか・・・
情報のポインタだけでもお教え頂くだけでもかまいません。
あわれな漏れにご教授下さい。
C++BuilderVer5.0UP1 Win2000です。
0209デフォルトの名無しさん
NGNG0210仕様書無しさん
NGNG例えば「プログラマ」とか「プログラム」とかの文字への変換です・・・
日本語下手ですいません。。。。。
0211デフォルトの名無しさん
NGNGsprintf(結果を入れる変数, "%s", バッファ);
じゃ駄目なのか?
0212デフォルトの名無しさん
NGNG80番なら、httpのルーチンにでもまわせばいいし。
ftpのまわりは面倒だけど、できないこともなかろう。
0213仕様書無しさん
NGNGVIGILのようなLAN上に流れているTCPを取得して、その情報を分かりや
すく表示するソフトを作成しています。
※VIGILとはまた別方向ですが・・・
その為、208で記載したような情報を取得したのですが、Winsock2.0で
取得したのですが漏れにはTCPDUMPを文字数値に変換出来ない
(わからない)のです。
あうーーー。どうすれば・・・
0214デフォルトの名無しさん
NGNG左にダンプリスト、右にその ASCII 表示てな。
0215デフォルトの名無しさん
NGNGTCPヘッダの構造解釈
とかってところから始めないとだめでそ
0216仕様書無しさん
NGNGSMTPとPOP3のみのデータのみを取得し、表示したいのれす・・・
上記は208を解析出来れば実現出来ると考えたのれす・・・
0217デフォルトの名無しさん
NGNG0218デフォルトの名無しさん
NGNG0219デフォルトの名無しさん
NGNG0220仕様書無しさん
NGNGいえいえ。ありがとうございます。
Source AddressとDestination AddressさらにSource PortとDestination Port
等は取得できているのれす・・・
ただ解析がどうしても・・・・出来ないのれす・・・知恵を貸してくらさい・・
0221デフォルトの名無しさん
NGNGやりとりされるデータを知らないと。
やっぱりネットワークプログラミング相談室かなw。
0222仕様書無しさん
NGNGありがとうございます。その「ネットワークプログラミング相談室」とは
どこにあるのでしょうか・・・
お教え頂けないでしょうか?
0223仕様書無しさん
NGNG0225仕様書無しさん
NGNGありがと。ありがと。
0226デフォルトの名無しさん
NGNG0227仕様書無しさん
NGNG0228デフォルトの名無しさん
NGNGいえいえ。一瞬でもお考え頂いたのです。ありがとうございます。
すいませんでした。
0229デフォルトの名無しさん
NGNGwindows.h をインクルードしたいのですが、BYTE という名前が
別に(ちゃんとした名前空間の中に)宣言されているので
あいまいなシンボルです
と言われてしまいます。global namespace を荒らすヘッダをうまく
インクルードするコツみたいな物はあるのでしょうか?
よろしくおながいします。
0230デフォルトの名無しさん
NGNG試さないで言ってるけど
namespace win32 {
#include <windows.h>
}
とかダメ?
ってゆーか
> 別に(ちゃんとした名前空間の中に)宣言されているので
それなら、そっちのBYTEとグローバルのBYTEはあいまいにならない気がするんだけど…。
0231デフォルトの名無しさん
NGNGusing namespace std;
を入れちゃう人だったりして。
0232デフォルトの名無しさん
NGNG0233デフォルトの名無しさん
NGNGtypedef char BYTE;
namespace A{ typedef char BYTE; }
この2つは
::BYTE
::A::BYTE
で区別できると思うけど?
0234229
NGNG小さなクラスだったので、.h と .cpp に分けてなかったファイルに BYTE が
宣言されてました。
>>230
それは試してみましたが駄目です。
>>231
今回はそうなってました^^;
>>232
殺されてしまうのですか?
>>233
namespace A に属する方を全部 A::BYTE と書かないといけないんですよねぇ…?
(windows.h とそれに引っ付いてくる山ほどのヘッダの中の BYTE を全部 ::BYTE に書き換えないかぎりは)
私なんか勘違いしてます?こういうもの?
0235デフォルトの名無しさん
NGNGusing をやめるのが一番です。
0236デフォルトの名無しさん
NGNGはやめるべき。
せいぜい、
namespace hoge {
class hage {};
}
using hoge::hage;
程度にしておく。
0237234
NGNGクラスなら型名がそんなに頻出しないのでいいのですが、
BYTE とか(Javaでいうプリミティブ型、.NET でいう値型)に対応する物なので
あちこちに出現しまくりです。
C 言語用のヘッダを C++ で使うことにやっぱり無理があるんですね…。
C99 は名前空間サポートするんでしたっけ?
早く世の中のすべての言語に名前空間がサポートされる日がこないかな…。
0238デフォルトの名無しさん
NGNGpublic:
int const a[2];
};
としたときのa[2]の初期化ってどうやるのでしょう?
0239デフォルトの名無しさん
NGNG0240デフォルトの名無しさん
NGNG初期化リストで。
0241デフォルトの名無しさん
NGNG#define BYTE XXX::BYTE
で逃げるという手も無くはない
0242デフォルトの名無しさん
NGNGどうしたらいいでしょうか?
どうもコンパイルできない。
0243デフォルトの名無しさん
NGNG0244デフォルトの名無しさん
NGNG0245デフォルトの名無しさん
NGNGまったく関係ない別のクラスでもいいの?
0246242
NGNGC++のバージョンできまるんですかね。
クラスの外の別の関数に渡したいのです。
0247242
NGNGのような関数があったとき、メンバ関数を引数にして呼び出したいのですが・・・
コンパイルできませんでした。
できないということは別の抜け道があるのでしょうか?
0248デフォルトの名無しさん
NGNG仮引数もそれを受け入れられる型になっていれば受け取れる。
staticメンバじゃないなら、それを呼ぶときは->*演算子でその所属クラスのオブジェクトを隠れ引数thisに渡す必要がある。
つーか、本嫁
0249デフォルトの名無しさん
NGNGとりあえず今どう書いて動かないのかをここに書け。
0250デフォルトの名無しさん
NGNG出来ませんな。メンバ関数は呼び出すためには、関数のアドレスの他にインスタンスのアドレスも必要と理解すれ。
0251sage
NGNGpublic:
double func1(double);
double func2(double);
typedef double (MyClass::*MyClassFuncPtr)(double);
friend double mona(MyClass *p, MyClassFuncPtr);
};
double MyClass::func1(double d)
{
return d - 1.0;
}
double MyClass::func2(double d)
{
return d + 1.0;
}
double mona(MyClass *p, MyClass::MyClassFuncPtr funcp)
{
return (p->*funcp)(1.0);
}
int main()
{
MyClass obj;
MyClass::MyClassFuncPtr p = obj.func1;
double d1 = mona(&obj, obj.func1);
double d2 = mona(&obj, obj.func2);
return 0;
}
こんなんだろ?
さあ、次々
0252247
NGNG248-251をもう一度よくよんで考えてみます
0253デフォルトの名無しさん
NGNG「C++第三版」っつのは C++ のバージョンのことじゃないぞ…
0254デフォルトの名無しさん
NGNGどうすればいいんでしょう?
皆さんはどうしてますか?
0255デフォルトの名無しさん
NGNG0256デフォルトの名無しさん
NGNGそれだけじゃだめだろ。純粋仮想にした上でデフォルト実装を提供しなきゃ。
0257デフォルトの名無しさん
NGNGインタフェースを継承して、インタフェースとその実装は分離しなさい。
0258デフォルトの名無しさん
NGNG256 もその一つ。
0259257
NGNGメンバに
void force_pure() = 0;
をおまけで一個だけ付けときゃーいいんでないの?
継承する側に
void force_pure() {}
を付けとくひつようあるけど。
class Interface {
};
0260257
NGNG0261デフォルトの名無しさん
NGNGコンストラクタを protected に。
0262デフォルトの名無しさん
NGNG何だと!同じコードを何度も書けというのか。
0263257
NGNGclass 262が使い回すと便利だと思っている機能クラス {
public:
262が使い回すと便利だと思っている機能();
};
class 262のバカクラス1 {
private:
262が使い回すと便利だと思っている機能クラス foo;
};
class 262のバカクラス2 {
private:
262が使い回すと便利だと思っている機能クラス foo;
};
0264デフォルトの名無しさん
NGNG#define UNTIL(x) while(!x)
ってやっちゃ駄目ですか?やっぱりご法度?
理由も沿えてお願いします。
0265デフォルトの名無しさん
NGNG#define UNTIL(x) while(!(x))
ってツッコミは却下?却下?
0266264
NGNG> > C/C++ の経験浅いんですけど
って言ってあるじゃん(汗)。言いたいことは伝わったでしょ?
0267デフォルトの名無しさん
NGNG#defineを Cでインライン関数書くとか
定数宣言以外の目的に使うヤツって嫌い。
0268デフォルトの名無しさん
NGNGわかりにくいソースになるからダメ。
趣味で個人的に作ってるヤツとかだったら別にかまわんけど。
例えば
#define loop for(;;)
void func(){
loop{
…
}
}
とかやられて読みやすいですか?
0269264
NGNGそれはわかるんですけどねぇ。
while があってなぜ until がないのか、カーニハンとリッチーを小一時間問い詰めたいです。
さらに付け足すチャンスのあったストラウストラップとか Sun の人(誰だっけ?)
とかヘジルスバーグとかも小一時間問い詰めたいです。
でも Perl はやりすぎだよねと思う今日この頃です。
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNG好きなので、釈由美子を共用PCの壁紙にしてよいですか?
理由も沿えてお願いします。
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNG(ウインドウが開くだけでもいいから)
参考になるサイトなどありましたら、教えていただけないでしょうか?
0274デフォルトの名無しさん
NGNGとりあえず猫。
http://www.kumei.ne.jp/c_lang/
説明はVC++でやってる部分もあるけど、基本的にBCCでも大丈夫。
0275デフォルトの名無しさん
NGNGありがと。ページの存在は知ってたけどVC++を使ってるみたいだったから
詳しくは見てなかった…
やってみます。
0276デフォルトの名無しさん
NGNG釈由美子がなんなのかわからんが、
あんまりオタな壁紙は張るなよ。
新入社員が引くからな
0277デフォルトの名無しさん
NGNG普通はどうするのでしょうか?ポインタだけでも教えていただけるとうれしいです。
あと余談ですがstring::sprintfみたいなメンバー関数(クラスメソッド?)が存在しないのは何故なんでしょうか?
よろしくお願いします。
0278デフォルトの名無しさん
NGNG釈由美子ってグラビアアイドル(?)だったような…
オタな壁紙しか張らない人にはわからないかもしれませんが。
0279デフォルトの名無しさん
NGNG0280デフォルトの名無しさん
NGNG知ってるから。
0281デフォルトの名無しさん
NGNGstringstream を使うか、適当な char[] に sprintf した上で string::assign() で書き
込む。
sprintf が存在しないのは、型安全性を重視してのことと思われ。
0282デフォルトの名無しさん
NGNGを自作するとか
0283デフォルトの名無しさん
NGNGラベルから break までを {} で囲ったのですが、このコードは移植性に
問題はないでしょうか?
0284デフォルトの名無しさん
NGNG問題ない
0285デフォルトの名無しさん
NGNG問題ない。
ちなみにどんなエラーがでるんだ?
0286デフォルトの名無しさん
NGNG後ろにさらにcaseラベルがあるときに、constructできないから
問題あるって話やないかね。
0287283
NGNG大丈夫なんですね、ありがとうございます。
>>286
多分そうです。
srcfile.cpp(次のラベル行) : error C2360: '変数名' の初期化が 'case' ラベルによって行われませんでした。
srcfile.cpp(変数宣言行) : '変数名' の宣言を確認してください。
というヤツです。
0288デフォルトの名無しさん
NGNGg++ -Wall -W... より五月蝿い事言ってくれるのをキボンヌです。
0289デフォルトの名無しさん
NGNGVisual C++ 5.0 です。
0290デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1014478527/423
↑に書いたのですが、こっちの方がふさわしいと思ったので
移動してきましたm(..)m
0291デフォルトの名無しさん
NGNGstd::vectorとかの実装に使われてます。mallocとかで確保しただけの未初期化メモリエリアにコピーコンストラクタでオブジェクトを構築するために使うんだと思います、たぶん。
>>289
removeってeraseのこと?
0292289
NGNG本当だ、ありました。本にはremove()と書いてあったので・・・。ありがとうございました。
0293デフォルトの名無しさん
NGNG// arrayに値を入れる
deque<int> a_deque;
ここで、a_dequeにarrayの中身を移したいのですが、
for文を使わずに済む方法ってありますか?
0294デフォルトの名無しさん
NGNG0295デフォルトの名無しさん
NGNGstd::copy(array, array + 2000, std::back_inserter(a_deque));
とか?
0296デフォルトの名無しさん
NGNGなぜにback_inserter???
0297デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNG駄目?
>297
そうですね。
0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNG>STLのstringに対してsprintfみたいなことをしたいのですが
こんなのどう
#include <string>
#include <vector>
#include <cstdarg>
using namespace std;
int strprintf(string& s,const char *format,...)
{
va_list va;
va_start(va,format);
vector<char> buf;
int k, n = 63;
while (true) {
buf.resize(n+1);
k = _vsnprintf(&buf[0],n,format,va);
if (k > 0 && k < n) break;
n = n*2 + 1;
}
va_end(va);
s.assign(buf.begin(),buf.end());
return k;
}
0302デフォルトの名無しさん
NGNGvtable がいつ初期化されるのかというのは C++ の規約に決まっているのでしょうか?
0303デフォルトの名無しさん
NGNG0304デフォルトの名無しさん
NGNGダウト。ANSI C++ の規格書では
12 Special member functions
12.6 Initialization
12.7 Construction and destruction
この項目 3 で明確に規定してある。
>>302
コンストラクタ中で仮想メンバ関数を呼び出した場合には、派生クラスではなく、
そのクラス、もしくは規定クラス中の最も外側で定義された仮想関数が呼ばれ
る。
class Base {
public:
virtual void foo();
Base() { foo(); } // この foo() は常に Base::foo() を呼び出す
};
class Deriv : Base {
public:
virtual void foo();
};
vtable はコンストラクタが実行される直前に初期化されます。
Deriv d;
は仮想的な C++ コードで書くと、次のような処理に展開できる。
d.vptr = Base::vptr; // まずは Base クラスの vtbl が設定される
d.Base(); // Base クラスのコンストラクタが呼ばれる
// vptr == Base::vptr なので foo() は Base::foo() を呼び出す
// ここまでで基底クラスの構築は完了、次に派生クラスの構築を行う
d.vptr = Base::vptr; // Deriv クラスの vtbl が設定される
d.Deriv(); // Deriv クラスのコンストラクタが呼ばれる
// 作成完了
d.foo(); // vptr == Deriv::vptr なので foo() は Deriv::foo() を呼び出す
// 実際には d が Deriv クラスのインスタンスであることをコン
// パイラは分かっているから、vptr を介さずに直接 Deriv::foo()
// を呼び出すコードを作成するけど。
したがって、デザインパターンの Template Method っぽい処理を行いたい場合に
は、コンストラクタは使えません。
0306デフォルトの名無しさん
NGNGstatic const boost::regex reg("^([a-e]){1,5}([^a-e].*)$");
などとした場合に、最初の括弧の部分を1〜5個、全部あとで得ることはできないでしょうか。
boost::regex_match だと、例えば"abc_"を与えると、"c" "_" の2つしか
得られません…。
0307デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNG#include <string>
#include <fstream>
0309デフォルトの名無しさん
NGNGそれだけだとstringを認識しないんですけれども。
0310デフォルトの名無しさん
NGNG0311デフォルトの名無しさん
NGNG0312デフォルトの名無しさん
NGNG0313デフォルトの名無しさん
NGNG0314デフォルトの名無しさん
NGNG0315デフォルトの名無しさん
NGNGってかそれしか知らないのでそれとして受け取ります。
でもusing namespace std使うと今度はofstreamが使えないんですけれども。
そこが一番聞きたい所なのです。
0316デフォルトの名無しさん
NGNGofstreamが使えなくなるってのも不可解だが、それなら
using std::string; と書くか、stringを使う時、
その前にいちいちstd:: をつければ (string ではなく
std::string と書く) いいとおもうよ。
0317デフォルトの名無しさん
NGNG0318デフォルトの名無しさん
NGNGとても為になりました。
でもstd::stringってやったら<<が使えなくなりました。
何が違ってるのでしょう?
>>317
<fstream>に変えてみたらofstreamが認識されませんでした。
0319デフォルトの名無しさん
NGNG<fstream>ヘッダは、中身が
namespace std {
#include <fstream.h>
}
されてるんですよ。
名前空間の勉強をしないとこれ以上は無駄なように思われ…
0320デフォルトの名無しさん
NGNG助けてくれた方々ありがとうございました。
0321デフォルトの名無しさん
NGNG0322デフォルトの名無しさん
NGNG0323デフォルトの名無しさん
NGNG何がしたいの?
0324kenta
NGNGダブルクォーテーションで囲んだらヌル文字が付くと思われ。
0325デフォルトの名無しさん
NGNG0326デフォルトの名無しさん
NGNG0327デフォルトの名無しさん
NGNGネタか?
0328デフォルトの名無しさん
NGNG^([a-e]{1,5})([^a-e].*)$ 括弧の範囲に注意。
0329デフォルトの名無しさん
NGNGclass A {
public:
virtual int foo(int a);
}
class B:public A {
public:
virtual int foo(int a,int b);
};
のように、仮想関数の
引数の違うオーバーライドって、オブジェクト指向設計上問題あるのでしょうか?
どうしても、使いたいときがあるので気になっています。
使いたいときがあること自体問題あるのでしょうか?
0330デフォルトの名無しさん
NGNG言語設計上の問題はある。なんつったり
0331デフォルトの名無しさん
NGNG0332デフォルトの名無しさん
NGNGそれはオーバーライドではなく、単に違う関数(オーバーロード)。
0333デフォルトの名無しさん
NGNG0334デフォルトの名無しさん
NGNG0335デフォルトの名無しさん
NGNG0336デフォルトの名無しさん
NGNG0337デフォルトの名無しさん
NGNG0338デフォルトの名無しさん
NGNG0339デフォルトの名無しさん
NGNGちなみに、the proving ground of the mad overlord にはどういう意味があるの?
調べたらウィザードリとしか分からないです。
0340デフォルトの名無しさん
NGNG0341デフォルトの名無しさん
NGNGpublic:
const int a[10];
A():a(){};
};
の配列メンバイニシャライズが謎です。何故でしょう?
0342デフォルトの名無しさん
NGNG0343相談者
NGNGズブズブはまっていってしまうんですが、、、
0344デフォルトの名無しさん
NGNG0345デフォルトの名無しさん
NGNGで、Modern C++を読んで、ああ、まだ行き着いてはいなかったんだ。
でも、ここまでやったら馬鹿だな、と反省しなさい。
0346デフォルトの名無しさん
NGNG「リソースの獲得は初期化」っていうイディオムの実装方法を考えてます。
CFile file;// not MFC 自作クラスのCFileです
if(file.Load("test.txt") == false) return ERROR;
string str = file.ReadOneLine();// 一行読み込み
みんなこんな感じのコードを書いてると思うんですけど。
「リソースの獲得は初期化」を実装すると、こうなるんじゃないかと。
if(CFile::IsExist("test.txt") == false) return ERROR;
CFile file("test.txt");
string str = file.ReadOneLine();// 一行読み込み
CFileはファイルを処理するクラスなんですから、CFileのインスタンスが
存在するときには、いつでもそのインスタンスでひとつのファイルを
処理できなくちゃいけない、というのがこのイディオムの意味だと
思います。だから、逆に言えばいつでも処理できるという状態を基準にして、
インスタンスを生成しなければならないんじゃないかと。そのために、
1.常に「コンストラクタでリソース確保」&「デストラクタでリソース解放」
2.Open,Load,Read,Createなどの関数での、リソースの途中確保はさせない。
3.Close,Release,Destroyなどの関数での、リソースの途中解放はさせない。
というのが、「リソースの獲得は初期化」ってイディオムを実装したスタイル
なんじゃないかと思います。
「リソースの獲得は初期化」って、リソースリークが激減し、かつ効率も
良さそうで素晴らしいイディオムだと思ったんですが、グーグっても一件しか
出てこなったのが不安でなりません。それに、どっかで「コンストラクタで
なんでもかんでもやろうとするな」とか書いてあったのを見かけたのが
気になって、これを実践するのを躊躇しています。
どなたか、このイディオムを実践されてる方はおられませんか?
実践されてる方がおられましたら、このイディオムでクラス設計をするときの
注意点などを教えて欲しいです。
0347デフォルトの名無しさん
NGNGIsExistをやった直後に別プロセスからファイルを削除されちゃったり権限が更新されちゃったりして
CFileコンストラクタで失敗しちゃう可能性あるよね。
そういうとき例外を投げればいいとは思うんだが、ファイルのオープンの失敗みたいなありふれたことで
いちいち例外をハンドルしなきゃいかんのかと思うと、鬱になるよね。
ファイルI/Oに関して言えば
fstreamの実装みたいな柔軟性(コンストラクタでオープン、もしくは別メソッドでオープン)があれば
どっちでもいいんじゃねえの?というのが、俺様の感想。
それ以外のクラスは、やはりそれに応じてコンストラクタでやるか、別メソッドでやるか、
どっちでもできるようにするか、考えなきゃ移管よね。
0348デフォルトの名無しさん
NGNGこれは例外でもいいと思う。
0349デフォルトの名無しさん
NGNGわざわざExistで判別する意味ないよね、といってみるテスト。
0350デフォルトの名無しさん
NGNG実行と、実行の前提条件のテストを別処理にするのは、うまいやり方ではない、といってみるテスト。
0351デフォルトの名無しさん
NGNG処理を分けようが一つにしようが勝手にしろといってみるテスト。
0353デフォルトの名無しさん
NGNGどうしたらいいのでしょうか?
0354デフォルトの名無しさん
NGNGclass A : public B {
A();
}
A::A()
: B()
{
}
みたいなことを逝っているのか?
0355デフォルトの名無しさん
NGNG使い分けたいって言うならoverload使う
0356346
NGNGいちおう、この例の場合、CFileのコンストラクタで例外を投げることを
想定しています。CFileは、CGraphicやCTextのメンバ変数として使われることが
多いでしょうから、戻り値でエラーを返すよりも、例外を返した方が取り扱い
しやすいんじゃないかと思います。それで、戻り値でエラーが欲しい場合は、
その前にIsExistで確認すればいいんじゃないか、という意味でチェックを
入れてます。
>>352
ぎゃふ。アホですか。すんません。例外を投げる以上、もうエラーチェック
しない方がいいですか。ていうか、いわれてみれば確かにそのとおりですね。
まだ例外の扱いになれてない…っていうか、使ったことない厨なので。(^^;
>>350
>クラスのあずかり知らぬところで状態が変化する
この一言、心に留めておきます。
とりあえず、例外を勉強してきます。
0357346
NGNGclass A{
A(int);
A(int,int);
int a_,b_;
};
A::A(int a,int b) :
a_(a),
b_(b)
{
}
A::A(int a)
{
this->A(a,a*2)
}
>>353は、こんな感じで、コンストラクタのひとつから別のコンストラクタを
呼び出すことで処理させたいけど…って話のような気がします。
解決策は…覚えてないけど。(^^;
0358353
NGNGclass A{
public:
A(int);
A(int, int);
}
A:A(int a1)
{
A:A(a1,100)したい;
}
A:A(int a1, int a2)
{
処理;
}
したいんです。
0359358
NGNGま、まさしくそのとおりです^^;
0360デフォルトの名無しさん
NGNGC++ のコンストラクタは、メソッドとは扱いが根本的に異なるので、無理。
private な共通初期化メソッドを用意して、コンストラクタから呼び出すのが
一般的。
0361デフォルトの名無しさん
NGNGpublic:
A(int, int=100);
}
じゃダメなのか?
0362デフォルトの名無しさん
NGNG0363デフォルトの名無しさん
NGNGややこしいエラーを招くので使うべきではない。
・・・というのをExceptional C++あたりで読んだ気がする。
0364358
NGNGありがとうございました。
0365デフォルトの名無しさん
NGNGstd::string って使ってる?
その場合日本語の扱いってどうしてるの?
wstringでunicodeで作るのが良いのかと思ったんですけど
でもstring<->wstring変換の関数って無いですよね?
0366デフォルトの名無しさん
NGNG0367デフォルトの名無しさん
NGNGどうやってeofって認識させられるんですか?
text file に書き込んでる時に行の一番最後に<<endl;って入れてるんですが
そんなのお構い無しにどんどん空白を読み込んで行ってしまうのですが?
って俺の言ってる意味分かりますかね?
0368デフォルトの名無しさん
NGNGstd::basic_string<_TCHAR>を多用している。
VCなら全然問題なし。
汎用キャラクタマッピングには慣れといた方がいいよ。
って、これもVCだけか。
0369sage
NGNG0370デフォルトの名無しさん
NGNG0371デフォルトの名無しさん
NGNG内部で同時に扱うって話だったら、
内部コードはひとつで入出力時にそれぞれ変換する
0372デフォルトの名無しさん
NGNGpublic:
void func(void){cout<<"func"<<endl;};
void foo(void){cout<<"foo"<<endl;};
};
classの頭についているこのconstは一体何の意味が・・・?
エラーも警告も出ないと言う事は、ちゃんとした文法ですか?
VC使ってます。
0373デフォルトの名無しさん
NGNG単なる空白の宣言
0374
NGNGwindowsのコマンドプロンプトにはないんですか?
0375デフォルトの名無しさん
NGNGVC++で書け
、、、としかこのスレでは言えねえわな(わら
0376デフォルトの名無しさん
NGNGそして移植性にも問題ないんでしょうか?(VC6とBC5ではちゃんとコンパイルできました)
#include <stdio.h>
struct A
{
int elem1;
int elem2;
int elem3;
};
A func()
{
A a;
a.elem1 = 0;
a.elem2 = 1;
a.elem3 = 2;
return a;
}
void main(void)
{
A a;
a = func();
printf("%d %d %d", a.elem1, a.elem2, a.elem3);
}
0377デフォルトの名無しさん
NGNG0378デフォルトの名無しさん
NGNG問題ないけど、できるなら、
A a = func();
ってやったほうが、効率がよい。元のやつだとコンストラクタが3回、
コピー代入が1回呼ばれるけど、上のやり方ならコンストラクタが
2回呼ばれるだけ。
0379376
NGNGありがとうございます。特に問題はないんですね。
> 元のやつだとコンストラクタが3回、コピー代入が1回呼ばれるけど、
> 上のやり方ならコンストラクタが2回呼ばれるだけ。
あー struct にもコンストラクタってあるんですか…。
C → Java → (今)C++ やってる(Cやってた頃はあんまり気にしなかった)ので。
ところで A a = func(); ではコピー代入(ってコピーコンストラクタの呼び出しみたいなものですよね?)が起こらないんですか?
メンバーをコピーしてくれるコンストラクタが自動生成されるのでしょうか?
あと、こういう関数を見ないのは引数で参照渡しの方が効率がいいからですよね?
0380デフォルトの名無しさん
NGNGEffective C++ あたりをいっぺん読んでみるといいかもよ。
0381デフォルトの名無しさん
NGNG> あー struct にもコンストラクタってあるんですか…。
いちど synthesize constructor, trivial constructor で検索して、違いを良く
理解しとくと良い。書籍なら Inside the C++ Object Model が詳しく解説して
る。
0382デフォルトの名無しさん
NGNG「メンバーをコピーしてくれるコンストラクタ」ってのがコピーコンストラクタ。
定義されていない場合は、コンパイラが勝手に生成してくれる。
A a = func();
って書くと、ふつうは、
A a( func() );
と同じように扱われるはず。で、func() の末尾の
return a;
のところで、コピーコンストラクタが呼ばれる。ついでに書くと、
struct A にもコンストラクタを定義してやって、
return A(0, 1, 2);
としてやると、コンストラクタの呼び出しは1回で済んじゃう。
このあたりの詳しいことは、>>381 の本に詳しいんだけど、訳本はトッパン
だったから、今は絶版?
0383デフォルトの名無しさん
NGNGデフォルトのアクセス属性の違い以外は
まったく同じですよね?
0384デフォルトの名無しさん
NGNG継承のデフォルトも違う。
0385デフォルトの名無しさん
NGNGところでこれどういう意味?
0386デフォルトの名無しさん
NGNGウィザードリィというコンピュータ RPG のルーツとなるゲームがあるんだが、
その第一作目のタイトル。邦訳は「狂王の試練場」だったかな。
基底クラスの関数を隠してしまうという「トチ狂ったオーバーロード」(使うな
よ、そんなもん)と「mad overload」をかけたんでしょ。
0387デフォルトの名無しさん
NGNGなるほどなるほど。
しかし>>333,335,336が三つかぶってるのは凄いね。
0388デフォルトの名無しさん
NGNGその洒落の初出はどこですか?
良い情報源になりそうな気がする。
0389デフォルトの名無しさん
NGNG0390デフォルトの名無しさん
NGNG0391デフォルトの名無しさん
NGNG0392デフォルトの名無しさん
NGNG0393389
NGNGコンストラクタを private にしたら、static 関数で生成する以外に方法が浮かばないんですが、そうするしかないですか?
今、ただのフラグ群なんだけど、いちいち取り出すのが面倒くさいので
ビットごとに取り出すインラインメンバ関数を持ったクラスを作ろうと
思ってるのですが、継承される可能性があると、仮想デストラクタを作らなければいけないので、仮想関数テーブルを持ちますよね?
そうするとサイズも大きくなるし、重くなるし困ります。
常にスタックに積むような使い方をしたくて、最適化コンパイルされた時に
ただの unsigned int になるようにしたいのです。
どうしたらいいでしょうか?
0394デフォルトの名無しさん
NGNG// 継承したら殺す
class A {
};
0395デフォルトの名無しさん
NGNG周知徹底しとくだけでよいのでは?
0396デフォルトの名無しさん
NGNGスライシングして問題を起こしてみるレス。
0397デフォルトの名無しさん
NGNG0398デフォルトの名無しさん
NGNG2. 継承する必要性が生じるまでは継承しない。
3. そもそも継承が必要な場合以外に継承はしない。
これらを守れば デストラクタを virtualにしなきゃいかんかどうかで悩む必要はなくなる。
性能を重視してるなら、「継承はしない」という前提で作ってよし。
デストラクタがvirtualでなければ一目瞭然だが、世の中にはバカもたくさんいるので
コメントとドキュメントを書いておけ。
0399デフォルトの名無しさん
NGNGコードで例外投げても平気ですか?
0400400
NGNGってああ!!!!
すっかり忘れてた!!
今日こそはGCCをISDN回線で落とそうと思って挑んだのに
スカーリ忘れてたYO!!
ありがとう>>399さん
g++って書いてくれなかったらわからなかったス
0401389
NGNGもともとこういう趣旨のクラスって邪道だし、スマートに禁止できないなら
しょうがないですね。
みなさんありがとうございました。
0402デフォルトの名無しさん
NGNGキーワードがあれば便利なのにね。
unsucceed class A {
};
ってな感じで。造語をキーワードにしちゃまずいかも知れんが。
0403デフォルトの名無しさん
NGNG何でもかんでも取り入れる必要はないでしょ。
0404デフォルトの名無しさん
NGNG現場に必要なのは安全カミソリじゃない。
よく切れて、いつでも研げるカミソリなんだ。
0405デフォルトの名無しさん
NGNGカンタン♪
0406402
NGNG「効率をまったく犠牲にすること無く、コンパイラに禁止事項を伝える」
って意味で、constと同じレベルの価値があると思うんだけどなぁ。
安全カミソリが嫌いなあなたは、constで安全性を確保したりは
されないんですか?
0407デフォルトの名無しさん
NGNG窓の場合で言うと、Java にある last のような機能がなくても、
もしそのクラスが DLL からエクスポートされるものなら、
protected メンバやコンストラクタをエクスポートしないでおくことによって、
事実上、派生クラスが作れなくなる。
(インスタンスは専用のグローバル関数で作る)
漏れはこの方法で「設計上の安全性」とでもいうかな、一応、間に合っている。
0408404
NGNGconstはもちろん使うよ。
安全性確保と最適化のためにね。
だが、Javaでいうところのfinalなんてもんが言語仕様的に
必要とは思えないんだ。
constとfinalではキーワードとしての重みが違う。
constは必要だが、finalはなくても良いし、なくても困らない。
くだらない言語仕様を追加されてもなあ..と思っただけよ。
0409404
NGNG昔使ったXXとYYを合成したらどっちも使えて便利だなあ、などの
思いつき中心で事を進めるアホPGでもなければ、そんなキーワード
いらんよな。
バカよけは全くの不要だとは思わないが、そういうレベルのPGは
もっとくだらないレベルで、もっとくだらない間違いを犯すだろう。
GCが欲しいだのポインタがわからないだのいう連中は、
そういうものから解放された、別の言語を選べばよいのだと思う。
0410デフォルトの名無しさん
NGNGpure virtual base classしか見せなければ、ほぼ自動的に
finalみたくなるとおもうがどうか。
0411デフォルトの名無しさん
NGNGそのアホPGを見分ける洞察力と、事前にプロジェクトから外す政治力があるなら
要らないな。
0412デフォルトの名無しさん
NGNG「ここに inline つけても絶対インライン展開されない気がする〜」という状況なので、リンカの働き、オブジェクトファイルの内容等について詳しい方にお聞きしたいのですが、
.h ファイルに宣言だけされていて、 .cpp ファイルに実装が書いてあって
全ての .obj を最後に一括リンクするような事をした場合、
どうやっても .cpp 内の関数はインライン展開されないですよね?
それとも .obj 内の情報からインライン展開してくれるものなのでしょうか?
0413デフォルトの名無しさん
NGNGする
0414デフォルトの名無しさん
NGNGリンクという動作が実際にはどんなことをするのか、ちゃんと理解した方がよいと思う
0415デフォルトの名無しさん
NGNGコンパイル単位越えてインライン展開してくれるよ〜ん
と人心を惑わせる情報を出してみるテスト
0416デフォルトの名無しさん
NGNGキャンセルボタンが押された
処理が一定の量に(検索結果が一定数に)達した
等で中断したい時、
例外を投げてループを抜けるのは邪道ですか?
例外を使わないなら、ループの最中に毎回フラグを見ることになるし
中断か全終了かの判断も返り値で見る事になって面倒くさいんですが。
(ボタンが押されたかどうかは、結局フラグを見なければいけないけど)
0417デフォルトの名無しさん
NGNGどれくらいのものか知りたいんだけど・・・発売まで待ちかな
0418デフォルトの名無しさん
NGNGhttp://msdn.microsoft.com/msdnmag/issues/01/08/bugslayer/bugslayer0108.asp
ここにちょっとだけ紹介されてたッスね。
0419デフォルトの名無しさん
NGNGリンカエラーが出ますが、これも回避する方法はありませんよね?
413が気になるのですが・・・
リンカの動作についての詳細な説明は、どこを見ればいいでしょうか?
後、STLのクラス群は継承されることを想定しているのでしょうか?
0420デフォルトの名無しさん
NGNG0421デフォルトの名無しさん
NGNGinline関数(実体があるもの)は展開できる
templateは実体が無いから展開できない
0422デフォルトの名無しさん
NGNG継承の目的による。
- unary_function のような関連型定義のクラスは、継承すること前提。
- basic_string や vector などのコンテナクラスは、デストラクタが virtual でない
時点で何かを感じてくれ。
0423419
NGNG>>420,422
はい、所有することにします。
コンテナに独自のメソッドを追加するために継承しようとしてました。
デストラクタの定義を見ようとしたんですが、
どこを見ればいいのか分からなかったんです。すいません。
0424デフォルトの名無しさん
NGNGを開放するとき
delete p,p2;
ではだめですか?
deleteにコンマを付けるとコンマ演算子として働くのですか?
それとも変数宣言のコンマのようにただ区切るだけでこれは大丈夫ですか?
0425デフォルトの名無しさん
NGNGそれじゃ書式的にnew と対になってないでしょ>>424
君の new に対応する書き方はこうだ。
delete p, delete p2;
単なるカンマ演算子。
0426デフォルトの名無しさん
NGNGコンマ演算子だからp2しか開放してませんね。
逝って来ます(TT)
0427426
NGNGdelete p,p2;
はpだけ開放か・・・鬱だ死のう
0428デフォルトの名無しさん
NGNG0429デフォルトの名無しさん
NGNG演算子の優先順位を勉強しなおせ。
0430デフォルトの名無しさん
NGNGどっちだっていいだろ。そんなこと覚えてたってしょうがない。
どうせそんなアフォな記述はしないんだから。
0431デフォルトの名無しさん
NGNGdelete p, p = 0;
とか書いたりするよ…
0432むーん
NGNGint main()
{
int i=4;
printf("result%d\n", (i, i=0) );
return 0;
}
---
result:0
0433デフォルトの名無しさん
NGNG悪いことは言わん、auto_ptr の reset() メソッドを使え。
0434デフォルトの名無しさん
NGNG0435デフォルトの名無しさん
NGNG配列のような順序付けられたデータ構造で、要素数 + 1 (最後の有効な要素の次)
を指す値。
たとえば int n[10] なら &n[10] が past-the-end 値だし vector<int> v(10) なら
v.end() が past-the-end 値。
0436デフォルトの名無しさん
NGNGhttp://www.cplusplus.com/ref/iostream/istream/getline.html
って、行長がs以上ある時はどう動作するのが正しいのですか?
手元の g++(libstdc++ v3) だと、p に "" が入り、ストリームの現在位置は
進まず、直後に gcount() を呼ぶと0 が返り、その後で再び getline() を、
s の値を増やして呼んでも "" が戻り続けるという不可解な動作をするんですが。
0437デフォルトの名無しさん
NGNGis.clear() の呼び忘れでした。
0439デフォルトの名無しさん
NGNGclass A {
class B {
int *ptr;
public:
B(int *p) : ptr(p) {}
int& bar() { return ptr[1]; }
int bar() const { return ptr[1]; }
} ;
int x[3];
public:
A() { x[0] = 7; x[1] = 8; x[2] = 9; }
B foo() { return B(x); }
B foo() const { return B(x); }
} ;
void hoge(const int v) { printf("%d\n", v); }
void fuga(const A& a) { hoge(a.foo().bar()); }
int main() {
A a;
fuga(a);
return 0;
}
このソースを g++ 2.95.2 でコンパイルすると
>test2.cc:15: passing `const int *' as argument 1 of `A::B::B(int *)'
>discards qualifiers
とエラーが出ます. この場合どういう風にコードを書きなおすのが,
いいのでしょうか ? ちなみに, class B のコンストラクタ, メンバ ptr の
const 版を追加したバージョンも試したのですが, bar() だけ const じゃない
ものが呼び出されてしうので, うまくいきませんでした.
そういうものなのでしょうか ?
0440デフォルトの名無しさん
NGNGreturn ptr[1];
という無茶苦茶なアクセスが本当に意図したものであるのなら、
クラス設計が根本的におかしい。「コードを書き直す」でどうにかなる
レベルじゃない。設計から見直すべし。
0441デフォルトの名無しさん
NGNGclass B {
const int *ptr;
public:
B(int *p) : ptr(p) {}
B(const int *p) : ptr(p) {}
int& bar() { return const_cast<int*>(ptr)[1]; }
int bar() const { return ptr[1]; }
} ;
:
:
0442デフォルトの名無しさん
NGNG要するにconstをよく分かってないタコが書いたクラスに
constなオブジェクトを見せようとしコンパイラにはじかれたってだけだろ。
class A {
class B {
int x_[3];
public:
B(const int *p) { std::copy(p, p+3, x_); }
int GetSecond() const { return x_[1]; }
} b_;
static int initial_b_[];
public:
A() : b_(initial_b_) {};
friend fuga(const A & a) { return a.b_.GetSecond(); }
};
int A::initial_b[] = { 7, 8, 9 };
int main() {
A a;
fuga(a);
return 0;
};
アホ草
0443439
NGNGコンパイルエラーは 441 の方法で解決できることを確認しました.
0444デフォルトの名無しさん
NGNG0445デフォルトの名無しさん
NGNG違法だよ。つーか、それを聞くってことは、More Effective C++ か
Exceptional C++ あたりを読んだんじゃないの?
デストラクタは、だまってthrow()指定。
0446444
NGNG2冊とも手元にあるので読みます。ありがとう。
0447デフォルトの名無しさん
NGNGどないするっちゅうねん。
func(){
ThrowOnDestructObj obj;
throw "some exception"
}
0448444
NGNG~Foo::Foo(){
if(!std::uncaught_exception()) {
throw .....;
}
}
とか?いやまぁ、throw()指定にしときますけど。
0449デフォルトの名無しさん
NGNG0450デフォルトの名無しさん
NGNGどうでもいいけどFoo::~Fooな。
0451デフォルトの名無しさん
NGNGsingleton を作ろうと思っています。
GoF には Singleton::Instance() で 静的メンバが NULL かどうかチェックする
と書いてあるのですが、実装ファイル内の静的メンバ初期化で new Singleton()
するのは、別の Singleton との初期化の順序を指定できない以外に問題は
ないですか?
あと、 Singleton の初期化中に、その Singleton を必要とするオブジェクトを作成する必要があるので Singleton のコンストラクタの一番初めに
インスタンスを格納する静的メンバ変数を this にする事は問題ないでしょうか?
よろしくお願いいたします。
0452デフォルトの名無しさん
NGNG逆じゃないか?
ふつうはsingletonを必要とするクラスが必要になった時点でsingletonを作成する。
0453きしべしろーと
NGNG自己破産したやつが再度、自己破産しようとしているようなもんやね
0454451
NGNGいえ、逆じゃないんです。
あるクラスのコンストラクタで、対象 singleton にそのインスタンスを登録
するのですが、singleton の初期化中に、番兵要素として、その管理されるクラスのインスタンスを生成しているのです。
つまり
1.管理されるクラスのインスタンスをはじめに作成しようとする。
2.管理されるクラスのコンストラクタが Singleton::Instance() を呼び出す
3.Singleton コンストラクタが 管理されるクラスのインスタンスを(番兵要素として)生成する
4.番兵要素インスタンスが Singleton::Instance() を呼び出す
という流れで、4の時に Singleton::Instance() が Singleton::Singleton を
呼び出すと
「時の流れに身をまかせぇ〜♪」という感じでスタックオーバーフローか、
new が失敗するまで無限地獄…じゃなくて無限ループです。
そこで Singleton::Singleton() のはじめの仕事として静的メンバ変数 instance に this を代入すると、
(とりあえず) うまくいっているように見えるのですが…。
すごく心配です。
0455デフォルトの名無しさん
NGNGクラスのデザインとして、ここが一番問題アリっぽいね。
『Null Objectパターン』つって、「オブジェクトが存在して、
普通に振る舞っているように見せかけつつ、実は何もしてない」
というクラス設計手法があるんよ。
http://www.hyuki.com/dp/dpinfo.html#NullObject
Null Objectを、番兵要素インスタンスとして生成すれば
いいんじゃないかな?
0456455
NGNGNull Objectを番兵要素インスタンスとして生成することで、
番兵がSingleton::Instance() を呼び出すことがないようにすれば
いいんじゃないかってこと。
0457moge
NGNGデカくて1000ページもあってビビタヨ!
0458デフォルトの名無しさん
NGNGこんなにスリムなコードになるなんて…… (;´Д`)ハァハァ
……うっ。
0459デフォルトの名無しさん
NGNG0460デフォルトの名無しさん
NGNG0461458
NGNG例外安全は守るべき項目として納得できるけど、例外中立って守る価値あるの?
全部の例外を呼び出し側に伝えるのって、そんなに大事?
例外中立について詳しい解説キボン。
ヽ(。´Д⊂)゜。ウワァァァン!!! 『例外中立』ってGoogleでも3件しか出てこないよ〜。
0462デフォルトの名無しさん
NGNG実は怖くて例外使えませんでスタ。
こういうひと、他にいる?
0463デフォルトの名無しさん
NGNGその例外を正しく、呼び出し側に伝える必要がある。
ってだけだけど。
かってに途中のクラスで例外が消えたり
例外の種類が変わったりしたら、困ると思うんだがなあ。
管理しきれんよ。
0464デフォルトの名有さん
NGNG0465451
NGNGやはりそうですかぁ。絶対に登録されていないオブジェクトを作りたくないので
番兵も対象クラスを継承したクラスにしたのですが、Java のインターフェイス
みたいなベースクラスを作るしかないですかねぇ…。
あぁ、C++ 難しいです。いま operator= まわりで悩んでいます。
サブクラスで operator= をオーバーライドする時の戻り値は
ベースクラスの型で問題ないのでしょうか?(というかそうしないとコンパイルエラーなのですけど)
あと、ポインタを通してオブジェクトを扱う事が多いのですが、
ちがうサブクラスどうしを代入した場合で左辺値が右辺値を許容できない型だったり
する事を考えると operator= はベースクラスで private 宣言して使わせないようにしてしまおうかと
思うのですが、継承を前提にして、フリーストアにオブジェクトを確保するような
使い方をしていて operator= を適切に使いこなす事なんて本当に可能なのでしょうか?
0466デフォルトの名無しさん
NGNG0467458
NGNGオレもだよ〜。Exceptional C++ と More Effective C++ の例外に関する
項目を熟読して、ようやく例外を扱えそうな気になってきたから、
昨日から例外を使いはじめたよ。
>>463
あ、それが「例外中立」の正しい定義?
すまん、オレ激しく勘違いしてたよ。
Exceptional C++ の28ページには、「すべての例外を呼び出し側に伝える」
って説明してあったから、てっきりcatchした例外はぜんぶ再throwするんかと
思ってた。
Exceptional C++ に書いてあったのは、コンテナテンプレートクラスで、
どの例外もこのテンプレートクラスじゃ正しく処理できないから、「すべての
例外を呼び出し側に伝える」ってことになるわけか。なるほど。
0468デフォルトの名無しさん
NGNG俺そう。
だから敢えて例外には一切触れないコードしか書いてない。
厨房でスマヌ
0469デフォルトの名無しさん
NGNGexceptional C++の記述はコンテナクラスに特化してるからね。
コンテナが一番難しいからなんだろうけど.。。
職場においといたら、「クイズ形式?」とかいわれて鼻で笑われ申した。
ウワーン馬鹿にしるなー。
0470デフォルトの名無しさん
NGNGんだよって書いたんだけど、具体的に何が?って聞かれても、すぐにはでてこなかったんだよね。
あのころの疑問は氷解した。
0471デフォルトの名無しさん
NGNGsizeof(!0.0)==4になります。
また、
void f(int i){}
void f(bool b){}
で
f(!0.0);
だとintの方が呼ばれます。
なぜですか?
0472デフォルトの名無しさん
NGNG0473デフォルトの名無しさん
NGNG ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄
ズザーーーーッ
∩) (´´ (´⌒(´
∧∧ノ つ ズザーーーーーッ(´⌒(´
⊂(゚Д゚⊂ ノ ∧∧≡≡)ズザーーッ(´⌒;;;≡≡
∧∧(゚Д゚⊂⌒`つ∧∧≡(´⌒;;;≡≡≡
∩) ⊂(゚Д゚⊂⌒`つ≡⊂(゚Д゚⊂⌒∧∧≡≡)(´⌒;;;≡≡
∧∧ノ つ ズザーーーーッ∧∧(´⌒(´ ⊂(゚Д゚⊂⌒`つ≡(´´ (´⌒(´
⊂(゚Д゚⊂ ノ ∧∧≡≡)⊂(゚Д゚⊂⌒`つズザーーッ(´⌒;;;≡≡
∧∧(゚Д゚⊂⌒`つ∧∧≡(´⌒;;;≡≡≡
⊂(゚Д゚⊂⌒`つ≡⊂(゚Д゚⊂⌒`つ≡(´⌒;;;≡≡≡
 ̄(´⌒(⌒;;∩) (´´ ∧∧(´⌒)ズザーーーーッ
∧∧ノ つ ⊂(゚Д゚⊂⌒`つズザーーーーーッ(´⌒(´
⊂(゚Д゚⊂ ノ ∧∧≡≡)ズザーーッ(´⌒;;;≡≡
∧∧(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
 ̄ ̄ (´⌒(´⌒;;
0474デフォルトの名無しさん
NGNG0475デフォルトの名無しさん
NGNGC の頃から使われてますが、何か?
(使った事ない奴もいないだろうけど)
0476デフォルトの名無しさん
NGNG試したところ、BCC 5.5.1 と gcc 2.95.3-6 (mingw special) では f(bool) が呼ばれます。
…でも double に ! は使いたくないな…
0477471
NGNG試していただいてありがとうです。
>…でも double に ! は使いたくないな…
ただのネタですので。
0478デフォルトの名無しさん
NGNGあるクラスのコンストラクタの演算子()←コレをオーバライドする方法は
ないでしょうか?
具体的には、
class A{};
main(){
A a=10;
return 0;
}
とやりたいのですが。
0479デフォルトの名無しさん
NGNG0480デフォルトの名無しさん
NGNG()だからてっきり演算子かと・・・
0481デフォルトの名無しさん
NGNG0482デフォルトの名無しさん
NGNG0483デフォルトの名無しさん
NGNGオーバーライドとオーバーロードの違いもわかってないし、
代入演算子とコピーコンストラクタのこともわかってないんじゃない?
もう少し、用語に対する理解を深めてから、正しく質問してくれよ。
0484デフォルトの名無しさん
NGNGclass A{.....};
main(){
A a();
A b=a;
return 0;
}
ですよね。
そうではなく、
main(){
A a=100;
};
とやりたいのです。
房な質問でごめんなさい。
0485デフォルトの名無しさん
NGNG{
int val;
A(int i) : val(i){}
};
int main()
{
A a = 10;
}
0486478
NGNGをを、そんなやり方が・・・
有難うございます。おかげさまでなんとか窮状を脱しました。
ご恩は忘れません〜〜。
0487デフォルトの名無しさん
NGNG0488デフォルトの名無しさん
NGNG(DLLを使わずに)
おられましたら、方法またはページなどを教えてください。
0489デフォルトの名無しさん
NGNGttp://member.nifty.ne.jp/yamazaki/
0490デフォルトの名無しさん
NGNGnifのflabo
http://www.gzip.org/
0491デフォルトの名無しさん
NGNG0492デフォルトの名無しさん
NGNG具体的なコードを出せ
0493デフォルトの名無しさん
NGNGクラスメンバーのテンプレート関数の
関数ポインタを取得するのってどうやるんでしょうか?
class a
{
public:
template<typename T> T* func(T* p){return p;}
};
void* (a::*pfunc)(void*) = a::func<void>;
これだと「内部コンパイラ エラー」ってのになっちゃいました
0494デフォルトの名無しさん
NGNGclass a{
public:
template<typename T>
T* func(T* p){
return p;
}
};
main(){
void* (a::*pfunc)(void*)=&a::func<void>;
}
これで取れたが。
0495デフォルトの名無しさん
NGNG0496デフォルトの名無しさん
NGNG中身の演算子を反対に変更しないですむ方法はないでしょうか?
0497493
NGNG>495
レスありがと
コンパイラで分岐させてから
MSCのときだけほかのメンバー関数経由で
呼び出すことにしますね
(う、、、呼び出せない・・・・・
明示的に型を指定できないのかな?)
0498デフォルトの名無しさん
NGNGnot2( less<T> ) とかなんとかで順序づけ?
0499デフォルトの名無しさん
NGNGint d[] = { 5, 3, 1, 4, 2 };
priority_queue<int, vector<int>, greater<int> > pq(d, d+sizeof(d)/sizeof(int));
while (!pq.empty()) {
cout << pq.top() << endl;
pq.pop();
}
こんな感じ?
0500496
NGNGよ、よくわかりませんでした。
>>499
うまく逝きました。std::less と std::greater ってのがあるのですね。
C++ は色々覚えることが多いです。
(今も提示してもらったサンプルのコンパイル中に >> でエラーになってびっくりしました)
みなさんありがとうございました。
0501デフォルトの名無しさん
NGNG0502499
NGNG> not2( less<T> ) とかなんとかで順序づけ?
not2()はオブジェクトを取るんじゃなかったっけ?
less<T>は型だよね。文法的におかしいと思う。
あと仮にオブジェクトの形にしてnot2(less<T>())としても、
operator<()の代わりにoperator>()を使いたいって話だと思うから、
operator>=()じゃまずいよね。たぶん。
priority_queueの場合はあまり副作用なさそうだけど。
オブジェクトの形でソート順が指定できるかどうかはわかんないや。
0503デフォルトの名無しさん
NGNGstruct {
int type;
void* ptr;
};
というような配列を作って、typeの値によって
type=0の場合はデータ、1の場合は関数Aへのポインタ
2の場合は関数Bへのポインタ・・・というように
ptrのキャスト方法を変えたいのですが
どう記述すればできるのでしょうか?(そもそも出来ますかね??)
厨質問で申し訳ないですが、よろしくお願いします。
0504503:訂正
NGNGstruct {
int type;
void* ptr;
};
というような配列を作って、typeの値によって
【正】
struct {
int type;
void* ptr;
} ptrList[]={
{0,pData1},
{1,pFuncA},
{2,pFuncB}};
というような配列を作って、typeの値によって
0505デフォルトの名無しさん
NGNGそういう時こそ、滅多に使われないunion様の出番ではなかろうか。
0506デフォルトの名無しさん
NGNGstruct DamnIt {
int type;
void *p;
};
int n = 1;
struct C { int num; C(int n) : num(n) { } } c(2);
void foo() { cout << "3" << endl;}
void bar(int n) { cout << n << endl;}
DamnIt di[] = {
{ 1, &n },
{ 2, &c },
{ 3, foo },
{ 4, bar },
};
int main()
{
for (int i=0; i<sizeof(di)/sizeof(DamnIt); i++) {
switch (di[i].type) {
case 0:
break;
case 1:
cout << *(int*)(di[i].p) << endl;
break;
case 2:
cout << ((C*)(di[i].p))->num << endl;
break;
case 3:
((void (*)())(di[i].p))();
break;
case 4:
((void (*)(int))(di[i].p))(4);
break;
}
}
}
こういうこと?
0507デフォルトの名無しさん
NGNGC++ ならテンプレートを使うのはどう?
0508C屋
NGNGvoid *ptr
って宣言してるんだから、使うときにtypeの値を見て、それで
その場でキャストするしかないんじゃねーの?
てか、それをどういう風に使うのかを書いたほうがいいと思うぞ。
0509506
NGNGstruct Base {
virtual void operator()() { }
};
struct A : Base {
const int num;
A() : num(1) { }
};
struct B : Base {
int num;
B(int n) : num(n) { }
};
struct C : Base {
void operator()() { cout << 3 << endl; }
};
struct D : Base {
int num;
D(int n) : num(n) { }
void operator()() { cout << num << endl; }
};
int main()
{
Base* d[] = { &A(), &B(2), &C(), &D(4) };
for (int i=0; i<sizeof(d)/sizeof(Base*); i++) {
if (dynamic_cast<A*>(d[i]) != NULL)
cout << (dynamic_cast<A*>(d[i]))->num << endl;
if (dynamic_cast<B*>(d[i]) != NULL)
cout << (dynamic_cast<B*>(d[i]))->num << endl;
if (dynamic_cast<C*>(d[i]) != NULL)
(*(dynamic_cast<C*>(d[i])))();
if (dynamic_cast<D*>(d[i]) != NULL)
(*(dynamic_cast<D*>(d[i])))();
}
}
だからどうと言われるとちょっと困る。
>>507
テンプレートは型覚えるから、ちょっと細工しないとだめかも。
0510506
NGNGまあもともと意味なんぞ無いと言われればそれまでだけど。
0511デフォルトの名無しさん
NGNGC++なら仮想関数にして呼び出すだけでいいんじゃないの?
int typeが型情報に内包(?)されることになるし。
0512511
NGNGint main(){
Base* d[]={&A(),&B(2),&C(),&D(4)};
for (int i=0;i<sizeof(d)/sizeof(Base*);i++){
d[i]->operator()();
}
}
みたいに。
0513506
NGNG> C++なら仮想関数にして呼び出すだけでいいんじゃないの?
> int typeが型情報に内包(?)されることになるし。
うん。そうなんだけどね(^^;;
もう一度チャンスをくれ!
struct Data {
Data() { }
virtual Data* func() { return this; }
};
struct FuncA : public Data {
FuncA() : Data() { }
Data* func() { cout << "FuncA" << endl; return NULL; }
};
struct FuncB : public Data {
FuncB() : Data() { }
Data* func() { cout << "FuncB" << endl; return NULL; }
};
int main()
{
Data* d[] = { &Data(), &FuncA(), &FuncB() };
for (int i=0; i<sizeof(d)/sizeof(Data*); i++) {
Data *dat;
if ((dat = d[i]->func()) != NULL) {
// データだったときの処理
}
}
}
あとはfunc()を適当に変えたり。
0514デフォルトの名無しさん
NGNGクラス内で
friend ostream& operator<< (ostream& out, const Int& rhs);
と宣言していて、
ostream& operator<< (ostream& out, const Int& rhs)
{
out << rhs.m_Value;
return out;
}
と実装しているのですが m_Value <- こいつがプライベイト変数なのですが、
プライベートだと怒られます。
なぜか operator<< ではなくて、通常の関数にすると大丈夫なのです。
何故演算子だとコンパイルエラーになるのでしょうか?
VC6 を使っています。よろしくお願いします。
0515C++初心者
NGNGC++でnewされたインスタンスが自分自身をdeleteすることは
可能でしょうか。それをすることは問題ないでしょうか?
よろしくお願いします。
0516514
NGNG私もそれ考えた事あるんですが、多分可能な気がします。
delete することでメンバ関数がメモリから消え去るわけではないですから。
でも、 new[] で確保されていた場合とか、auto 変数だった場合とか
色々ありそうなので、結局怖くて、自分自身で delete するのはやめました。
0517514
NGNGSP3 で直ってるって、そういえばこの間 OS 入れなおした後, VS に SP 当ててなかったです。
鬱だ…。
0518C++初心者
NGNGご回答ありがとうございます〜m(__)m
>でも、 new[] で確保されていた場合とか、auto 変数だった場合とか
はい。スタック上に積まれていると困ります…。スコープが管理してますから…。
インスタンスの生成と解放って所有者がいないようなクラス構造では
誰がやって良いのかわからないので難しいです。
こういう方針(自分の消滅は自分で管理する)はたして正しいのか…。
0519デフォルトの名無しさん
NGNGdelete this;
は常套句。判って使う分には問題ないぞ。
0521デフォルトの名無しさん
NGNG普通にやろうとすると、代入演算子って事になるんですが、既に戻り値が自分の型になってしまっているので、オーバーロードできません。
以下のようなのをコンパイルできるようにしたいのです
MyClass m;
m.lowByte(100);
m.highByte(20);
// この行の代入が OK になるようにしたい
int a = m;
lowByte(), highByte() は例え話なので、実際にそういう事をしたいのではなくて、
別の型への代入をしたいのです。
よろしくお願いします。
0522デフォルトの名無しさん
NGNG0523デフォルトの名無しさん
NGNGint a = m;
で呼ばれるのは代入演算子じゃないぞ
0524521
NGNGありがとうございます。できました〜!
文法レベルはマスターしたつもりでしたが、まだまだ知らない書法が…。
ちょっと鬱でげす。
>>523
ですね(.asm)
これじゃ初期化ですもんね。
ということは int のコピーコンストラクタが呼ばれるのですか?
キャストを定義したという事は MyClass が int に変換されて、
もし int がクラス型なら int( const int&) みたいなコピーコンストラクタが
呼ばれるのでしょうか?違うかな…?ちょっと自信ないです。
深いなぁ。
0525デフォルトの名無しさん
NGNGコンストラクタをprotectedにして、専用の関数でのみ生成できるようにすれば、とりあえずauto変数には出来なくなるぞ。
0526デフォルトの名無しさん
NGNG0527デフォルトの名無しさん
NGNGpublic:template<class U>class INA{public:U val;INA(U u):val(u){};U REF(void){return val;};};
INA<C> ina;
ST(C c):ina(c){};
C Ref(void){return ina.REF();};
};
0528デフォルトの名無しさん
NGNG教えて君で申し分けないが、何をやってるの?それ。
0529デフォルトの名無しさん
NGNGインデントめちゃくちゃで読みにくい上に
無駄なセミコロンが4つあるな。
空文ということで見逃してくれるけど。
読んでみると・・コンストラクタで与えた値を非const関数 Ref()で返すだけのテンプレートクラスか。
なんだこりゃ。
0530デフォルトの名無しさん
NGNGに
読
め
0531デフォルトの名無しさん
NGNG何が縦書きになってる?
0532デフォルトの名無しさん
NGNGっ
て
み
た
だ
け
0533デフォルトの名無しさん
NGNGん
か
ワ
ラ
タ
0534デフォルトの名無しさん
NGNG実行中に ランタイムエラー:純粋仮想関数の呼び出し みたいなメッセージ(本当は英語)が出て止まってしまいました。
そんな事言われても…。という感じで今ソースを追っているのですが
まだ原因が掴めていません。
純粋仮想関数が呼び出される可能性について考えてみたのですが、
スライシングが起こった時はそういう可能性があるような気がするのですが、
やはりそういう事ってあるのでしょうか?
あと、他の可能性が考えつかないのですが、他にはどういったときに
そういう事が起こりますか?
0536デフォルトの名無しさん
NGNG> 実行中に ランタイムエラー:純粋仮想関数の呼び出し みたいなメッセージ(本当は英語)が出て止まってしまいました。
この部分がとても大事だと思うんだけど、きみはどう思う?
まずはそこからだ!と思ったけど、試してみたよ。
struct A {
virtual void foo() = 0;
virtual ~A() { }
};
struct B : public A {
void foo() { }
};
int main()
{
A* a;
a = &B();
a->foo();
}
これ実行したらどうなる?うちのbcc32では問題なく動くけど、
g++では実行時エラーでcore吐く。
> pure virtual method called
> Aborted (core dumped)
ちなみに
> $ g++ --version
> 2.95.3-5
仮想デストラクタ取っ払ったり、&B()をnew B()に変えるとちゃんと動く。
なぜかはわかんないけど、この辺から攻めてみたらどうだろう。
0537デフォルトの名無しさん
NGNGvtblの初期化はコンストラクタが終わった後じゃないっけ?
0538デフォルトの名無しさん
NGNG> vtblの初期化はコンストラクタが終わった後じゃないっけ?
そう書くと、微妙に語弊があるな。
class Base {};
class Deriv : public Base {};
この場合 Deriv クラスのインスタンスを作ると
1. メモリ領域が確保される
2. Base クラスに関する初期化(vtbl の初期化など)が行われる
3. Base クラスのコンストラクタが呼ばれる
4. Deriv クラスに関する初期化(vtbl の初期化など)が行われる
5. Deriv クラスのコンストラクタが呼ばれる
という順番になる。だから、基底クラスのコンストラクタから(純粋)仮想関数を
呼び出すと、基底クラスで定義されたメソッドが呼び出される。
0539デフォルトの名無しさん
NGNGvtblの中身が空なんだよね。
0540デフォルトの名無しさん
NGNGstrstreamの場合だと//////////////////
using namespace std;
char buf[10];
strstream str_stream(buf, 10, ios::out);
str_stream << 10 << ends;
ってやるとbufの中がかわるのに
stringstreamの場合///////////////////
using namespace std;
string s;
stringstream string_stream(s,ios::out);
string_stream << 10;
//////////////////////////////////////////
ってやってもsの中がかわらないんだけど。
これってどうしようもない?
string_stream.str()で持ってくるしかないのかな。
0541デフォルトの名無しさん
NGNGclass A a;
class B b;
a = b;
b = a;
下のように定義するとコンパイルが通りません。
class A
{
public:
operator B ()
{
return B(A)
}
}
class B
{
public:
operator A ()
{
return A(B)
}
}
なにか良い方法はないでしょうか。
0542デフォルトの名無しさん
NGNG0543デフォルトの名無しさん
NGNG先行宣言をやってない…ってオチじゃないよな?
0544デフォルトの名無しさん
NGNG先行宣言って何ですか?
先頭にclass B;と宣言することはやっていますが、
インラインにすることが前提ですので、それでは駄目なんです。
0545541
NGNG{
public:
#ifdef B
operator B ()
{
return B(A)
}
#endif
}
class B
{
public:
#ifdef A
operator A ()
{
return A(B)
}
#endif
}
とすることで一応解決できたのですが、
A classとB classが同じヘッダファイル内にないとうまくいきません。
もっとエレガントな解決方法はないでしょうか。
0546デフォルトの名無しさん
NGNGclass B;
class A {
operator B();
};
//------ B.h -------
class A;
class B {
operator A();
};
//------ AandB.h -------
#include "A.h"
#include "B.h"
inline A::operator B() { return ***; }
inline B::operator A() { return ***; }
つーか。
いまいち想像つかんがどうしてもinlineにしなけりゃならんような
相互依存してるなら、class A と B は同じヘッダに入るべきだろう。
0547デフォルトの名無しさん
NGNGはっきりと一言で言うと、>>541のクラス設計が根本的におかしい。
class Aとclass Bが変換演算子で相互に変換可能なほど密な関係なら、
その二つは同じヘッダで提供すべきだ。
逆に、「別のヘッダで提供しなければエレガントではない」と設計者自身が
感じるということは、それは、その二つのクラスが実は疎な関係にある
ということ。
設計を最初からやり直したほうがいいんじゃないのか? 二つのクラスを
密な関係にしたいのか、疎な関係にしたいのか、はっきりさせたほうがいい。
参考資料として、ム板の推薦図書 Exceptional C++ の第5章を挙げておく。
0548デフォルトの名無しさん
NGNGpublic:void func(void){....}
};
main(){
A* pa=new A;
delete pa;
pa->func();
return 0;
}
これが動くのが理解出来ない。deleteした時点paは消滅するはずでは?
0549デフォルトの名無しさん
NGNG消滅はしたけど、跡地に前の情報が残ってるから
たまたま動いてるように見えるってだけ。
deleteしたものにアクセスしちゃ遺憾。
{
{
int n = 3;
}
{
int n;
cout << n << endl; // n=3かもしれない
}
}
0550デフォルトの名無しさん
NGNGなるほど、理解できました。サンクスです。
0551デフォルトの名無しさん
NGNGを入れたいのですがうまくいきません.
この場合もクラスのアドレスが必要なのでしょうか
よろしくお願いします.
0552デフォルトの名無しさん
NGNGコードみせてみ
0553551
NGNGcのコードをクラスに書き換えていたのですが
cのときは関数のポインタ与えるのに&演算子いらなかったのですが
c++になるとクラス名と&演算子をつけないといけないんですね
なんとかなりそうです
勉強不足でした.すいません.
0554デフォルトの名無しさん
NGNGC++になると、でなくて、メンバ関数だと、だな。どっちかと言うと。
0555デフォルトの名無しさん
NGNGstrcpyとかprintfとか あんまり気にせず使えますが
C++ だと標準ライブラリというのはあるんでしょうか?
0556デフォルトの名無しさん
NGNG沢山ある。標準入出力ならiostream。
つーか、stdio.h、stdlib.hもC++の標準ライブラリだよ。
#include <cstdio>
#include <cstdlib>
という具合に使う。
0557デフォルトの名無しさん
NGNGああ、ありがとうございます。
ではBCBをダウンロードしてきます。
0558デフォルトの名無しさん
NGNGsockfd = ::socket(AF_INET, SOCK_STREAM, 0);
なんて処理のところで
implicit declaration of function
というエラーが出ます。
同じようにbindやlistenにも出てしまします。
g++2.95.4を使っているのですが、何かコンパイルオプションが
必要なら教えて下さい。お願いします。
0559デフォルトの名無しさん
NGNG#include するヘッダをあなたの環境で確認して頂戴
いわゆるunixなら man socket で出てくるはず
あとスレ違い
0560デフォルトの名無しさん
NGNGどもありがとうございます。
0561デフォルトの名無しさん
NGNGその::をやめてusing namespace std;をインクルード宣言文の
後ぐらいに書いたら動くかも。
#include <hogehoge>
using namespace std;
int main (...)
{
:
というように。試してないんで動かなかったらスマソ
0562デフォルトの名無しさん
NGNGSTL以外なら http://www.cplusplus.com/ref/ がみやすいと思われ。
いま落ちてるようだが…。
0563デフォルトの名無しさん
NGNG0564デフォルトの名無しさん
NGNG関係ないです。
socket関係はstd名前空間に入っていませんから。559が正解。
0565デフォルトの名無しさん
NGNG0567デフォルトの名無しさん
NGNG#include <sys/socket.h>
#include <netinet/in.h>
なんかを入れて上手くいきました。
sysのところがlinuxとなってたのが間違ってました。
どうも済みません。
ちなみにC++の本にはC用のヘッダーファイルは
<stdio.h>を<cstdio>と書くようにって書いてあったのですが、
これだとコンパイラを通せないヘッダーファイルもあるみたいですね。
例えば<cunistd>とか。規則とかあるんでしょうか?
gccの話になって申し訳ないのですが、よろしくお願いします。
0568デフォルトの名無しさん
NGNGC++標準じゃないなら
#include <chogehoge>
と書くのはいただけないな…
0569デフォルトの名無しさん
NGNGCの標準のヘッダーだけ
0570デフォルトの名無しさん
NGNGありがとうございます。
もう一つだけお願いします。
Javaのようにクラスにスレッドを割り当てたいのですが、
staticなメンバ関数を用意してそこで自身のオブジェクトを作成するって
やりかたはC++的に正しいやり方なのでしょうか?
0571Alexandrescuマニア
NGNG0572デフォルトの名無しさん
NGNG0573デフォルトの名無しさん
NGNG俺はCじゃなくてC++から始めてるよ。
最近かなりつまづいてるけどね。「はじめてのC++」とかいう本がよかった。
0574デフォルトの名無しさん
NGNG実装しないといけないようなものはどうやって宣言したらいいんでしょうか?
0575デフォルトの名無しさん
NGNGヴァーチャルなんとか
0576デフォルトの名無しさん
NGNG0577デフォルトの名無しさん
NGNGこれが一つでもあるとJavaのabstractclass。全てならinterface。
継承した子クラスを実体化しないとエラーは出ないから注意。
0578デフォルトの名無しさん
NGNGhttp://isweb19.infoseek.co.jp/diary/kurihira/cgi-bin/img-box/img20020323050515.jpg
つまらないものですが、どぞ
0579デフォルトの名無しさん
NGNGここにエロ画像貼るなヴォケ(ワラ
0580デフォルトの名無しさん
NGNGこれ実行したらhogeのデストラクタ呼ばれないんだ。
デストラクタ呼ばれるようにするにはどうするの?
class hoge
{
private:
int *p;
public:
hoge() throw(exception) {
p = new int;
throw exception();
}
~hoge() {
delete p;
}
};
////////////////////////////////
int main(int argc, char* argv[])
{
try
{
hoge h;
}
catch(exception &e)
{
cout << e.what() << endl;
}
}
あーというか、ききたいことは
コンストラクタで例外を起こしても、デストラクタ呼ばれるようにするにはどうすんの?
0581デフォルトの名無しさん
NGNGそのお礼の仕方にワラタ
0582デフォルトの名無しさん
NGNGコンストラクタで例外が発生したと言うことは、
オブジェクトが作成が完了してないと言うことだから、
有効なオブジェクトではないのでデストラクタは呼ばれない。
0583デフォルトの名無しさん
NGNGデストラクタが呼ばれないのはC++の仕様だから覆せない。
メモリリークが起きなければいいんだろう?
int *p;
を
auto_ptr<int> p;
にすれば解決。
あとは Exceptional C++ でも読んで勉強しなはれ。
0585デフォルトの名無しさん
NGNG0586デフォルトの名無しさん
NGNGaaa();
}
これを生成するとき、
aaa bbb;
と、
aaa bbb();
てどう違うの?
0587デフォルトの名無しさん
NGNG後者はコンパイルできませんが何か?
0588デフォルトの名無しさん
NGNG書いて動かしてみれば分かる。
0589デフォルトの名無しさん
NGNGaaa bbb(); // bbbという名の引数をとらないaaaを返す関数の宣言。
0590586
NGNGそうなんですか。bbb()の実装部分の
aaa bbb(){
...
}
の記述は必要ないんですか?
0591デフォルトの名無しさん
NGNG「宣言」と「定義」の違いを勉強してから戻って来るよーに。
0592デフォルトの名無しさん
NGNG宣言と定義は区別しようZE!
0593586
NGNGは宣言なんで、定義である
aaa bbb(){
...
}
は別に書くってことですよね?初歩的でスイマセン。
0594デフォルトの名無しさん
NGNGで、Input には Input::Null っていう何もしない実装が用意されてます。
こんなかんじで、
struct Input
{
int Interface() = 0;
struct Null;
};
struct Input::Null : public Input
{
int Interface() { return 0; }
};
ほんでそのインターフェースでなんか仕事する関数があるわけですよ、
int DoSomething( Output& out , Input& in = Input::Null() );
そしたらそのデフォルト引数のところで gcc におこられたんで、
調べたら一時オブジェクトは右辺値だから非const参照には渡せないそうで。
ちょっと考えて、思いつきで関数もう一個並べて、
inline int DoSomething( Output& out )
{
Input::Null dummy;
DoSomething( out , dummy );
}
ってしたんです。そしたら gcc も通してくれたんで素通りしかけたんですけど、
元の奴と書き直した奴って、本質的には何も違わないような気がするんですよ。
なんか見落としてますかね?
ちなみに、元の奴をVC++6に食わしたら何にも言われませんでした。
0595デフォルトの名無しさん
NGNGnamespaceを認識してないだけだろ
0596デフォルトの名無しさん
NGNGstd::auto_ptr<int> a;
a = std::auto_ptr<int>(new int);
memory.stlファイルには、
auto_ptr<X>& operator= (auto_ptr<X>& rhs) _RWSTD_THROW_SPEC_NULL
{
reset(rhs.release());
return *this;
}
とあるので、オペレータ自体は定義されているようなのですが。
エラー E2285 a.cpp 44: 'std::auto_ptr<int>::operator =(std::auto_ptr<int>)に一致するものが見つからない
です。
他の箇所でも、関数宣言時に仮引数に参照を指定してテンプレートクラスを渡すと
同様のエラーが出て、実体になおしたりしたのですが。
原因がわかる方、おねがいします。
0597デフォルトの名無しさん
NGNGC++Builder6では通るよ。Borland-C++5.5.1のバグじゃないの?
0598594
NGNGinitialization of non-const reference .....
っていうエラーメッセージだったんですけど、 namespace なんすか?
0599デフォルトの名無しさん
NGNGa.reset(new int); とするんじゃないの?
a = std::auto_ptr<int>(new int); は冗長すぎ。
0600デフォルトの名無しさん
NGNG> int DoSomething( Output& out , Input& in = Input::Null() );
こっちのNullは、その場で生成してその場で消滅する、
「テンポラリオブジェクト」もしくは「一時オブジェクト」ってやつ。
> Input::Null dummy;
> DoSomething( out , dummy );
こっちのNullは、dummyという「名前つきオブジェクト」。
どちらも人間の感覚では一時的なオブジェクトとして
違いはなさそうに思えるけど、これがコンパイラにとっては
大きな違いになるらしい。テンポラリオブジェクトの方が
最適化されやすかったりするし。
詳しいことは、 More Effective C++ の項目19,20あたりを読んで
勉強しましょう。
0601デフォルトの名無しさん
NGNGいや、ほんとは
class A{
std::basic_string<TCHAR> s_;
public:
A(std::basic_string<TCHAR>& ref) : s_(ref) { }
};
std::basic_string<TCHAR> str;
A a(str);
だったんだけど、くどいので簡単な例を出しただけです。
で、バグでしたか。それなら納得です。
ありがとうございました。
0602594
NGNGあのー、「コンパイラにとって大きな違いになる」ということですが、
gccがエラーでvcが黙って通してくれるのはやっぱりもしかしてvcバグってるんですかね?
0603デフォルトの名無しさん
NGNG明らかにバグでない限りは、別にそれでもヨイのでは。
ふるい規格のままだったり多少の規格との差は、
おれとしては許容範囲内。
#ifdef程度のコードで回避できるならね。
0604599
NGNGそういう場合の参照引数はconst付けるの常識っす。
A(const std::basic_string<TCHAR>& ref) : s_(ref) {}
0605デフォルトの名無しさん
NGNGそういう問題なのかなと思い、const-referenceにしてみたら、見事解決しちゃいました。
thxです。
じゃ、やっぱりバグではなかったということですか?
0606594
NGNG規格はどっちか定めてないんでしょうか?
まぁとりあえずMoreとか読んで出直してきます。
0607デフォルトの名無しさん
NGNG#include <string>
#define TCHAR char
class A{
std::basic_string<TCHAR> s_;
public:
A(std::basic_string<TCHAR>& ref) : s_(ref) { }
};
std::basic_string<TCHAR> str;
A a(str);
main()
{}
0608デフォルトの名無しさん
NGNG警告レベル上げてみれ
0609デフォルトの名無しさん
NGNGstd::basic_string<TCHAR> s_;
public:
A(DWORD d, std::basic_string<TCHAR>& ref) : s_(ref) { }
};
std::vector<A> v;
v.push_back(A(1, std::basic_string<TCHAR>("str")));
あ、ちょっと違った。上のような感じです。
元のクラスがでかすぎるので、切り分けるのにミスをしてました。
0610デフォルトの名無しさん
NGNG本当ですね。constを付けないとエラーになるけど、結局一時的に生成されるオブジェクト
のリファレンスを取るのは問題があるのでしょう。
プログラミング言語C++第3版のどこかにそういう章があればいいのですが。
0611594
NGNGあ、vcの警告レベル上げたら「非標準の拡張機能」って出る。
つまりは標準ではないと。
でも拡張で通してもいいくらい、たいした理由のないきまりだと、、、
0612デフォルトの名無しさん
NGNG0613デフォルトの名無しさん
NGNGtype data;
ST(type val):data(val){}
ST<type>operator+(const ST<type>& rhs){return data+rhs.data;}
};
main(){
ST<int> const a=10;
ST<int> b=0;
b=a+a;←---------------これをエラーにならずにやる方法はないでしょうか?
return 0;
}
0614推薦図書マンセー
NGNGoperator+ を、非メンバ関数にしましょう。メンバ関数だと、
暗黙の型変換での問題が発生するから推奨されていません。
もしくは、 operator+= をメンバ関数として実装して、
b += a;
b += a;
と書くことを考えましょう。
参考資料
Effective C++ 項目19
More Effective C++ 項目22
Exceptional C++ 項目20
0615デフォルトの名無しさん
NGNG無限再帰が起こり得るんじゃなかったっけ?
0616デフォルトの名無しさん
NGNGそりゃconstなオブジェクトでconstでない面罵関数は
呼べんわな。
0617613
NGNG>>616さま、クリティカルです。
0618デフォルトの名無しさん
NGNGヘッダーファイルを grep してみると、
<stringfwd.h>
#ifdef _GLIBCPP_USE_WCHAR_T
typedef basic_string<wchar_t> wstring;
#endif
<bits/c++config.h>
// Define if code specialized for wchar_t should be used.
/* #undef _GLIBCPP_USE_WCHAR_T */
といった記述が見つかりました。これは、c++config.h で
#define _GLIBCPP_USE_WCHAR_T 1
とかやればよいということなんでしょうか。
0619618
NGNGこれをやってみたけどいろいろ undefined エラーとかが出ますね。
wstring だけなら basic_string<wchar_t> で typedef してやれば
よさそうだけど、typedef basic_ostringstream<wchar_t> wostringstream;
とかを使おうとすると、やっぱりいくつか undefined が出る。うーん。
0620デフォルトの名無しさん
NGNG誰か作っている人いないかな?
ソースみせてほしいんだけど
よろしくお願いします。
0621デフォルトの名無しさん
NGNGまた宿題ですか・・・。
0622デフォルトの名無しさん
NGNG聞く前に、まずググれ。
0623デフォルトの名無しさん
NGNG0624デフォルトの名無しさん
NGNGvector<vector> vec;
こういった書き方は出来ないのでしょうか?
vector<vector<int> >とか何らかの型を指定しないと
やっぱりダメですか?
0625620
NGNGclass CRC16
{
private:
word init;
word poly;
bool refin;
bool refout;
public:
CRC16();
void SetInit( word value );
void SetPoly( word value );
void SetRef( bool in, bool out );
word GetInit();
void Citt( byte data[], UINT size );
void CalcL( byte data[], UINT size );
void CalcR( byte data[], UINT size );
};
CRC16::CRC16() {
init = 0;
poly = 0;
refin = false;
refout = false;
}
0626デフォルトの名無しさん
NGNGinit = 0xFFFF;
poly = 0x1021;
refin = false;
refout = true;
CalcL( data, size );
}
void CRC16::SetInit( word value ) {
init = value;
}
void CRC16::SetPoly( word value ) {
poly = value;
}
void CRC16::SetRef( bool in, bool out ) {
refin = in;
refout = out;
}
word CRC16::GetInit() {
return init;
}
void CRC16::CalcL( byte data[], UINT size ) {
UINT i, j;
if ( refin == true ) init = ~init;
for ( i=0; i<size; i++ ) {
init ^= data[i] << 8;
for ( j=0; j<8; j++)
if (init & 0x8000) init = (init << 1) ^ poly;
else init = init << 1;
}
if ( refout == true ) init = ~init;
}
void CRC16::CalcR( byte data[], UINT size ) {
UINT i, j;
if ( refin == true ) init = ~init;
for ( i=0; i<size; i++ ) {
init ^= data[i];
for ( j=0; j<8; j++)
if (init & 1) init = (init >> 1) ^ poly;
else init = init >> 1;
}
if ( refout == true ) init = ~init;
}
おねがいします。
0627デフォルトの名無しさん
NGNGテンプレートなんだから当然。
0628デフォルトの名無しさん
NGNG0629デフォルトの名無しさん
NGNG推測だが
vector2<int>
で vector<vector<int> > に展開されるようなコードを書きたいんじゃないのか?
0630デフォルトの名無しさん
NGNGtemplate<class A,class B>
struct Typelist{typedef A H;typedef B T;};
とかいう今流行りのあれです。
0631デフォルトの名無しさん
NGNGtypedef vector<vector> vecvec;
とやりたいですって言えばよかったと思います。
0632デフォルトの名無しさん
NGNGtypedefの再定義はできないからそれは不可能かもね。
有限のデータ構造をしたから積み上げるだけがC++の全てかも。
0633デフォルトの名無しさん
NGNG0634デフォルトの名無しさん
NGNG今流行りのスレで聞きましょう
0635デフォルトの名無しさん
NGNGvector<vector<T> >なら
#include <vector>
using namespace std;
template <typename T> class vector2 : public vector<vector<T> > {};
int main(int argc, char *argv[]) {
vector2<int> v2;
v2.resize(3);
v2[0].push_back(0);
v2[0].push_back(1);
v2[2].push_back(2);
return 0;
}
でどうよ
0636デフォルトの名無しさん
NGNGどうやって呼び出したらいいの?
それとこのやりかたはよくないですか?
0637デフォルトの名無しさん
NGNGthis.method();
0638デフォルトの名無しさん
NGNG0639デフォルトの名無しさん
NGNGすばやい回答どうもありがとうございます。
test::aaa() {
this.bbb( 123, 456 )
}
int test::bbb( int a, int b) {
return a+b;
}
これでいいの
それともこっちのほう
this->bbb( 123, 456 )
0640デフォルトの名無しさん
NGNGthisはポインター
0641デフォルトの名無しさん
NGNG自分のオブジェクトのメンバ関数を自分のオブジェクトの
メンバ関数から呼ぶ場合は何も指定しなくてもOK。
上の例だと
test::aaa(){
bbb(123,456);
}
でOK。
thisは自分のオブジェクトへの参照を返すときなどに
使用する。
0642デフォルトの名無しさん
NGNG>メンバ関数から呼ぶ場合は何も指定しなくてもOK。
仮想関数だと話が変わってくるがどうか。
0643デフォルトの名無しさん
NGNGおお、そうだ、それ忘れてた。
0644デフォルトの名無しさん
NGNG0645639
NGNGありがとう
よくわかりました。
0646デフォルトの名無しさん
NGNGど忘れしてしまって
"今日はいい天気です。外で元気に$
あそびましょう"
0647デフォルトの名無しさん
NGNGお好きなところに\nを挿入。
0648デフォルトの名無しさん
NGNG"今日はいい天気です。外で元気に"
"あそびましょう"
じゃないのか?連続する文字列は一つになります。
0649デフォルトの名無しさん
NGNG要するに、『長い文字列を、ソース上で見やすくするための改行』を
したいんだよね? 『出力時に文字列を改行』したいなら>>647が
答えてるけど、そんなの度忘れしたりもしないだろうし。
char a[] =
"今日はいい天気です。外で元気に\
あそびましょう";
行末に \ を入れればいいよ。
って、>>648の方法でもイケるんだね…。知らなかったよ。
>>648の方は、分割した後のインデントが出来るから、
そっちがよさそうだね。
0650デフォルトの名無しさん
NGNG初めて知った感動age
0651デフォルトの名無しさん
NGNG「文字定数はコンパイル時に連結することもできる」
と書いてあります。
けっこうK&R読んでない人いるのね。
0652デフォルトの名無しさん
NGNG0653デフォルトの名無しさん
NGNG0654デフォルトの名無しさん
NGNG『プログラミング言語C++ 第3版』の127ページには
「隣り合う文字列はコンパイラによって結合されるのえ」
って書いてある。誤字ってるけど。
0655デフォルトの名無しさん
NGNG0656デフォルトの名無しさん
NGNG0657デフォルトの名無しさん
NGNG本当だ。誤植ですね。でもこれはANSI-Cでも使われていた記法ですよね。
0658デフォルトの名無しさん
NGNGあの本の誤植には、「参考演算子」ってのもあったな。
0659デフォルトの名無しさん
NGNGfriend void func(int a){cout<<a<<endl;}
};
という風なフレンド関数に何故かアクセスできません。
何故なのでしょうか?
0660デフォルトの名無しさん
NGNGクラスのなかでフレンド関数を「定義」するのは無意味だと思いませんか?
0661デフォルトの名無しさん
NGNG0662デフォルトの名無しさん
NGNGフレンド関数です。
0663デフォルトの名無しさん
NGNG0664デフォルトの名無しさん
NGNGトラブルをひきおこすことのほうが多いのだよ
0665デフォルトの名無しさん
NGNGフレンドでも見せられないものとはなんでしょうか?
0666デフォルトの名無しさん
NGNG0667デフォルトの名無しさん
NGNG0668デフォルトの名無しさん
NGNG651->652->654と読んでください。K&R知らなかったらごめん。
>>658
知ってるかもしれないけど、
ttp://www.longtail.co.jp/errata/
正誤表です。これ、途中で</b>するの忘れてませんか。
正誤表くらいはちゃんと書いて欲しい。
0669デフォルトの名無しさん
NGNGvc6,g++(cygwin)でコンパイルも実行も出来たのですが。
namespace n {
struct s;
}
struct ::n::s {int x;};
int main() {
::n::s v;
v.x = 1;
return 0;
}
The C++ Programming Language(3rd)の巻末のgrammarのクラスの定義の部分は、
>class-head:
> class-key identifier(opt base-clause(opt
> class-key nested-name-specifier identifier base-clause(opt
> class-key nested-name-specifier(opt "template" template-id base-clause(opt
>
>class-key:
> "class"
> "struct"
> "union"
また、
>nested-name-specifier:
> class-or-namespace-name "::" nested-name-specifier(opt
> class-or-namespace-name "::" "template" nested-name-specifier
となっており、クラス名またはクラス名の前のネームスペース名には "::" を
付けられないというように読めるんです。
正誤表には載ってないので、コンパイラ独自拡張ですか?
http://www.research.att.com/~bs/3rd_errata.html
0670デフォルトの名無しさん
NGNGsimple-type-specifier:
::(opt nested-name-specifier(opt type-name
の、スコープはずしになってるんでないのかな?
0671669
NGNGので、確かなことは言えないですが、クラスの定義はsimple-type-specifierでなく
class-specifierのほうではないのですか?
(反語じゃないですよ。実はBNF?よくわかってないので)
0672デフォルトの名無しさん
NGNG参照カウントをポイント先のアドレスをキーにした hash に入れて管理する
という方式はまずいでしょうか?
0673デフォルトの名無しさん
NGNG定義だろうと、式の中だろうと、先頭につく::はグローバルスコープを意味するんじゃないの?
0674デフォルトの名無しさん
NGNGまずかったらまずかったでやり直せばいいんだし。
どうせ車輪の再発明なんだから、割り切ってやるとよし。
0675669
NGNGやっぱりよくわからない…。
ので、自分の言いたいことだけ書くと、
struct ::s{}; とか struct ::n::s{};という書き方が出来るためには、
>>669のclass-headはclass-keyの次に "::"(opt が必要ではないのか?
ということです。
0677デフォルトの名無しさん
NGNG訳者あとがきに長尾さんのメアドが載っているから、直接聞いてみるの
がいいかもね。迷惑かもしれないけど(^^;;
もし答えが返ってきたら、ここにも報告よろしく。
0678デフォルトの名無しさん
NGNG英語版のほうなんですがいいのですかね?
日本語版でも書いてあることは同じですか?こっそり変わったりはしてないですか?
0679デフォルトの名無しさん
NGNG英語版は持ってないので、もし原著者のメアドが載っているなら原著者
に聞いてみる方が確実かも。日本語版にも同じことが書かれています。
こっそり変わったりしてません。
良心の問題ならば、日本語版買いましょう。
0681デフォルトの名無しさん
NGNGメールの作成も自分でやってね、ってつもりで書いてたんだけどね。
春休みなしですか。学校行ってらっしゃい。
0682デフォルトの名無しさん
NGNGcomp.lang.c++ で聞けよそのくらい。
テンプレいっぱいあるからさ。(nntpd の上に)
0683デフォルトの名無しさん
NGNG↑うまくいえないけど、、、なんか変。
0684デフォルトの名無しさん
NGNG0685デフォルトの名無しさん
NGNG0686デフォルトの名無しさん
NGNGテンプレートクラスのテンプレート引数型を含むスタティックメンバー変数の実体をどうやって定義したらいいのかわからずに困っています。
ヘッダで
template < class T>
class TemplateClass
{
private:
static map<T, int> StaticMemberVariable;
}
このように宣言して
実装ファイルで
map<T*, int> TemplateClass::StaticMemberVariable = 0;
としているのですが、 T ってなんぞや というエラーになってしまいます。
とりあえず
map<TemplateClass::T*, int> TemplateClass::StaticMemberVariable = 0;
とも書いてみたのですが、やはり駄目でした
このような場合、どこでどのように宣言すれば良いのでしょうか?
よろしくお願いいたします。
0687デフォルトの名無しさん
NGNGtemplate<class T>
class TemplateClass
{
private:
static map<T, int> StaticMemberVariable;
};
template<class T>
map<T, int>
TemplateClass<T>::StaticMemberVariable = 0;
0688686
NGNGありがとうございます。
今読み返したらちょっと間違った質問だったのですが、
的確なお答えを頂けて嬉しいです。うまくいきました!!ありがとうございました。
0689デフォルトの名無しさん
NGNG誰か教えてください。
0690デフォルトの名無しさん
NGNGitoa()
0691デフォルトの名無しさん
NGNG0692助けてください
NGNGもう2CHだけが頼りです。
コマンドライン引数に指定されたファイルすべてに対して、
改行文字以外の各行を、逆さまにして表示するプログラム
を書いてください。
このプログラムを a.out とすると実行結果としては、
以下のようになります。
% cat text
text1
text2
text3
% ./a.out text
1txet
2txet
3txet
逆さまに表示する部分は、以下のようにすると簡単にできます。
1.文字列の最後に改行文字があれば、そこに「\0」を代入
2.文字列の最後の文字から先頭に向かって、順に 1 文字ずつ表示
3.1で改行文字があったならば、改行文字を表示
0693デフォルトの名無しさん
NGNG宿題は別のスレで聞け。
0694助けてください
NGNG0695デフォルトの名無しさん
NGNGchar *push(void);
void pop(c);
int main(int argc, char *argv[])
{
int c;
int i;
FILE *fp_in;
if (argc < 2) {
fprintf(stdout, "USEGE: filenames\n");
}
for (i = 1; i != NULL; i++) {
if ((fp_in = fopen(argv[i], "r")) == NULL) {
fprintf(stderr, "File Open Error.\n"
}
while((c = getc(fp_in)) != EOF) {
if (c == '\n') {
while(putchar(push()) != NULL)
;
} else {
pop(c);
}
}
}
}
雨で帰れないから作っちゃったYO!
でも提示された方法使ってないYO!
0696デフォルトの名無しさん
NGNG教えてクン逝って良し。せめてスレッド一覧を表示して、宿題で検索ぐらい
かけろよ。
0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
NGNGところでBoostに代わるライブラリを探しているのですが
経験豊富な皆さんのお気に入りライブラリを教えていただけない
でしょうか?簡単な利点欠点の説明がついてると嬉しいです。
よろしくお願いします。
0699デフォルトの名無しさん
NGNG0700デフォルトの名無しさん
NGNG>>699
それはなぜでしょうか?
ハッピーじゃないからですか?
0702デフォルトの名無しさん
NGNGぜんぜん仕様と違うじゃん…
大体宿題教えて君に教えてやるのは罪だぞ。
しかも関数の定義がないし…
0703デフォルトの名無しさん
NGNGint main(int argc, char *argv[]) {
char b[256];
for (int i=1; i<argc; ++i) {
FILE *fp = fopen(argv[i], "r");
while (fgets(b, 256, fp) != 0) {
int p;
for (p=0; 32<=b[p]; ++p) ;
while (p > 0) putc( b[--p], stdout);
puts("");
}
fclose(fp);
}
return 1;
}
これは >>692 さんが列挙していた方法とは違うし、
細かい部分の仕様も違うけど、大方うまく動きます(VC++で確認、わらぃ)。
でも決してこんなコードを書いてはいけません。
もしもこんなコードを課題の解答として提出しようものなら、
たとえ 692 さんが他の面では優秀だとしても落第決定です。
仮に私が 692 さんの担当教官なら、2、3発は殴るかもしれません。
なぜこんなコードを書いてはいけないのかは 692 さん自身で考えて下さい。
とにかく、書いちゃだめです。
0704デフォルトの名無しさん
NGNG#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
for(int i=0;i<argc;++i){
ifstream f(argv[i]);
string s;
getline(f, s, '\n');
reverse(s.begin(), s.end());
cout << s;
}
}
0705704
NGNGでも面倒だからもぉいいや・・・
0706デフォルトの名無しさん
NGNGwhile (!_kbhit());
_getch();
に匹敵する「空の入力待ち」をするにはどうしたらいいのでしょうか?
不可能ですか?
0707デフォルトの名無しさん
NGNGつまりEnter打つまで待つんじゃなくて、キーを押した瞬間に
動作してほしいっつーことだな。
そういうのは環境依存ってのが定説だと思っていたが。
0708デフォルトの名無しさん
NGNGはじめは一般的と思われるcompositeパターンで実装していたのですが、
最適化をしていくうちにnamelistとdirectoryオブジェクトで構築する
COMのITEMIDLIST+IShellFolderのクローンができちゃったのですが、
もっとうまい構造はないでしょうか?
ITEMIDLIST+IShellFolderをそのまま使うのは、速度の点で納得できないのと、
Windows以外では使えないので。
0709デフォルトの名無しさん
NGNG0710デフォルトの名無しさん
NGNGそういえば Boost でもファイルシステムをラップするライブラリを
作ってたような気がする。そっちも見てみたら?
0711デフォルトの名無しさん
NGNG「javaのようにc++の全ての機能をclassにするんだ!!」
と叫びながら姿を消しました。その後、彼から変数宣言を
class化(?)したものがメール届きました。そのclassは
一応動きますが、分からないのはC++でjavaみたいなモノを作るのに
何か意味があるんでしょうか?
重いだけのような気が・・・
0712デフォルトの名無しさん
NGNGC++標準なんですかね?
なんかあやしいんですけど・・
0713デフォルトの名無しさん
NGNGtemplate<class Type> class Type {
}
template<template<TemplateType> class Type> class Class {
public:
Type<int> type;
}
Class<Type> class;
0714デフォルトの名無しさん
NGNGソース見せろ
0715デフォルトの名無しさん
NGNG超FAQだとは想いますが、質問させてください。
プログラミングを勉強しようと想って、C++を考えているんですが、
初めての言語がC++というのは無理でしょうか?
やはりCから始めるべきでしょうか?
教えてください。
0716デフォルトの名無しさん
NGNG> 超FAQだとは想いますが、質問させてください。
ダメです。検索してください。
(っつか 4/1 に 2ch で質問するとは、人生捨ててるとしか思えんが)
0717デフォルトの名無しさん
NGNG挫折しそうになったころにCをやれば十分です。
0718デフォルトの名無しさん
NGNG高校生なら頭柔らかいからC++から入っても問題ないだろ。
でも多分学校の勉強よりも大変だぞ。
0720デフォルトの名無しさん
NGNG最近はGCCも積極的にC++を取り入れてるからな。
流れはC++の方じゃないか?
ちなみに処理系はPC UNIX入れてやるとさらに
勉強になるのでやってみれ。
0721715
NGNG4月1日、、、エイプリルフール???
そ、そんな。。。
講談社新書のブルーバックスで、コンパイラが付録で付いて来る
C++の入門書があったので、それを取り敢えず買おうと想ってます。
他に、初心者向けの入門書があったら教えていただきたいです。
0722デフォルトの名無しさん
NGNGただでさえ虚実入り乱れている2ちゃんねるなのに、今日はエイプリルフールと
いうことでネタ度がアップしてるからな。どこまでネタなのか見切れないと、時間
を大幅に無駄にするぞ(w
0723デフォルトの名無しさん
NGNG初めてだからって〜
覚えることの出来ない言語なんて〜
きっとありはしないのさ〜
必要なのは〜
やる気と時間さ〜♪
その点君は、今年から高校生ですから
時間はたくさんあるでしょう。がんばってください。
ただ、プログラミングに没頭するあまり
高校生活を通じて得られたはずの何かを
手にすることが出来ないかもしれないという諸刃の剣。
何事もバランスが大事。
と、一応マジレス。
0724デフォルトの名無しさん
NGNG0725715
NGNG見てきました。ともっちが可哀想でした。
>>720
>ちなみに処理系はPC UNIX入れてやるとさらに
>勉強になるのでやってみれ。
僕のスキルでは、ちょっと難しいです。
一応デュアルブートでターボリナックスを入れてますが、多分そんな
レベルの話ではありませんね、失礼しました。
F1が終わったので、そろそろ寝ます。
レスしてくださった方々、ありがとうございました。
C++に挑戦してみます。
0726デフォルトの名無しさん
NGNG彼女か?
0727デフォルトの名無しさん
NGNG高校生なら、まずは規則正しい生活を送りなさい。
体力をつけないと、プログラマーにはなれません。
0728デフォルトの名無しさん
NGNGC++だけじゃ相手にしてくれない企業もある。
それ以前にCがわかればC++へもJava、C#へもスムーズに移行できるだろうけど、C++だけがわかっても先は望めないと思う。
つか、C++は.NETからしてみると相手にされてないし…。マネージC++は対応するようだけど…。
0729デフォルトの名無しさん
NGNG0730デフォルトの名無しさん
NGNG>それ以前にCがわかればC++へもJava、C#へもスムーズに移行できるだろうけど
なわけねーだろ
0731デフォルトの名無しさん
NGNG言葉上そうしたまで
実際、C++は最難関と言われるだけあって言語の中では一番難しい。スムーズに以降ってのはCのソースを.cppとして保存してC++としてコンパイルできるでしょ?だから。
覚えるのはそりゃあ本人のやる気次第。馬鹿は馬鹿だ。)w
0732デフォルトの名無しさん
NGNGCやってればtどっちの基礎も終了。
0733731
NGNG難易度でいうと
C(易しい)、C#(普通)、Java(やや難しい)、C++(かなーり難しい)
となるが、Cを覚えてからだとJavaにもC++にも応用でき習得の難易度も下がるだろう。
0734731
NGNGで、C++が難しいのはCとの互換性を重視しすぎたため。完全上位(下位?)互換ですから。
Javaはオブジェクト指向に関係ないものは全て切り捨てたんじゃなかったかな。
0735デフォルトの名無しさん
NGNG0737デフォルトの名無しさん
NGNG今日は2chを見ないほうがいいなw
0738デフォルトの名無しさん
NGNGもちろん、標準機能。つーか、いままでつかえなかったんかい!
0739デフォルトの名無しさん
NGNGC++はCを含んでるだろ。わけわからんこと言うな。
0740デフォルトの名無しさん
NGNGまさかCとC++を似たものだと思っているのですか?
0741デフォルトの名無しさん
NGNG含んでると書いてるだろ。C++ができるようになったときには
Cができるようになってるってことだよ。
0742デフォルトの名無しさん
NGNG0743デフォルトの名無しさん
NGNG?細かい点で相違はあるけど、C++中のC的な部分とCはほとんど
同じだぞ?C++ができるようになるためにはCができないと
駄目だが、C++から勉強しても結局同じ道を通るんだから
同じことだと思われ。
0744デフォルトの名無しさん
NGNG手書きしなけりゃならないとか。たとえば、vtbl みたいな。
C++ から入ると、関数ポインタのテーブルを作ってディスパッチ、
なんてテクニックはあまり使わない気がする。
0745デフォルトの名無しさん
NGNG0746デフォルトの名無しさん
NGNG0747デフォルトの名無しさん
NGNGそんなことあり得るの?誰か説明して
0748デフォルトの名無しさん
NGNG0749こっちでやれ
NGNGhttp://pc.2ch.net/test/read.cgi/prog/1014654569/
0750デフォルトの名無しさん
NGNGC++で好き勝手書いてると、Cの制限忘れてエラー出まくる。
0751デフォルトの名無しさん
NGNGCではことごとく使えない、って感じるやつもいるかも、つか実際見た。
C++から入ったやつが、Cとの差分をいちいち気にしてるとは限らないじゃん。
0752デフォルトの名無しさん
NGNG0753デフォルトの名無しさん
NGNG前:文法変。
後:それに何の意味があるというのか?
0754デフォルトの名無しさん
NGNGということでCは書けないな、俺。
0755デフォルトの名無しさん
NGNG見たまんまの事しかやってないよ。
結果はaとbの型による。
0756752
NGNG0757デフォルトの名無しさん
NGNG丸め(a+b)と丸め(a)+丸め(b)の差?
0759デフォルトの名無しさん
NGNG(int)a;
0760デフォルトの名無しさん
NGNG前者はC++なら合法になると思うが。
a+bの結果の値が数値型にキャスト可能ならば。
0761デフォルトの名無しさん
NGNG0762752
NGNG(a+b)と(a)+(b)の丸め誤差の違いということですね。
もう一つわからないことがあるのですが、
int a=15;
a ^=0x27;
このaの値はいくつになるのでしょうか?
a ^=0x27;
の意味が良くわからないんです。
よろしくお願いします。
0763デフォルトの名無しさん
NGNGXOR取ってね。
0764762
NGNGそれは本持ってないしネットで調べるのも面倒だから。
だってここに書き込んでおけば自動的に
答えが返ってくるので簡単便利だからね。
インターネットマンセーマンセー。
0765デフォルトの名無しさん
NGNG0000 1111
0010 0111
xor
0010 1000
0766デフォルトの名無しさん
NGNG0767デフォルトの名無しさん
NGNG自己満足のために安易に答え書くのもどうかと。
育たなくなるぞ。この子。
0768デフォルトの名無しさん
NGNG0769デフォルトの名無しさん
NGNG( -_-)=○)'Д')
0770デフォルトの名無しさん
NGNG0771752
NGNG0x27=39でaとのXORを取るってことですか。
ありがとうございます。
こんな質問してすみませんでした。
0772デフォルトの名無しさん
NGNGそれ以外のときで implicit にキャストが行われてしまう状況というのはあるのでしょうか?
0773デフォルトの名無しさん
NGNG『C++ 第3版』11.7.1 には、「デフォルトで、引数を1つ取るコンストラクタは、
暗黙の変換も定義する」と書いてあるけど。
0774デフォルトの名無しさん
NGNGpublic:
A(int a, int b = 0) {}
};
void f(const A& a)
{}
int main()
{
f(5);
return 0;
}
0775デフォルトの名無しさん
NGNG> A(int a, int b = 0) {}
は、もはや型変換とは呼べない気もするがなー。
0776デフォルトの名無しさん
NGNGとなっているのですが
メンバオブジェクトをもたせた派生クラスのポインタは
基本クラスのポインタに代入させられないのでしょうか?
0777デフォルトの名無しさん
NGNGpublic派生してるなら、代入できる。
0778776
NGNG基本クラスA、派生クラスB、Cとなっていて
Function(A *a1,A *a2)という関数を作って
使うときに、BとCのポインタ渡すのですが
Bはちゃんと渡せていて、Cは渡すと値がおかしくなります
BとCの違いはCにはメンバオブジェクトを持たせたくらいなのですが…
コンパイルエラーは起こりません
0779デフォルトの名無しさん
NGNGそのまま渡せ。
class B : public A {};
class C : public A {};
B b;
C c;
Function(&b, &c);
0780デフォルトの名無しさん
NGNGソースうpきぼんぬ
0781デフォルトの名無しさん
NGNGメンバオブジェクト持たせて、それ使ってない?
0782776
NGNGメンバオブジェクトの有無は関係ないようですね
それしか考えられないと思っていたのですが
ほかの違いを探して見ます
0783776
NGNGソースは、ずいぶん長くなっちゃうんですけど・・・
0784デフォルトの名無しさん
NGNG要約したのでいいよ。もちろんテストして
ちゃんと動かないことを確認してからうpしてくれ。
0785デフォルトの名無しさん
NGNGa2->~A();
new(a2) A();
みたいなエキセントリックなことやってるとスライシングが
起きて値が変になるけど、まさかそういうことではないよねぇ。
0786デフォルトの名無しさん
NGNG入れたいんだけどどうすればいいの
int a=0x1234;
printf("%08X",a);
こんな感じの結果をstringに入れる
方法教えてください。
0787デフォルトの名無しさん
NGNGsprintf して char[] に入れてから string に代入。
あるいは stringstream で。
0788デフォルトの名無しさん
NGNG787じゃないがstreamを使う場合はもうちょっと知識がいるが勉強してくれ。
0789776
NGNG>785
関数の中で基本クラスのpublicにした変数にアクセスするだけで
ポインタの値が飛ぶようです
a1->v[0].x=a1->v[0].x;
こうしただけでハンドルされてない例外・・・
もう別の方法とることにします
0790デフォルトの名無しさん
NGNG#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
int main()
{
int i = 0x1234;
string s;
ostringstream os;
os << setw(8) << setfill('0') << hex << i;
s = os.str();
cout << s << endl;
}
0791デフォルトの名無しさん
NGNGout_of_range例外じゃないだろうな…
あと、データメンバをpublicにするのは禿しく糞なので
するな。classの意味がない。
0792デフォルトの名無しさん
NGNG気になるので、classの宣言部分だけでもうpしてくれ。
検証するから。
0793776
NGNGpublicはたしかに糞なのでprotectedに変更
そしてデータ読み出し用の関数を作ったら成功しました
お騒がせしてしまい、すみませんでした
0794デフォルトの名無しさん
NGNG0795デフォルトの名無しさん
NGNGそんなレベルの爆弾だと思われ。
0796デフォルトの名無しさん
NGNGpublic:
void func(){cout<<"hahaha"<<endl;}
};
void main(){
const A* pa=new A;
pa->func()←----------------これがOKなのに
delete const_cast<A*>(pa);
const A a;
const_cast<A>(a);←---------なんでこれエラー?キャストできない
}
0797デフォルトの名無しさん
NGNGpa->func()
じゃなくて、
const_cast<A*>(pa)->func()だった。
0798デフォルトの名無しさん
NGNG0799デフォルトの名無しさん
NGNG0800デフォルトの名無しさん
NGNGdelete に const_cast って必要?
0801デフォルトの名無しさん
NGNGclass CA{
public:
void func(){}
void hoge(){}
};
というclassがあった時、
void main(void){
CA ca=new CA;
ca->func();
ca->foo();ここでcaが不要になるとき、それを察知して自動で自分を
} deleteするにはどうすればいいでしょう、、、?
0802デフォルトの名無しさん
NGNGそりゃ何言語だ?
CAにpointer to CAは代入できないぞ。
std::auto_ptr<CA> ca = new CA;
boost::shared_ptr<CA> ca = new CA;
お好きな方をどうぞ
0803デフォルトの名無しさん
NGNG0804デフォルトの名無しさん
NGNGSTLは最後の手段なので、、、
void main(void){
CA* ca=new CA;
ca->func();
ca->foo();この時点で自動でdeleteしたいんです
何かいい方法はないものでしょうか。
int a=10;
int b=12;
}
0805デフォルトの名無しさん
NGNG{
CA ca;
CA*pca = &ca;
pca->func();
pca->foo();
}
int a = 10
int b = 12;
}
どうだ?
0806デフォルトの名無しさん
NGNG0807デフォルトの名無しさん
NGNG言語側で自動的に変数の寿命を決定するシステムや、
プログラムからプログラムが見れるLispの様な処理系でないと不可能だろ
0808デフォルトの名無しさん
NGNG{
ca.foo();
delete ca:
}
0809デフォルトの名無しさん
NGNG0810772
NGNG>>773
なるほど、勉強になります。
>>774
試してみました・・・。怖いですね。
「デフォルトで、引数を1つ取るコンストラクタ」の引数は仮引数じゃなくて
実引数の数の事を言ってるって事ですね(試した VC++6 がこの部分で規格に準拠してればですけど)。
ちなみに代入演算子も使えてしまいました・・・。
聞いてみてよかった。ありがとうございます。
0811デフォルトの名無しさん
NGNGあるエントリーの値を調べたいのですが、もしそのエントリーが存在しなければ、
エントリーを作成せずに「エントリーがない」という事をしりたいのですが
どうしたらよいでしょうか?
[] では見に行ったときにエントリーを作成してしまいますし・・・。
よろしくお願いします。
0812デフォルトの名無しさん
NGNGテンプレートを使わずに、CA 専用の auto_ptr を作る。
0813デフォルトの名無しさん
NGNGfind
0814デフォルトの名無しさん
NGNG0815811
NGNGあ、なるほど。基本を忘れてました。
ありがとうございました。
0816デフォルトの名無しさん
NGNG>>774の形の暗黙の型変換を許さないと面倒な場合もある。
class Complex {
Complex(double re, double im) {...}
};
Complex& operator +(const Complex& lhs, const Complex& rhs)
{...}
void f()
{
Complex c1(1, 2);
Complex c2;
Complex c3;
c3 = c1 + c2; //問題無し
c3 = c1 + 3; //>>774を許さない場合、オーバーロードしなければエラー
}
0818デフォルトの名無しさん
NGNG#include <iostream.h>
void func(char[3]);
main(){
char str[3][50] = {"はじめ","真ん中","おわり"};
func(str[1]);
}
void func(char[3] x[][50]){
cout << x[];
}
真ん中というのを表示させようとしているんだけど、
コンパイルエラーです。
これを直したソースを教えてください。
0819デフォルトの名無しさん
NGNG0820デフォルトの名無しさん
NGNG#include <iostream.h>
void func(char*);
main(){
char str[3][50] = {"はじめ","真ん中","おわり"};
func(str[1]);
}
void func(char* x){
cout << x;
}
0821820です
NGNG0822デフォルトの名無しさん
NGNG外出スマスマの件名で送りました。
0823デフォルトの名無しさん
NGNGなるほど、確かに。この場合は、
Complex(double re = 0, double im = 0) {...}
ってな感じで、どちらの引数にもデフォルト値を設定してしまって
かまわないわけですな。それでも、
c3 = c1 + 3;
の 3 に対しては暗黙のうちにコンストラクタが適用されると。
0824Cおやじ
NGNGC++はこんなこともできるのかと思ってしまった。
構文エラー出てアアヨカタ
0825デフォルトの名無しさん
NGNGC++はデフォルト引数と参照引数が使える点が違うぐらいだヨ。
0826デフォルトの名無しさん
NGNG#include <string>
って何?
#include <string.h>
とは違うの?
0827デフォルトの名無しさん
NGNGstringはstdc++のヘッダ
0828デフォルトの名無しさん
NGNG奇抜でもない、テンプレートの楽しい使い方おしえろ ゴルァ
0829デフォルトの名無しさん
NGNGソース見る人の理解を阻害しない程度の、ってこと?
0830828
NGNGとにかく役に立つかっこいい使い方 キボンヌ... Prolog
0831デフォルトの名無しさん
NGNG0832デフォルトの名無しさん
NGNGああ、それ俺もキボンヌ。
Effective C++ で、『コピーコンストラクタと代入演算子をprivate宣言して、
実装は行わない。これで、想定外の代入・コピーを防ぐ』ってのが
あったじゃん。クラス作るごとに宣言して行くのがめんどいんだよね。
テンプレートでどうにか楽に出来ない? 誰か教えて。
0833デフォルトの名無しさん
NGNGBoostでやってる
0834832
NGNGぎゃっふーん! マジっすか。
んじゃさ、Exceptional C++ のpimplイディオムのためのポインタとかは?
auto_ptrでもいいんだけど、どうせ代入・コピーはしないんだから禁止して
あるといいし、コンストラクタで確保してデストラクタで解放するのも
確定だから、所有権フラグも要らないじゃん。
これはどうよ?
0835712
NGNG遅レスごめん
標準なのか。
じゃ、ガンガン使わなきゃ。
疑り深くなってしまってるけど他にも
メンバの初期値指定はスタティックでコンストで整数型でなければならない
とか変な制約あるんだよね・・。
おまえそれenumちゃうんかと。
0836デフォルトの名無しさん
NGNG> auto_ptrでもいいんだけど、どうせ代入・コピーはしないんだから禁止して
> あるといいし、
pimpl は shared_ptr で確保するケースもあるぞ。Win32 の「ハンドル」みたく、
中身を見せないであたいベースで受け渡しできるようにする場合、とかね。
0837デフォルトの名無しさん
NGNGauto_ptrでやるのは無理じゃないか?
deleteするときにデストラクタ呼ぶだろ?
auto_ptrよりも制限がきついやつはboostに入ってるよ。
scoped_ptrとか。
0838デフォルトの名無しさん
NGNGふつうは auto_ptr ではなく const auto_ptr を使う。
0840デフォルトの名無しさん
NGNGその名も「コピー不可能」という名前のクラスだ。頑張って英訳せよ。
0841デフォルトの名無しさん
NGNG0842832
NGNGclass名は noncopyable で、ファイルは utility.hpp やね。
noncopyable を private 継承すればOK、という使い方みたいだなー。
テンプレートだと思ってたけど、継承でいけたのか。そっかー。
0843828
NGNGということでよいか?
0844デフォルトの名無しさん
NGNGもう少し回りのコードと親和性の高い文法にならんかったのかねえ。
0845デフォルトの名無しさん
NGNGBTA と PE って何?
0846デフォルトの名無しさん
NGNGttp://www.diku.dk/research-groups/topps/activities/PartialEvaluation.html
0847デフォルトの名無しさん
NGNGどこで行えばよろしいのでしょうか?
class A {
private:
static int a;
・
・
・
0848デフォルトの名無しさん
NGNG0849デフォルトの名無しさん
NGNG0850デフォルトの名無しさん
NGNGコンストラクタ内でやるしかないんじゃないの?
0851デフォルトの名無しさん
NGNG0852デフォルトの名無しさん
NGNG849のようにクラスの外でそれを初期化するしかないのかな?
0853デフォルトの名無しさん
NGNG0854デフォルトの名無しさん
NGNGprivate:
static int a;
};
int A::a = xxx;
これでいいみたい
0856847
NGNG0857デフォルトの名無しさん
NGNGプログラミング言語C++第3版§10.2.4「静的メンバ」参照。
静的データメンバの初期化は一度しか行われないため、クラスの宣言部
では初期化できない。>>849>>852>>855さんの通り。
>>848さんの書式はstaticでないメンバに適用する。これはメンバ初期設定
リストと呼ばれる。特にconstなデータメンバの初期化にはこれ以外に方法
がない。
0858デフォルトの名無しさん
NGNGもしstaticなデータメンバにコンストラクタ内で代入すると、そのクラスのインスタンス
が生成される度にstaticなデータメンバは上書きされる。
0859デフォルトの名無しさん
NGNG例えば名前がClaというクラスがあったらClaの中でClaと言う名前を見つけた時
コンストラクタとは気づかず小一時間悩んだこともあった。
ああ、鬱だ死のう。でも真でも死にきれないよえーん
0860デフォルトの名無しさん
NGNGC++に関係のない人生というものがあります
0861デフォルトの名無しさん
NGNGvoid set(unsigned char *yama);
};
class dore{
public:
unsigned char *get(){ return kawa }
unsigned char *kawa;
};
と宣言して
hoge->set(dore->get);
と使おうとしたら、
1 番目の引数を 'unsigned char *(void)' から 'unsigned char *' に変換できません。
とか言われちまいました。
何がおかしいかサパーリ分からん。
どっかおかしいですか?
0862デフォルトの名無しさん
NGNGどっかにありませんか?
Str = "3+4*(4/2)"
Str.Calculate();
こんな感じで演算させたら、 Str == "11" になってくれてるようなやつ。
0863デフォルトの名無しさん
NGNGhoge::set()に渡したいのはdore::get()そのものではなくdore::get()の返値だから、
hoge->set(dore->get());
としなければ。
0865デフォルトの名無しさん
NGNGttp://member.nifty.ne.jp/nakamula/recurs.htm
これでも見て作れ!
作ったら上げてくれ
0866861
NGNG少しやってたから
0867デフォルトの名無しさん
NGNGhttp://spirit.sourceforge.net/
libs/example/calcに入ってるからclassにすればよか
yacc2spiritとかないのか
0868デフォルトの名無しさん
NGNGという書き方がVC以外だとエラーが出るのですが、
これは他のコンパイラが腐ってるからですか?
0869デフォルトの名無しさん
NGNGint i, int n っつのがダメなんじゃないの?
int i=0,n=str...
悪い。よく知らんけど…。
0870デフォルトの名無しさん
NGNGVCの警告見た?
0871デフォルトの名無しさん
NGNG0872デフォルトの名無しさん
NGNGVCってそれ通るのか?その方が腐ってる気がしないでもないが。
0874デフォルトの名無しさん
NGNG0875デフォルトの名無しさん
NGNGしかし str::basic_string の使い方がよくわかりません。
std::basic_string の使い方( std::string としてでも問題無しです)
をわかりやすく解説しているサイトなどをご存知無いでしょうか?
どなたかよろしくお願いいたします。
0876デフォルトの名無しさん
NGNGSTLって書いてある本を探せ。
STL絡みで糞本はあまり見たことないからどれを買ってもOKだ。
0877デフォルトの名無しさん
NGNGSTL絡みの糞本あったよ、、、
前に不注意にも中身をろくに見ずに買っちゃったことがあってね
『公開されているヘッダー』をそのまま貼り付けて
ドキュメントも英語の原盤の単語を置き換えて語順を変え、
一度も人間が目を通さなかったみたいな文だった
本を買うときは十分に立ち読みしてから買いましょう
さて、本題に、
演算子のdeleteでNULL初期化されないのは仕様でしょうか?
0878デフォルトの名無しさん
NGNG遠慮なく晒すべし>本
本題はよく分からん。
0879デフォルトの名無しさん
NGNG普通されるか?
ポイント先が無効になるだけっしょ。
0880デフォルトの名無しさん
NGNGptrが変数であるとは限らないので
勝手に代入されないのと全く同じだと思いますが。
Object *Container::SelectObject(int index) {...}
等の時に
delete SelectObject(index);
というような使い方をすることが稀にありますが、
こういう時にどうしろというのでしょうか。
0881877
NGNGやっぱダメ?
参照になってるかと思ってた
じゃ、
delete p;
p = NULL;
ってやらなきゃだめなのか、、、
なんかスマートじゃないな
>878
ゴメン、棄てたか売ったか誰かにあげたか、処分済みたい
(結局Web上のと英文のでなんとかした)
0882877
NGNG>ptrが変数であるとは限らないので
・・・・う、ちょっと理解できなかった
変数以外の場合って?(const付きの場合?)
0883デフォルトの名無しさん
NGNGHoge::Hoge() : p_(new XXX) {}
デストラクタで
Hoge::~Hoge() { delete p_; }
だからそんなくだらん後処理しない。
0884デフォルトの名無しさん
NGNG0885884
NGNG0886デフォルトの名無しさん
NGNG0887デフォルトの名無しさん
NGNGできませんかね?
具体的に言うと、
ifstream file("c:\\Hoge.zip\\Hoge.txt");
ってすると、cドライブのルートにあるHoge.zipアーカイブから、
Hoge.txtを取り出して読み込んでくれるようなモノを創りたいのです。
同様に、出力のほうもやりたいと思ってます。
ifstreamをメンバ変数として持つクラスを作って、ファイル読み込み以外を
全部委譲してしまえば出来るんでしょうけど、それはあまりにも煩雑すぎる
ので勘弁してください。ifstreamを継承して、ファイル読み込み部分だけを
オーバーライド出来れば…と思うんですけど、出来ますか?
0888デフォルトの名無しさん
NGNGそれこそ出来合いの奴使えばいいような
0889デフォルトの名無しさん
NGNGえと、結論は
・初期化されない、自分でしろ
・再利用するような状況なんてほとんど無い
で、いいんだよね
>887
streambufをいじればいいらしいよ
0890889
NGNGここのを
0891デフォルトの名無しさん
NGNG>変数以外の場合って?
式の場合を>>880が説明していますが。
0892デフォルトの名無しさん
NGNG出来るよ。streambuf を入れかえればOKね。
http://www.jah.ne.jp/~naoyuki/Writings/ExtIos.html
http://www.cs.unc.edu/Research/compgeom/gzstream/
0893デフォルトの名無しさん
NGNGauto_ptr を使え。
0894881
NGNGコンテナに入れてistream_iterator、ostream_iterator通して、etc,etc
auto_ptrはつかえないよ
0895デフォルトの名無しさん
NGNG前提が良く分からんが、何をどうしたいんだ?
0897877
NGNG話がややこしくなってきてる、、、
最初の質問は
いろんな機能をつけたスマートポインタを作って
(スマートポインタは大抵継承不可だし、
既存のものをコピペして書き足すのよりは自分で書いた方が動作が把握しやすいかな、と)
デバッガでチェックしてたときに
deleteしたあとにポインタの値がNULLになっていないのを見て
ここに質問だしたの、(deleteはNULL初期化してくれると思いこんでたので)
881のはスマートポインタ内の処理、
894の発言は>893のを僕が作った方のスマートポインタの事について言ってると
勘違いしてだしたものでした。
(今から思えばこっちは自分でスマートポインタ(?)を作ってるとは一言も言ってない、、)
0898デフォルトの名無しさん
NGNG以上。
0899デフォルトの名無しさん
NGNG作られたものだから。
0900900
NGNG0901877
NGNGレスどーも、
そう気づいてさっき入れました、
0902デフォルトの名無しさん
NGNGclass C *a, *b;
if ( a == b ) {....
0903デフォルトの名無しさん
NGNGmain(){
A* pa=new A;
delete pa;
return 0;
}
とした後に、OSにこのpaを使わせないようにする方法ってあるんでしょうか?
0904デフォルトの名無しさん
NGNG・・・・・いいんじゃない、多分
0905デフォルトの名無しさん
NGNG0906デフォルトの名無しさん
NGNG許可されるかどうかという意味なら大丈夫だけど
その比較がtrueになった時にどんな意味を持つのかは
書いた人次第だと思われ
0907デフォルトの名無しさん
NGNGpa を「使う」の意味は?
new したときに前回利用したアドレスを渡したくないのなら、operator new()
をそのように定義すればいい。pa のアドレスにアクセスしたときに保護例外
を発生させたければ mprotect() とかでページ属性を変更、かな。
0908903
NGNGいえ、deleteしたらpaが解放されるので、
アドレスがOSに返されてしまう(ですよね?曖昧なのですが)、
その後にOSがpaのあったアドレスをOSが使用することを禁じたい
のです。
0909デフォルトの名無しさん
NGNGデバイスドライバ作っているの?
仮想メモリのアドレスじゃだめだよね?
0910903
NGNGそ、それはアリなんですか?
>デバイスドライバ作っているの?
はい。しかし何処をどうすればよいのやらで悩んでおります。
0911デフォルトの名無しさん
NGNG普通のプロセスじゃ出来ないんじゃないの?
0912デフォルトの名無しさん
NGNG0913デフォルトの名無しさん
NGNGoperator newとoperator deleteあたりをHogeればできるはず。
ただ、deleteしたあとのアドレスの挙動を、なぜ制御したいのか、
というあたりに、大きな疑念が残るが。
0914デフォルトの名無しさん
NGNGWinAPIスレあたりで聞いたらどうですか?
SDKを読めってレスが付くと思おうけど。
それとVC++でしか作れなかったと思うよ。
(記憶が古いかも)
0916デフォルトの名無しさん
NGNG> アドレスがOSに返されてしまう(ですよね?曖昧なのですが)、
そうとは限らない
0917デフォルトの名無しさん
NGNG数億桁まで計算させるにはどのようなテクを使えばいいのか良いのでしょうか?
ちなみに数学系のプログラムなので膨大な桁が必要なのです。
マスマティカとかJAVAで計算できるとは聞いたことはありますが、Cでもできるのでしょうか?
0918デフォルトの名無しさん
NGNGhttp://hp.vector.co.jp/authors/VA018507/
0919デフォルトの名無しさん
NGNGthxです。買う買う!
0920デフォルトの名無しさん
NGNGでBignumもいいかもね。
0921デフォルトの名無しさん
NGNG買うな、作れ。
0922デフォルトの名無しさん
NGNG作るために本を買うって事でしょ
0923デフォルトの名無しさん
NGNGにも色々あって一概には言えないが、多倍長演算することが目的でなくて、
正確な計算結果が欲しいのなら、出来合いのライブラリを使うことを推奨。
自作して変なバグが混入したら面倒だ。
俺が使わせてもらってるのは、MIRACL というやつ。
ttp://indigo.ie/~mscott/
いくつかサンプルプログラムも入っているので、見れば分かるはず。
0924デフォルトの名無しさん
NGNG100kぐらいのファイルのお尻10k程度を切りたいんだけど
新しくファイル作ってわざわざそっちに書き出して
元ファイル消して新しいのリネームして、禿げしく鬱なんだが・・・・
0925デフォルトの名無しさん
NGNG0926デフォルトの名無しさん
NGNGたとえば、リネームするのにfstream使う?
0927デフォルトの名無しさん
NGNG0928デフォルトの名無しさん
NGNG0929デフォルトの名無しさん
NGNG>>926
使わないけど、漏れ元々BCBつかっててさ
TFileStreamのSizeプロパティで一発でできたんだけど
しかし、とある事情からVCで作ることになって
しかたなく似たようなfstream使ったわけよ。
>>927
truncateわからんので調べに逝ってくるよ
0930デフォルトの名無しさん
NGNGそです。ライブラリを1から作るととはワタシニは無理ですな
>>923
では使ってみます。みんなサンクス
0931デフォルトの名無しさん
NGNGストリームからハンドルもってきて
_chsizeにぶち込んだら一行で逝けたーよ!あーりがと!
0932デフォルトの名無しさん
NGNG0933デフォルトの名無しさん
NGNGpublic:
TYPE* pt;
Auto(TYPE* pval=0):pt(pval){}
~Auto(){delete pt;cout<<this<<endl;}
template<typename VAL>Auto<VAL>&operator=(Auto<VAL>& rhs){
/*何かの処理*/
}
};
と言うスマートポインタを作っている最中さんですが、
void main(void){
Auto<CA> a(new CA),b(new CA);
a=a;//ここでオーバロードしたはずの処理が無視される
}
なんとか無視されないようにする方法は無いでしょうか?
0934デフォルトの名無しさん
NGNGこの優先順位が、
a.default op = ( default Auto( ptr ) );よるも低いのが問題でわ?
operator =(TYPE*)とか、 operator =(Auto<TYPE>をキチンと定義するとか、
暗黙の型変換を拒否するとかで何とかなるような気がするが。
0935デフォルトの名無しさん
NGNGpublic:
TYPE* pt;
Auto(TYPE* pval=0):pt(pval){}
~Auto(){delete pt;cout<<this<<endl;}
Auto& operator=(const Auto& rhs){
int x = 0;
/*何かの処理*/
return *this;
}
};
0936デフォルトの名無しさん
NGNG0937935
NGNGAuto<TYPE>& operator=(const Auto<TYPE>& rhs){
0938936
NGNGbccもg++もコンパイラ通ったね
0939デフォルトの名無しさん
NGNGっていう構造体があって、こいつをメンバに持ったクラスのコンストラクタを
struct Class { Data x; Class() : x( Data() ) {} };
ってやるとxのメンバ全部0が入るんですけど、この動作は言語仕様としては
どう規定されてるんですか?
int() が 0 だっていうのはプロ言C++に書いてありますが。
0940939
NGNG「入るんですけど」は g++ 依存ですかね、、、。
0941デフォルトの名無しさん
NGNG{
struct Data { long a; int b; short c; char d; };
struct Class { Data x; Class() : x( Data() ) {} };
Class c;
printf("%d %d %d %d\n", c.x.a, c.x.b, c.x.c, c.x.d);
return 0;
}
--- 出力 ---
4235448 2147348480 -13128 64
------------
struct Data { long a; int b; short c; char d; };
struct Class { Data x; Class() : x( Data() ) {} };
Class c;
int main() throw(int&)
{
printf("%d %d %d %d\n", c.x.a, c.x.b, c.x.c, c.x.d);
return 0;
}
--- 出力 ---
0 2 512 0
------------
?
0942デフォルトの名無しさん
NGNGスタック上にDataが作られてそれがコピーされるから、
ぐろーばるなインスタンスでも0がハインナイのでは。
>int() が 0 だっていうのはプロ言C++に書いてありますが。
詳細希望
0943デフォルトの名無しさん
NGNG0944デフォルトの名無しさん
NGNGclass Foo{
class Hoge *m;
};
って書いちゃうのは標準に合ってるんですか?
0945デフォルトの名無しさん
NGNGでもforward decl.の代わりに使っていい物なのか・・・
0946デフォルトの名無しさん
NGNG0947デフォルトの名無しさん
NGNG0948デフォルトの名無しさん
NGNGint だのポインタだの、組込型についてはデフォルトコンストラクタは
呼ばれない。C++ 第3版 10.4.2 に書いてある。(ここ、誤訳があるので
注意)
0949デフォルトの名無しさん
NGNGメンテは楽なんだが...
#ifndef mylib_h
#define mylib_h
#ifdef __cplusplus
extern "C"{
#endif
/* Cのライブラリ */
typedef struct{
...
} mystruct;
void mystruct_init(mystruct *I);
void mystruct_done(mystruct *I);
#ifdef __cplusplus
// C++のラッパーライブラリ
class MyClass: private mystruct{
...
}
} // extern "C"
#endif
#endif
0950デフォルトの名無しさん
NGNG<<FFドラクエ板>>に投票、よろしくパルプンテ!
http://ton.2ch.net/test/read.cgi/gline/1018386537/l50
<<FFドラクエ板>>に投票、よろしくパルプンテ!
http://ton.2ch.net/test/read.cgi/gline/1018386537/l50
<<FFドラクエ板>>に投票、よろしくパルプンテ!
http://ton.2ch.net/test/read.cgi/gline/1018386537/l50
<<FFドラクエ板>>に投票、よろしくパルプンテ!
0951デフォルトの名無しさん
NGNGCのソースに対してC++のコンパイラを走らせることが必須になってしまう?
ので、C側のコーディングが型チェックなど厳しくなって面倒くさいような
気がすると思うが。
0952デフォルトの名無しさん
NGNG0953939
NGNG組み込み型に対して明示的にコンストラクタを呼んだ場合は、
0 をその型に変換した値(静的変数のデフォルトと同じ?)になる、
ってな感じのことが書いてあった。(構文のコンストラクタのところだったかと)
で、それと、10.4.2 の記述をあわせて読むと、
コンストラクタを宣言していない構造体に対して明示的にコンストラクタ
を呼んだ場合もそれぞれ 0 になるとも読めるかと。
>>949
よくわからんからこんなんでラップしてデフォルトコンストラクタを
つくってやればよいかなとも思いました
0954デフォルトの名無しさん
NGNGとくに問題ないと思うけど。オレだったら、class MyClass の宣言は、
extern "C" の外でするかな。
0955デフォルトの名無しさん
NGNG0956デフォルトの名無しさん
NGNG0958デフォルトの名無しさん
NGNGいっぱいあれ書くぞオ(ワクワク
0959v(^・^)v
NGNG0960⊂(ΦωΦ)⊃ <三瓶です
NGNG0961デフォルトの名無しさん
NGNG__( ;´Д`)__< 9、961かっ…!
| 〃( つ つ | \_______
|\ ⌒⌒⌒⌒⌒⌒\
| \ \
\ |⌒⌒⌒⌒⌒⌒|
\ |_____________|
0962デフォルトの名無しさん
NGNG|_|▽・)
|文|⊂)
| ̄|∧| モウスグ1000・・・
0963デフォルトの名無しさん
NGNG(゚Д゚ ) <あらやだもうすぐじゃないの
0964デフォルトの名無しさん
NGNG(゜д゜@ < あらやだ。同じ髪型じゃない。
┳⊂ ) \__________
[[[[|凵ノ⊃
◎U□◎ =3 キコキコキコ
0965デフォルトの名無しさん
NGNG(´д`) <そうね奥さん
0966デフォルトの名無しさん
NGNG0967デフォルトの名無しさん
NGNGそろそろこちらもたてんといかんな
0968デフォルトの名無しさん
NGNG0969デフォルトの名無しさん
NGNG過去ログ、参考、関連スレは>>2-10あたり
0970デフォルトの名無しさん
NGNGhttp://www.boost.org/
STLport
http://www.stlport.org/
とりあえずこんだけ
過去ログ
Part1
http://piza.2ch.net/tech/kako/980/980175292.html
Part3
http://pc.2ch.net/test/read.cgi/tech/1003832761/
Part4
http://pc.2ch.net/test/read.cgi/tech/1009071535/
Part5
http://pc.2ch.net/test/read.cgi/tech/1014217496/
0971デフォルトの名無しさん
NGNGWin32API 質問箱 Build3
http://pc.2ch.net/test/read.cgi/tech/1017072275/
Windows Programing for C/C++(Not MFC)
http://pc.2ch.net/test/read.cgi/tech/1018239290/
0972デフォルトの名無しさん
NGNG0973デフォルトの名無しさん
NGNG| >>972 立てようとした、その心意気や良し!
\
 ̄∨ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧
( ´Д`)
/⌒ ⌒ヽ
/_/| へ \
(ぃ9 ./ / \ \.∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ ./ ヽ ( ´Д` )< 後は任せろ!(漏れ以外の誰かに)
( / ∪ , / \_______________
\ .\\ (ぃ9 | ビシッ!!
.\ .\\ / / ,、
> ) ) ./ ∧_二∃
/ // ./  ̄ ̄ ヽ
/ / / ._/ /~ ̄ ̄/ /
/ / / )⌒ _ ノ / ./
( ヽ ヽ | / ( ヽ、
\__つ).し \__つ
0974デフォルトの名無しさん
NGNG| |i _∧ゝ ノ まさか10分以上前に立ってたとは・・・。
ノ ノ;´Д`) /
( ノ ソ
ヽ ヽ
\ \
\ \
_ / .\ _
/ミ (⌒Y. / ̄.\ .\ ミヽ
 ̄ \ ,_ _,/ \,_ _,ノ ̄
0975デフォルトの名無しさん
NGNGff | }!、,、〃 / ″ハズカシー!!
,リ/ .ノ*´jコ`)'〃
{{ { ′ v' 《
ヾ.\. \ヾ
_,,二、》 ; \. 三,_
(( ゙ー=、`″〃 \. \-‐' ,))
゙ー=″ ゙' 一'
0976デフォルトの名無しさん
NGNG| 今漏れに出来ることは、
\
 ̄∨ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧
( ´Д`)
/⌒ ⌒ヽ
/_/| へ \
(ぃ9 ./ / \ \.∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ ./ ヽ ( ´Д` )< ナビゲート!!
( / ∪ , / \_______
\ .\\ (ぃ9 | ビシッ!!
.\ .\\ / / ,、
> ) ) ./ ∧_二∃
/ // ./  ̄ ̄ ヽ
/ / / ._/ /~ ̄ ̄/ /
/ / / )⌒ _ ノ / ./
( ヽ ヽ | / ( ヽ、
\__つ).し \__つ
C++相談室 part6
http://pc.2ch.net/test/read.cgi/tech/1018454705/
0977デフォルトの名無しさん
NGNGワラタ
ていうかsageでナビゲト(・∀・)イイ!
0978デフォルトの名無しさん
NGNG0979デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1018454705/
0980980
NGNG0981v(^・^)v
NGNG0982v(^.^)v
NGNG0983Σ(´Д`ズガーン
NGNG0984Σ(゚Д゚) ズガーン
NGNG0985(´・ω・`) ショボーン
NGNG0986( ´・∀・`)へー
NGNG0987(・∀・) イイ!!
NGNG0988(゚∀゚ ) アヒャ!!
NGNG0989(゚ε゚) キニシナイ!!
NGNG0990990ゲット
NGNG|_|Д゚)
|文|⊂)
| ̄|∧| 990ゲット
0991(゚д゚) ウマー
NGNG0992(;´Д`)ハァハァ
NGNG0993(´-`).。oO(・・・
NGNG0994( -_-)=○)'Д')
NGNG0995( ゚Д゚) フー
NGNG/( へ)へ
0996デフォルトの名無しさん
NGNG<(゚ω゚) <うっ!
( )\
/'>
0997デフォルトの名無しさん
NGNG(゚ω゚)> <はっ!
/( )
<'\
0998デフォルトの名無しさん
NGNG<(゚ω゚)> <うっ!
( )
/'>
0999デフォルトの名無しさん
NGNG1000デフォルトの名無しさん
NGNG10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。