C++相談室 part7
■ このスレッドは過去ログ倉庫に格納されています
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デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています