■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part19
251 名前:デフォルトの名無しさん :03/05/15 23:32
C++の質問じゃない。

252 名前:429 :03/05/15 23:34
>>250
レスしてんじゃねーよ

253 名前:デフォルトの名無しさん :03/05/16 01:16
最近未来からの書き込みが多いのは何故?

254 名前:デフォルトの名無しさん :03/05/16 02:05
勉強はじめて 約5時間ですが・・・

#include<iostream.h>
int main()
{
int i;
cout<<"表示する回数を指定してください"<<endl;
cin>>i;
if(i==0){
cout<<"0回はできません"<<endl;
}
else
cout<<i<<"回表示を行います。"<<endl;

do{
cout<<"猫ふんじゃった "<<i<<"回目"<<endl;
--i;
}while(i);
return 0;
}

まだ 自分で考えてこれぐらいしかできません・・・
こんな調子でほんとにいいんでしょうか?・・・
(;´Д`)誰か漏れに光を・・・あとできれば、もっと綺麗に短く書くとどうなるか教えてください。
おながいします・・・・゚・(つД`)・゚・

255 名前:デフォルトの名無しさん :03/05/16 02:09
>>254
いいんじゃないすか?
強いて言えば

#include <iostream>
using namespace std;

とか


256 名前:デフォルトの名無しさん :03/05/16 02:15
いいんでない?
ifブロックに{}つかるなら、else以下にもつけとうたほうが
統一されててよいかな。


257 名前:254 :03/05/16 02:19
>>255、256さん

アドバイスありがとん・・・
using namespace std; がまだなにか解りませんが、
ググってきまつ!(`・ω・´)シャキーン

258 名前:デフォルトの名無しさん :03/05/16 02:26

int foo(){ return 0; }

void function()
{
return (void)foo();
}

これはC++的にOKですか? 
gcc,VC++.NETではコンパイルが通るのを確認済み。(VC6は通らないはず)

259 名前:254 :03/05/16 02:27
(´・ω・`)ショボーン・・・
漏れの書いたやつ 8行目にreturn 0;入れてないから
だめでつたね・・・今気がつきました。
でも、がんがります!(`・ω・´)連続カキコスマソ・・・

260 名前:デフォルトの名無しさん :03/05/16 02:31
>>258 6.6.3 -3-

261 名前:デフォルトの名無しさん :03/05/16 08:56
>>258
最近のvoidは「型なし」→「なんでも型」の解釈だっけ?

262 名前:デフォルトの名無しさん :03/05/16 09:07
voidにキャストするとキャストされたものが無効になるんじゃないの?

263 名前:デフォルトの名無しさん :03/05/16 09:12
>>261
んなわけねぇだろ

264 名前:デフォルトの名無しさん :03/05/16 09:14
どんな型でも指せるvoid *と勘違いしているんじゃないの。

265 名前:デフォルトの名無しさん :03/05/16 11:03
C言語の質問かもしれませんが、お願いします。
テンプレートで、使うときにポインタを定義して、実態用のメモリを確保しようと思います。
sizeofすると、ポインタ自体の大きさしか分からないんですが、
ポインタから実態の1個分の大きさって取ったりできますか?

266 名前:デフォルトの名無しさん :03/05/16 11:08
double *dp

sizeof(*dp)==sizeof(double)

267 名前:265 :03/05/16 11:13
thanx!>>266

それを使って移動平均ライブラリをC++で作ってみようかとおもいます。
どっかに落ちてたらダウソしたいな。

268 名前:デフォルトの名無しさん :03/05/16 11:38
DLLの動的読み込みで、DLL側にクラスの定義をしておいて、そのクラスを
読み込み側で使おうと思うのですが、
---DLL---
class CA{};
CA* create(){return new CA;}
---main--
template<typename T>void mainside_creater(T* pt){
}
void main(void){
mainside_creater(create());
}
とするとTにはクラスの型情報が入るんでしょうか?

269 名前:デフォルトの名無しさん :03/05/16 11:53
int a;
typeof(a) b;⇒int b;
のようになるtypeofって作れるんですかね??
どうやっても思いつかないんですが。

270 名前:デフォルトの名無しさん :03/05/16 12:32
便利なのでvoid型のポインタを返す関数を
自作して、受け取り側でキャストしてるんですが、
こういう使い方って、なんか問題あったりします?

271 名前:デフォルトの名無しさん :03/05/16 12:38
>>270
ANSI Cよりも昔のC言語のやりかただなそれ。
せっかくの型付けを捨てるのはもったいない。

272 名前:デフォルトの名無しさん :03/05/16 15:00
正直、C++でもprintf系の書式指定が手放せない。
まあfstreamなんかだと仕方なくマニピュレータ使ってるけど。
みんなはどうしてる?
聞かせて、エロい人!!


273 名前:デフォルトの名無しさん :03/05/16 15:42
boost::any

274 名前:デフォルトの名無しさん :03/05/16 15:43
マニピュレータで浮動小数点の桁指定とかスペースのパディングとか
効率よくきっちり書く方法がいまいちわからんので sprintf

275 名前:デフォルトの名無しさん :03/05/16 15:47
boost::format

276 名前:デフォルトの名無しさん :03/05/16 17:14
ttp://www.kmonos.net/alang/boost/classes/format.html
ttp://boost.cppll.jp/HEAD/libs/format/index.htm


277 名前:デフォルトの名無しさん :03/05/16 18:05
>>269
.演算子でtypedefメンバにアクセスできれば良いんだけどねえ。

278 名前:デフォルトの名無しさん :03/05/16 19:43
>>169
templateとかつかうと
template< class T > void foo( T v ) {
    T b;
} とか、できるでしょ?

そんでもって、
int a;
foo( a );
とかってやったらええやん。


279 名前:デフォルトの名無しさん :03/05/16 19:59
>>278
fooを呼び出した関数でTを取得したいんだろ。
template <typename T> struct hage{typedef T type;};
template <typename T> hage<T> foo(T){return hage<T>();}
...
int a;
foo(a).type b;//エラー

280 名前:デフォルトの名無しさん :03/05/16 21:57
そいや、最新のclはtypeofサポートしてるのん?

281 名前:デフォルトの名無しさん :03/05/17 00:40
インスタンスにはメンバ関数の本体も丸々含まれるの?
それとも本体はあくまでクラス定義のところにのみあるのであって、
インスタンスが持ってるのは単に関数ポインタみたいなものなのかな。

キシュツっぽいのでsageときますが。

282 名前:デフォルトの名無しさん :03/05/17 00:45
含まれない。
インスタンスのthisポインタが関数に暗黙的に渡される
int Hoge::foo(int a)
{
}
は実は
int foo(Hoge* this,int a)
{
}
内部では↑に近いことになってる


でいいんだっけ?


283 名前:デフォルトの名無しさん :03/05/17 01:39
typedef boost::shared_ptr<Hoge> HogePtr;
typedef std::vector<MoejpResPtr> HogePtrArray;

class HogeManager
{
private:
 HogePtrArray hoges_;
public:
 void Foo()
 {
  //処理色々
 }
 ・
 ・


 <A>
 void Add(HogePtr hoge)
 {
  hoges_.push_back(hoge);
 }

 <B>
 void Add(const HogePtr &hoge)
 {
  hoges_.push_back(hoge);
 }
};

上記のような状況の時hoges_に要素を追加するメソッドを作りたい時
<A>と<B>どちらがより良い方法ですか?
AでもBでも参照カウントが壊れる事はないですか?

284 名前:デフォルトの名無しさん :03/05/17 01:47
すいません
typedef std::vector<MoejpResPtr> HogePtrArray;

typedef std::vector<HogePtr> HogePtrArray;
に置き換えて下さい…

285 名前:デフォルトの名無しさん :03/05/17 01:52
>>283 <B>のほうが効率がいい。どっちでも参照カウンタは壊れない。

286 名前:デフォルトの名無しさん :03/05/17 01:54
>>285
ありがとうございました。

287 名前:デフォルトの名無しさん :03/05/17 03:25
class CHoge
{
protected:
static std::set<CHoge*> s_hoges;

public:
CHoge();
~CHoge();
};

--------------
static std::set<CHoge*> CHoge::s_hoges;

CHoge::CHoge()
{
s_hoges.insert(this);
}

CHoge::~CHoge()
{
s_hoges.erase(this);
}

こういう風にして自分のインスタンスの一覧を管理してるプログラムがあるんですが、
CHogeのオブジェクトがグローバル変数だった場合、プログラム終了時に、CHogeの
インスタンスよりもs_hogesの方が先に消滅してしまうらしく、CHogeのデストラクタ
でアクセスエラーが発生します。どうすりゃええのですか

288 名前:デフォルトの名無しさん :03/05/17 03:55
>>254
endl の正体を調べてみ。けっこう勉強になると思うよ。
// 混乱するかもしらんが

289 名前:デフォルトの名無しさん :03/05/17 08:00
>>287
Modern C++ Design 読んでフェニックスシングルトンだ。

ただしその前に一時間ほど
> CHogeのオブジェクトがグローバル変数
にならないように設計を考えれ。

290 名前:デフォルトの名無しさん :03/05/17 10:13
>>289
Modern C++ Designですか、読んで見ます

>> CHogeのオブジェクトがグローバル変数
>にならないように設計を考えれ。

グローバル変数にしなくても、例えばアプリケーションクラスg_Appのメンバにしても同じことが起こってしまうのです

291 名前:デフォルトの名無しさん :03/05/17 10:15
最近CからC++に移行を初めて疑問があります。
「クラスの継承をいつ使うか」です。
制限がきつい気がします。で、聞きたいことは
「みなさんは、どんなところで継承を使ってますか?」です。
継承の有効利用法を教えてください。
ちなみに僕は使ってません!!


292 名前:デフォルトの名無しさん :03/05/17 10:28
実装の継承とインターフェースの継承の区別が付いていれば、
使っても使わなくてもいいんじゃないかしら。

293 名前:デフォルトの名無しさん :03/05/17 10:30
Is-Aの関係でなくても、Has-Aの関係にできることも多いから悩みどころだな

294 名前:r :03/05/17 11:35
>>291
制限って何?


漏れは
オブジェクト間にis-a関係があるときにつかってるが。

295 名前:デフォルトの名無しさん :03/05/17 11:56
http://jbbs.shitaraba.com/computer/6328/

296 名前:デフォルトの名無しさん :03/05/17 12:06
Is-A = Has-a+インターフェースの継承+delegate
だからなあ。
判断において最も重要なのは、インターフェースの継承が必然かどうか、だろうね。
そうでない場合は、たいがい不要。

どんな言語でもそうだけど、実際のコードでは
言語仕様上仕方なく行うトリックのための継承(&その他)と、
オブジェクト指向的な意味での継承とが
入り混じってるから、初心者は戸惑うだろうねえ。

297 名前:デフォルトの名無しさん :03/05/17 12:10
でもC++でdelegateを手軽にやろうと思ったら継承するしかないんだよぉぉぉおお

298 名前:デフォルトの名無しさん :03/05/17 12:20
delegateって関数ポインタじゃねーの?

299 名前:デフォルトの名無しさん :03/05/17 12:34
C++デラゲーツならマクロやテンプレートが使えそう。

300 名前:デフォルトの名無しさん :03/05/17 12:43
>>298
正確にはインスタンス+関数ポインタ。
あと、マルチキャストの機能も含まれている。

301 名前:デフォルトの名無しさん :03/05/17 12:54
>>300
それは余計だな。

302 名前:デフォルトの名無しさん :03/05/17 16:50
ttp://www.kmonos.net/alang/boost/classes/function.html
ttp://www.kmonos.net/alang/boost/classes/bind.html


303 名前:デフォルトの名無しさん :03/05/17 17:15
boost::functionにthisポインタをbindしろって事?

304 名前:デフォルトの名無しさん :03/05/17 17:16
BCBには__closureっていうのがあるけどね。
つーか検索たら出てくるね。
http://www.tietew.jp/cppll/archive/4813

305 名前:デフォルトの名無しさん :03/05/17 19:34
そういう事やりたいんだったらもうC++使わない方がいいと思う

306 名前:デフォルトの名無しさん :03/05/17 19:34
namespace XXX{
int a;
.....
}

こんな感じで変数の定義ってnamespaceの
中にいれたりしますか?
とすると、このnamespaceをヘッダファイルにして
あちこちのファイルでインクルードするとまずいんですよね?
ど〜すんでしょ。関数なら宣言と定義わけたりするんですよね。
あとconstなんかも大丈夫なんですよね。ひょっとしてextern?



307 名前:デフォルトの名無しさん :03/05/17 19:59
何言うとるんじゃジジイ

308 名前:デフォルトの名無しさん :03/05/17 20:20

CString型インスタンス内にある文字列のポインタを取得するには
GetBuffer()を使う以外の方法は無いんでしょうか?

あとMFCのリファレンスには、GetBuffer(void)の事が書いてないんですが
これってあまり使うべきでない(推奨されない)という事なんでしょうか?
教えてください。

309 名前:デフォルトの名無しさん :03/05/17 20:25
訂正

CString型インスタンス内にある文字列の先頭アドレスを取得するには
GetBuffer()を使う以外の方法は無いんでしょうか?

あとMFCのリファレンスには、GetBuffer(void)の事が書いてないんですが
これってあまり使うべきでない(推奨されない)という事なんでしょうか?
教えてください。

310 名前:デフォルトの名無しさん :03/05/17 20:28
CString s;
const char *p=s;//OK

311 名前:デフォルトの名無しさん :03/05/17 20:51
VC++って最新バージョンは6なの?


312 名前:デフォルトの名無しさん :03/05/17 21:07
7.1(VS2003)

313 名前:デフォルトの名無しさん :03/05/17 21:37
Cをマスターしたいんですけどなにからすればいいのでしょうか?

314 名前:デフォルトの名無しさん :03/05/17 21:54
>>313
2chを卒業してください

315 名前:デフォルトの名無しさん :03/05/17 21:55
>>313のようなつまらんネタを書かないことからはじめよう


316 名前:デフォルトの名無しさん :03/05/17 22:05
>>310
どうもありがとうございます。
CStringのインスタンス自体は、ただのポインタ変数だったのですか。

もう一つ教えてください。
CStringは、CStringT からインスタンシエートされたクラスなんですか?
だとしたら、どのヘッダファイルの中で typedef されているのでしょうか?

度々すみません。教えてください。

317 名前:紺野あさみ :03/05/17 22:06
  ∋8ノノハ.∩   http://togoshi.ginza.st/konno/
   川o・-・)ノ <先生!こんなのがありました!
http://www.togoshi.ginza.st/konno/kono01.html
http://togoshi.ginza.st/konno/kono04.html
http://www.togoshi.ginza.st/konno/kono10.html
http://togoshi.ginza.st/konno/kono07.html
http://www.togoshi.ginza.st/konno/kono08.html
http://togoshi.ginza.st/konno/kono05.html
http://www.togoshi.ginza.st/konno/kono03.html
http://togoshi.ginza.st/konno/kono06.html
http://www.togoshi.ginza.st/konno/kono02.html
http://togoshi.ginza.st/konno/konno09.html

318 名前:デフォルトの名無しさん :03/05/17 22:18
>>316
暗黙の型変換について調べたほうがいいよ

319 名前:デフォルトの名無しさん :03/05/17 22:23
int num[3];
のとき、
num[0] = 0;
num[1] = 0;
num[2] = 0;
のように、
配列にすべて0を代入する関数って、標準関数にありますでしょうか。
どなたか教えてください。

320 名前:デフォルトの名無しさん :03/05/17 22:25
int num[3];
のとき、
num[0] = 0;
num[1] = 0;
num[2] = 0;
のように、
配列にすべて0を代入する関数って、標準関数にありますでしょうか。
どなたか教えてください。

321 名前:デフォルトの名無しさん :03/05/17 22:29
>>319
>>320
ない。というかいらない

322 名前:デフォルトの名無しさん :03/05/17 22:30
あ、memsetか

323 名前:デフォルトの名無しさん :03/05/17 22:32
std::fill

324 名前:デフォルトの名無しさん :03/05/17 22:38
std::fill_n

325 名前:デフォルトの名無しさん :03/05/17 23:15
int num[3] = { 0 };

326 名前:デフォルトの名無しさん :03/05/17 23:56
             /ヽ       /ヽ
            / ヽ      / ヽ
  ______ /U ヽ___/  ヽ
  | ____ /   U    :::::::::::U:\
  | |       // ___   \  ::::::::::::::|
  | |       |  |   |     U :::::::::::::|
  | |      .|U |   |      ::::::U::::|   >>325以外吊っとけよ…
  | |       | ├―-┤ U.....:::::::::::::::::::/
  | |____ ヽ     .....:::::::::::::::::::::::<
  └___/ ̄ ̄      :::::::::::::::::::::::::|
  |\    |           :::::::::::::::::::::::|
  \ \  \___      ::::::

327 名前:デフォルトの名無しさん :03/05/18 00:00
>>326 ハァ?
代入と初期化は異なる演算だとあれほど・・・・

328 名前:デフォルトの名無しさん :03/05/18 00:06
てか、なんで標準関数でやろうとしてんの?

329 名前:デフォルトの名無しさん :03/05/18 00:20
>>328
代入ごときにfor使うのか?

330 名前:デフォルトの名無しさん :03/05/18 00:30
class T型を newして、
引数のクラスに、追加した関数テンプレートを作りたいのですが
どう作ればいいでしょうか

template<class T>
T* MakeTask(CTaskMgr& task,DWORD ID)
{
T* p = new T;
task.add(p);
..省略..
return p;
}

みたいな感じにしたいのですが、
引数にT型がわかる者がないので、上手くいきません。
テンプレートクラス
template<class T> class TaskBuilder{
static T* Make(CTaskMgr& task,DWORD ID);
};
// TaskBuilder<CTask>::Make(task,id); で使う。
で、静的関数やfriend関数にしても 上手くいかないです。


何か方法ありませんか?



331 名前:デフォルトの名無しさん :03/05/18 00:33

何故、CString 型変数を const char* 型変数へ代入する事が出来るのか
どうしても分かりません。
どういう原理で、CString 型が LPCSTR と同等と見なされるのですか?

誰か教えてください。

332 名前:デフォルトの名無しさん :03/05/18 00:36
>>330
「上手くいかない」じゃわからないよ。

333 名前:デフォルトの名無しさん :03/05/18 00:37
>>331
CString::operator LPCTSTR

334 名前:デフォルトの名無しさん :03/05/18 00:39
>>330
p=MakeTask<ClassName>(task,id);

335 名前:デフォルトの名無しさん :03/05/18 00:50
>>308,309,316,331
VisualC++(MFC限定)相談室へいってらっしゃい

336 名前:デフォルトの名無しさん :03/05/18 01:07
>>330
こういうことがしたいの?

class CTask { ... };
class CTaskA : public CTask { ... };
class CTaskB : public CTask { ... };
class CTaskC : public CTask { ... };

class CTaskMgr {
private:
 list<CTask*> task_list;
public:
 template <typename T>
 T* add() {
  T* p = new T;
  task_list.push_back(p);
  return p;
 }
 ...
};

CTaskMgr task;
task.add<CTaskA>();
task.add<CTaskC>();
task.add<CTaskB>();

337 名前:デフォルトの名無しさん :03/05/18 01:08
なんか見た事あるぞそれ。

338 名前:デフォルトの名無しさん :03/05/18 02:31
for(int i = 0; int let = tolower(str[i]); ++i) ...
switch(int key = ...) ...
if(FILE* fp = fopen(...)) ...
...

とか使いますか?

339 名前:デフォルトの名無しさん :03/05/18 02:34
うん

340 名前:330 :03/05/18 03:13
>>332
エラーが出るって意味です。
error LNK2001: 外部シンボル "
"void __cdecl MakeTask(class CTaskMgr &,unsigned long)" (?Make@@YAXAAVCTaskMgr@@K@Z)" は未解決です
みたいな感じです。

>>334
それも、やってみたけど、だめでした。

>>336
試してみたのですが
error C2275: 'CTaskA' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
みたいなエラーが出てしまいます。
->なんて使って無いのに。


環境は、VC++6.0です。Boostでも、理不尽なエラー出るし、無理なのかな。

もうすこし、いろいろと試して見ます。


341 名前:デフォルトの名無しさん :03/05/18 03:17
>>340

template <class T>
struct dummy{};

temp,ate <class T>
T *make(dummty<T>){ return new T; }


make(dummty<ClassName>());

342 名前:330 == 340 :03/05/18 03:26
あ・・・

関数実体を、ヘッダに書かずに、cppに書いてた。
テンプレートの初歩ミスでした。

 (´Д`;) ゴメンナサイゴメンナサイ
   ∨)
   ((

 (;´Д`)  スミマセンスミマセン
 (  八)
   〉 〉


 (´Д`;)、  コノトオリデス
   ノノZ乙


343 名前:デフォルトの名無しさん :03/05/18 03:28
ぬるぽ

344 名前:デフォルトの名無しさん :03/05/18 03:33
>>343
ガッ

345 名前:デフォルトの名無しさん :03/05/18 09:10
>>338
それって、新しく定義した変数の値が評価されることになるの?

346 名前:デフォルトの名無しさん :03/05/18 12:22
ちょっと異常な質問なんですが、関数ポインタ型の変数を定義するとき
普通は例えば

typedef int (*FC)(int, int);
FC p;

のようにすると思いますが、これをtypedef使わずに一行で定義する
となると、どういう書式になるのでしょうか?

347 名前:デフォルトの名無しさん :03/05/18 12:31
質問です。

表示中のメニューの座標(画面の左上端を(0,0)とする)を
取得するには、どうしたら良いでしょうか?

CMenu::GetMenuInfo で試みようとしましたが、
それでは座標が所得出来ないので。

348 名前:デフォルトの名無しさん :03/05/18 12:33
>>347
板違いじゃねぇの?

349 名前:デフォルトの名無しさん :03/05/18 12:36
>>346
int (*p)(int, int);

350 名前:デフォルトの名無しさん :03/05/18 12:37
板は合ってる

351 名前:デフォルトの名無しさん :03/05/18 12:37
>>346
int (*p)(int, int);

つーか、typedef で新しく定義する型名が入る位置
→ typedef int (*ここ)(int, int);
は、直接変数宣言するときに変数名が入る位置。

352 名前:346 :03/05/18 12:44
あ・・・スマソ
質問間違えた。さっきの質問じゃたしかに答え簡単ですよね・・・。
でなくてですね・・・

typedef int (*FC)(int, int);
FC func(FC);   //関数宣言

これをtypedefなしの一行で・・・。





353 名前:デフォルトの名無しさん :03/05/18 12:48
int (* (*)(int (*)(int,int)))(int,int)

354 名前:346 :03/05/18 12:52
funcが無い時点でおかしいような・・・

355 名前:デフォルトの名無しさん :03/05/18 12:55
すまんこうか。
int (*func(int(*)(int, int)))(int, int);

356 名前:デフォルトの名無しさん :03/05/18 13:24
>>352
func(引数) という式の値は int ( *FC )(int, int) という型。
 → ゆえに int ( *func(引数) )(int, int);
引数は int (*)(int,int) 型
 → 従って int ( *func( int(*)(int,int) )(int, int);

357 名前:356 :03/05/18 13:25
いかん、括弧が1個足りん。

358 名前:デフォルトの名無しさん :03/05/18 14:57
初心者の質問ですがお許しください。
int a;
char b;
cin >> a; cin >> b;
上記で、入力された値が期待された以外のもの、つまりaに整数以外の文字が
入力されたり、bに数字や2文字以上の文字列が入力された場合のエラー処理は
どう書けばよいでしょうか?

359 名前:デフォルトの名無しさん :03/05/18 15:00
cin >> a;
if (cin.fail()) {
 入力がおかしい
}

360 名前:デフォルトの名無しさん :03/05/18 15:56
template <class _T>
class CHogeImpl
{
...
}

class CHoge : public CHogeImpl <CHoge>
{
...
}

こういうのって、どういう意味合いのテクニックを
あらわしているんでしょうか?

361 名前:デフォルトの名無しさん :03/05/18 16:38
>>360
http://www.google.co.jp/search?q=curiously+recursive+template+pattern
http://www.fides.dti.ne.jp/~oka-t/cpplab-selfref-template.html

class T に、T用の(メンバ)関数やtypedefを外から
付け加えるようなテンプレートを書きたいときに使う。

362 名前:346 :03/05/18 19:29
>>355->>357
サンクス。
なんとなくわかった気が。

typedef int (*FC)(int, int);

の式でFCの部分をfunc(引数)で置き換えて、typedef取ればいいのかな?

int (*func(引数))(int, int);

さらに引数も置き換えて

int (*func(int (*)(int, int)))(int, int);

で、もし仮引数名(pとする)もつけるとすると

int (*func(int (*p)(int, int)))(int, int);

ってことでいいのかな?




363 名前:デフォルトの名無しさん :03/05/18 19:31
C/C++の関数ポインタの記述ルールはなんかおかしいからな
素直にtypedefが一番

364 名前:デフォルトの名無しさん :03/05/18 23:42
ライブラリファイルとして使うときとか、公開するときとかって
ヘッダファイルどうやってまとめればいいの?

365 名前:デフォルトの名無しさん :03/05/18 23:43
libファイルにして、、、だった。

366 名前:デフォルトの名無しさん :03/05/18 23:54
インターフェースを超洗練してまとめろよ。

367 名前:デフォルトの名無しさん :03/05/19 02:09
(;´Д`)スミマセン、スミマセン・・・C++デ 二乗(べき乗)って
ドウヤルンデスカ? ヘルプミテモミツケレマセン・・・
・゚・(つД`)・゚・ツリジャアリマセン・・・タシケテクダサイ・・・

368 名前:デフォルトの名無しさん :03/05/19 02:15
y = x * x; /* xの二乗 */

y = pow(x, 2.0); /* xの二乗 */


369 名前:デフォルトの名無しさん :03/05/19 02:42
#include <iostream>
template <int i,int n>
struct static_pow{
    enum{
        tmp=((n==0)?0:i),
        tmp2=((n==0)?0:n-1),
        tmp3=((n==0)?1:i),
        value=static_pow<tmp,tmp2>::value*tmp3        
    };
};
struct static_pow<0,0>{
    enum{
        tmp=0,
        tmp2=0,
        tmp3=0,
        value=1
    };
};
int main(int argc, char* argv[])
{
    int a[static_pow<2,3>::value];
    std::cout << sizeof(a)/sizeof(a[0])<<std::endl;
    return 0;
}


370 名前:367 :03/05/19 03:06
(;´Д`)スミマセン、スミマセン・・・モイチド、オナジソースカキナオシタラ
コンパイラトオリマシタ・・・ドコカニゼンカクスペースデモハイッテタノデソウカ・・・
・゚・(つД`)・゚・オテスウカケマシタ・・・>>368,369サソアリガトン・・・

371 名前:デフォルトの名無しさん :03/05/19 03:53
>>370
よみづらい

372 名前:デフォルトの名無しさん :03/05/19 14:21
>>319
はじめて見た。感動した。

373 名前:デフォルトの名無しさん :03/05/19 16:36
>>372
それは何より。

374 名前:デフォルトの名無しさん :03/05/19 19:51
そういやC++って配列は無条件で初期値に初期化されるんだっけ?
newのときだっけ?(なんかごっちゃになる)
Cだと定義スコープによるんだよね、たしか。

375 名前:デフォルトの名無しさん :03/05/19 21:34
>>374
デフォルトコンストラクタは呼ばれるけど、
int とかだと「何もしない」んで値は未定。

ただ、変数が静的だと 0 で初期化される。
これは C と同じ。

あと、1 つでも初期化したら後ろは全部 0 で初期化される。
だから、
 int vec[100] = { 0 };
ってやったら全部 0 で初期化される。
これも C と同じ。

int new したときは fill_n でも使って代入汁。

376 名前:デフォルトの名無しさん :03/05/19 22:11
静的じゃないけど
main()
{
map<string, int> test;
test["abc"]++;
cout << test["abc"] << endl;
}
で1が出力されるよ。

377 名前:デフォルトの名無しさん :03/05/19 23:05
>>376
map の場合はintのデフォルトコンストラクタ呼ぶ(と言うと正確では無いか
もしれんが要は0で初期化)でしょ。

ただ、VC++ だと、Release モードだと0 に初期化してくれるけど、Debug モー
ドだとしてくれないとかあるっぽいんだよね。

で、余談だけど、前の開発者がヴァカで Debug モードを全然使っていなかった
らしく、全然初期化してない変数がいっぱいあって、Debug モードだと実行出
来ないっちゅー悲惨なコードの保守を任されてヒーヒー言った経験あり。
# これがまたクソコードで・・・と、愚痴はやめときます。ハイ。

378 名前:377 :03/05/19 23:07
第二段落の目的語は「普通のintとかの変数」ね。
つまり、クラスのメンバーに int の変数持ってる場合、
Release モードだとそのメンバーがゼロで勝手に初期化される事もあって、
それによりかかったコードがバラ撒かれてて悲惨な目に合った、と。そういう意味です。

379 名前:デフォルトの名無しさん :03/05/19 23:19
>>377
へー、ちなみに何の開発が仕事で?

380 名前:デフォルトの名無しさん :03/05/19 23:23
おれゲーム作ってるんだけど、Debugでコンパイルするとスゲー重い。

しょうがないからずっとRelease。 文句在るのか?

381 名前:デフォルトの名無しさん :03/05/19 23:27
>>380
Pentium200ぐらいですか

382 名前:デフォルトの名無しさん :03/05/19 23:31
>>381
400ぐらいです。

383 名前:デフォルトの名無しさん :03/05/19 23:39
staticメンバ関数ってinline化されないよね?

staticメンバだけの関数をDLLから使うにはどうしたらええの?

384 名前:デフォルトの名無しさん :03/05/19 23:41
> staticメンバ関数ってinline化されないよね?

されますが。

385 名前:377 :03/05/19 23:45
>>379
とある科学計算に使うようなソフトの一部なんだけどね。
オブジェクトのコピーを memcpy 使ってたり、とにかく悲惨なコードで、
deleteを知らんらしくメモリリークもしまくりで、さらには継承、っちゅー
かそれ以前にモジュール化も知らんのかなんなのか同じコードのコピペが至る
所に撒き散らされてて・・・(以下略

386 名前:デフォルトの名無しさん :03/05/19 23:48
> staticメンバだけの関数
関数がメンバ持ってるの?

387 名前:デフォルトの名無しさん :03/05/20 00:35
>>384
勝手に?指定しなきゃいけないよね?
>>386
ごめんstaticメンバだけのクラス。

388 名前:デフォルトの名無しさん :03/05/20 00:44
みなさん、リストを作るときって、
*prevや*nextはpublicにします?protectedにします?

389 名前:デフォルトの名無しさん :03/05/20 00:49
使い道が決まるまではprivate

390 名前:デフォルトの名無しさん :03/05/20 00:55
>>388
双方向ならstd::listで確定。

391 名前:デフォルトの名無しさん :03/05/20 00:58
>>387
コンパイルオプションによっては自動的にインライン展開されるかもしれないが、
DLLとしてエクスポートする指定がコンパイラに伝えることができるなら、
非インラインの実体も残るはず。
伝えることができないなら、DLLの作成に失敗する(たぶんリンクエラーになる)はず。

392 名前:デフォルトの名無しさん :03/05/20 20:34
GCC 3.2.2 なんですけど、
struct A {
 int a; A() { }
};
struct B {
 int b; B() : b() { }
};
int main()
{
 cout << A().a << endl; // 無茶苦茶な値
 cout << B().b << endl; // 0
 int * p = new int;
 cout << *p << endl; // 無茶苦茶な値
 delete p;
 p = new int[1];
 cout << p[0] << endl; // 無茶苦茶な値
 delete [] p;
 p = new int();
 cout << *q << endl; // 0
 delete p;
}
ってなりました。
初期化子入れないとデフォルトコンストラクタが呼ばれる、
と思ってたけど、実際にデフォルトコンストラクタを指定すると挙動が違うんですね。
これって、int とかだと明示的に指定しないと
デフォルトコンストラクタが呼ばれないという仕様なんでしょうか?

393 名前:デフォルトの名無しさん :03/05/20 20:53
>>392
intとかの基本データ型は明示的にコンストラクタを呼ぶと0初期化になるが
呼ばないと不定なのは規格通り

394 名前:392 :03/05/20 21:21
なるほど。やっぱそうなんですね。
ありがとうございました。

395 名前:デフォルトの名無しさん :03/05/21 01:29
  ∧_∧
 ( ´∀`)<この使い方間違ってるんでしょうか

std::stringstream ss1, ss2;
while(std::getline(ss1, ss2.str(), '\n')); ←コンパイルエラー

error C2180: 制御式に void 型があります。
)

396 名前:デフォルトの名無しさん :03/05/21 01:50
getlineの格納先は非const参照なので、左辺値を渡さないとダメです。
ss.str()は一時オブジェクトで、左辺値になれません。

> error C2180: 制御式に void 型があります。
エラーメッセージが全然関係ないのが気になるけど。


397 名前:デフォルトの名無しさん :03/05/21 01:56
>>377
Debugモードだと初期化しないんじゃなくて、メモリを確保した時点で0xCDで
初期化されるんだよ。デバッガで変数やメモリを見れば初期化し忘れている
ことが一目で分かるようになってる。

ちなみに、ビッグエンディアンの環境だと0xDEADBEEFを同様の目的で使って
たりする。

398 名前:395 :03/05/21 02:14
>>396
了解しました。サンクス。

VC5なんだが、stringstreamのヘルプ見たら
basic_string<E, T, A>& str();
なんて書いてあるもんだからつい。
エラーメッセージは結局謎。コンパイルは出来てもよさそうなんだが・

399 名前:デフォルトの名無しさん :03/05/21 12:52
A GetA();

hoge()
{
A& a = GetA();
}

というのは文法的にどうなの?

Aがlongだとコンパイルエラー(long からlong&に型変換出来ない)で、
class A {}; だと警告も出ないんだけど。

400 名前:デフォルトの名無しさん :03/05/21 12:53
環境は、VS.NET2002です。


401 名前:デフォルトの名無しさん :03/05/21 13:18
ライブラリをインクルード可能にするにはどうしたらいいんですか?

402 名前:デフォルトの名無しさん :03/05/21 13:44
>>399
一次オブジェクトへのリファレンスはconstの場合のみ有効。
const A& a = GetA(); ならばok。
constでない場合はコンパイルエラーは出ないかもしれないが、処理が次の
行に移った時点で既にaの指すオブジェクトが無効になっている可能性がある。

気が利くコンパイラはaのスコープが外れるまで一次オブジェクトの寿命を
延ばしてくれるかもしれないが、そのようなプログラムは実装依存になる。

403 名前:r :03/05/21 14:39
>>401
まず、次の言葉の意味を知ること
- インクルード
- リンケージ
- ライブラリ

404 名前:399 :03/05/21 15:40
>>402
オブジェクトの寿命の方は問題ないのですが。
実は、このコードだとスタックが破壊されるんですよ。
前後どっちかに100byte程度のバッファを置いてると分かりますけど。
でも、コンパイル時に警告も出ないのでなんでかな?と思ったわけです。

405 名前:399 :03/05/21 15:43
あ、そういう意味か。
一次→一時ですよね。
なるほど const で試してみます。

406 名前:デフォルトの名無しさん :03/05/21 15:45
クラスの初期化メソッドで質問です。
作成したインスタンスを初期化するために、下のような初期化メソッドを持たせています。

class CSuper {
protected:
 int m_value;
public:
 CSuper();
 ~CSuper();
 void Init(int inValue){m_value = inValue};
};

これのサブクラスを作った場合、追加されたメンバ変数も初期化したいので
class CSub : public CSuper
{
protected:
 int m_value2;
public:
 CSub();
 ~CSub();
 void Init(int inValue, int inValue2) {
  Init(inValue);
  m_value2 = inValue2;
 };
};

こんな風にしています。でもこれだと、CSubを作るときに間違ってCSuperのInit(int inValue)を呼んでしまうかもしれません。どうすればいいですか。InitSuper(), InitSub()とか名前を変えたほうが良いんでしょうか。
どっちにしても間違った初期化関数を呼んでしまう可能性がありますし、美しくない気がします。

407 名前:399 :03/05/21 15:50
駄目だ、やっぱりスタックが破壊される。

408 名前:デフォルトの名無しさん :03/05/21 16:42
>>406
曖昧さの解決にはスコープ解決演算子を使用する。

409 名前:デフォルトの名無しさん :03/05/21 16:47
>>408
CSubのインスタンスに対してCSuper::Init出来てしまうので困っているのです

410 名前:デフォルトの名無しさん :03/05/21 17:01
http://laguz.gaiax.com/home/vb_net
ここに行って勉強しな



411 名前:デフォルトの名無しさん :03/05/21 17:11
>>409
CSub sub;
sub.CSuper::init(0); // コンパイル可能
sub.init(0); // エラー

わざわざ CSuper:: を付けないといけないから、
特に問題は起こらないと思うけどな。

412 名前:デフォルトの名無しさん :03/05/21 17:17
>>411
いや、それはOKなんですよ
でも今回はCSub::Initは引数が二つに増えてるので、CSuper::Initのオーバーライドはして無いんです。

413 名前:デフォルトの名無しさん :03/05/21 17:19
CSub sub;
sub.Init(0);
sub.Init(0, 1);
どっちもOKになるのが困ります

414 名前:デフォルトの名無しさん :03/05/21 17:23
すんません間違えてました
sub.Init(0);はコンパイルエラーになりました
ウワーンハズカシー

ていうか何で?

415 名前:デフォルトの名無しさん :03/05/21 17:25
>>414
おかしいと思った。
基底クラスのメンバ関数はオーバーロードされないの。
あなたの危惧していたことを防ぐためにね。

416 名前:デフォルトの名無しさん :03/05/21 17:39
知らんかった

417 名前:デフォルトの名無しさん :03/05/21 17:48
ここでは使えないほうがいいから関係ないが、
両方使えるようにしたいときはusingで引っ張り込めば良いアルネ

418 名前:デフォルトの名無しさん :03/05/21 19:17
std::stringをstd::wstringに変換するにはどうしたらいいですか?

419 名前:デフォルトの名無しさん :03/05/21 19:33
>>418
こんな感じかな?
テストはしてないけど。

#include <cstdlib>
void convStrToWStr(const std::string& src, std::wstring& dst) {
 const int length = src.length() + 1;
 wchar_t* buf = new char[length];
 std::mbstowcs(buf, src.c_str(), length);
 dst = buf;
 delete [] buf;
}

420 名前:デフォルトの名無しさん :03/05/21 19:56
C++BuilderならこれだけでOK
static std::wstring str2wstr(const std::string &str)
{
return std::wstring(WideString(str.c_str()).c_bstr());
}

421 名前:デフォルトの名無しさん :03/05/21 20:19
>>399
なぜそんなトンチンカンなことをしたがるのか、まずは自分の頭を
デバッグした方がいいかと…

422 名前:デフォルトの名無しさん :03/05/21 20:42
昔のAthlonの本読んでて、C++での最適化法として書いてあったんだけど
コードとデータを双方とも同じ64KB領域に置かないって奴です。
これって具体的にはどういうことなんでしょう?
c++でどう書けばコードとデータが近傍に配置されたり
されなかったりするんでしょうか?

423 名前:377 :03/05/21 21:09
>>397
そうだったんでつか。知りませんでした。勉強になりました。アリガトウ。

でもどーせなら未初期化のメンバー変数がある場合にはワーニング出てくれれ
ばいいんですけどねぇ・・・Wallでも出ないっすよねぇ・・・



424 名前:デフォルトの名無しさん :03/05/21 21:28
Point クラスとか作る時にゃ未初期化でいいもんな。

425 名前:デフォルトの名無しさん :03/05/21 21:48
g++の-Weffc++オプションはウザイくらいに説教してくれたと思う

426 名前:デフォルトの名無しさん :03/05/21 21:52
今俺C++NET インスト中だがインストに必要な時間が1時間20分。
激しく萎えています。 CD-ROMは48倍速だしHDDは最近買った60G(そこそこの速度はある)
いったい何をしているんだこのインストーラー(藁

スタジオ(フルセット)だったらどんぐらいかかるの?




427 名前:デフォルトの名無しさん :03/05/21 22:29
>>423
パフォーマンスの関係でメンバを初期化しないってのはよくある話なので
そんなことでいちいちワーニング出されても困るよ。

>>426
HDDがPIOモードになってたりしない?

428 名前:418とは別の人 :03/05/21 22:29
>>419
逆にwstringをstringにすることってできますか?
char* しか渡せない関数に文字列(wstring)を渡したいのですが・・・

429 名前:418とは別の人 :03/05/21 22:32
ごめん、ぐぐったらあっさり見つかりました。
そのまんまな名前ですね。(wcstombs)

430 名前:419 :03/05/21 23:01
new char → new wchar_t だっね。

431 名前:デフォルトの名無しさん :03/05/21 23:13
今インスト終わりました。
>>427
427さん情報ありがとデバイスまねじゃみたけど、PIOではなかったよ。
でもTHX

21:52-> 23:10 1時間20分
おおよそ時間は正しかったな.....

VC単体(スタンダート)のインストでこれなら フルセットは半日(1日?)かかるなw
実際どうなんだろう。体験者いないかな。




432 名前:デフォルトの名無しさん :03/05/21 23:24
きのこっのこのこげんきのこ
えり〜んぎ まいたけ ぶなしめじ

433 名前:デフォルトの名無しさん :03/05/22 02:34
↑↑↑
ヘキサゴン見たな(w


434 名前:デフォルトの名無しさん :03/05/22 02:44
>>433
つれた

435 名前:デフォルトの名無しさん :03/05/22 03:06
オフィシャルサイト見つけた
( ^3^)/http://homepage3.nifty.com/coco-nut/

436 名前:bloom :03/05/22 03:11
http://homepage.mac.com/ayaya16/

437 名前:デフォルトの名無しさん :03/05/22 04:39
>>434
やっぱりね(w


438 名前:r :03/05/22 11:18
class A{};
class B : public A {};
class C : public A {};

int foo( int i ) {
    // これがうまくいくのに
    A* p2 = i > 1 ? new B() : new A();

    // なんでこれはコンパイルエラーなの?
    A* p1 = i > 1 ? new B() : new C();
}
~

439 名前:デフォルトの名無しさん :03/05/22 11:52
エラーメッセージは何て言ってるんだ?

440 名前:デフォルトの名無しさん :03/05/22 12:03
gccでもエラーになるけど、-pedanticつけると警告だけでエラーにはならなくなる。
-pedanticで甘くなることもあるもんなの?バグ?

441 名前:デフォルトの名無しさん :03/05/22 13:14
正直AとかBとかいうクラス名は読みにくい。いつもちょっと考え込む。
サンプルコードにはそれっぽい名前をつけてほしいにょ。

442 名前:デフォルトの名無しさん :03/05/22 16:26
>>438
クラス B と C の間に直接の継承関係がないから
条件式の結果を何の型にすればいいのか判断できないんじゃないかな。
共通の基底クラスにしてくれればいいもんだけど、
そうするようにはなってないんだろうね。

というわけで、どちらか(または両方)明示的にキャストすれば大丈夫だね。

A* p1 = i > 1 ? static_cast<A*>(new B()) : new C();

443 名前:418とは別の人 :03/05/23 10:03
string<->wstringを正しく変換するにはsetlocaleでロケール設定を正しく行わないとダメなようですね。
プラットフォーム非依存なコードを書くにはどうしたらいいのだろうか。
以下だとMS932限定。

void strtowstr(const std::string& src, std::wstring& dst)
{
setlocale(LC_ALL, ".932");
size_t length = src.length() + 1;
wchar_t* buf = new wchar_t[length];
mbstowcs(buf, src.c_str(), length);
dst = buf;
delete [] buf;
setlocale(LC_ALL, "");
}

444 名前:デフォルトの名無しさん :03/05/23 10:25
codecvt?

445 名前:デフォルトの名無しさん :03/05/23 11:50
fstreamがファイルのクローズに失敗しても例外飛んでこないのですか?
飛んでくるとしたらデストラクタが例外投げることになるし、
飛んでこないとしたら、ディスクがいっぱいになったりしたときにエラーが検知できないし・・・。


446 名前:デフォルトの名無しさん :03/05/23 12:08
>>439 C*からB*にキャストできねーよ!っつってます。
>>441 スマソ。次から。
>>442 ありがと、そか、かたっぽだけでいいのか....
>>440 まじっすか?不思議だ...つか、規格上は許されるべきものだったのか...mmmm。

447 名前:デフォルトの名無しさん :03/05/23 12:20
教えてください。

DAOを使用してvc側でaccessに接続する処理を作りました。
これを関数化して
vb側から引数としてmdbファイルのフルパスとテーブル名を渡して
指定したテーブルのデータを戻り値としてvb側で受けたいのですが
vc側でデータが見つかる度にvb側に値を返すように作れるでしょうか?
その方法としてどのような方法があるでしょうか?
コールバック関数という言葉を耳にするのですが、このような処理に
使用できるようなら その技法を教えていただければ助かります。
よろしくお願いします。

448 名前:デフォルトの名無しさん :03/05/23 12:58
>>447
高度杉。無理ポ

449 名前:デフォルトの名無しさん :03/05/23 13:27
DLLからローカルファイルを削除等を出来ないようにしたいのですが、
LoadLibrary()呼び出し側から制御する事は出来ますか?


450 名前:デフォルトの名無しさん :03/05/23 14:34
>>446
-pedantic つけた時の奴は
void* への変換が起こってるっぽいので、
期待する結果は得られないと思う。

451 名前:デフォルトの名無しさん :03/05/23 14:43
>>447
>>449
そういう環境依存の話は C++ 相談室でよりも
それぞれの環境のスレで聞くのが幸せ。

452 名前:449 :03/05/23 15:13
>>451
了解。

453 名前:デフォルトの名無しさん :03/05/23 19:58
アセンブラからクラスをコールする方法と
アセンブラでクラスの作り方教えてください

454 名前:デフォルトの名無しさん :03/05/23 22:20
質問です。よろしくお願い致します。

最近CからC++へと移行したのですが、コンパイル時間が長過ぎるのが気になります。<C++
ちょくちょくとコンパイルしつつ進めて行くタイプなのでこれは自分的には非常に困るのです。
そこで何かコンパイル時間を短縮するような方法、工夫等あれば教えて頂けませんでしょうか?

環境はlinux-g++です。

455 名前:デフォルトの名無しさん :03/05/23 22:24
makeは使ってるよね?というのはさておき

includeするヘッダファイルを減らすとか・・・
実際に減ってるか確認しないと意味ないけど。

あとは、gcc-3.4まで待つか、VC++に鞍替えする。

456 名前:デフォルトの名無しさん :03/05/23 22:54
再帰的に呼び出される関数が
インライン宣言されているとき、
ちゃんとインライン展開されるのでしょうか?
されるなら関数呼び出しオーバーヘッドはないですよね?


457 名前:デフォルトの名無しさん :03/05/23 23:03
>>456
シラネーヨ コンパイラに聞け

458 名前:デフォルトの名無しさん :03/05/23 23:07
されるかされないかは処理系依..(ry

459 名前:デフォルトの名無しさん :03/05/23 23:10
>455
レス有難う御座います。
やっぱりこういうものなんですね、 C++での開発というのは。
とりあえずは指摘のようにヘッダファイルを減らしてみます。

precompiled headersって奴ですね。楽しみです。
ttp://gcc.gnu.org/gcc-3.4/changes.html

Linuxプラットフォーム向けに開発しているのでVC++に鞍替えするという選択肢はないのです。。。

460 名前:デフォルトの名無しさん :03/05/23 23:16
>>457-458
分かりました、これからコンパイラに聞いてみます。

461 名前:デフォルトの名無しさん :03/05/23 23:43
C++お勉強中の者です。
テキストに画面に文字表示するとき
cout >> "ハロー"
みたいな感じで書いてあるのですが
仕事でもこれを使うのでしょうか?
printfの方が激しく使いやすい気がするのですが。
cinもしかりです。

462 名前:デフォルトの名無しさん :03/05/23 23:45
タイプミスです。逆でした
cout << "ハロー"

463 名前:デフォルトの名無しさん :03/05/23 23:49
それで思い出した。
cout で小数を表示する時、
指数表示を強制できるの?

464 名前:デフォルトの名無しさん :03/05/23 23:54
double pi = 3.14159265
cout << precision(3) << pi;
とか

465 名前:464 :03/05/23 23:55
setprecision(3) の間違ひ。

466 名前:デフォルトの名無しさん :03/05/23 23:58
小数点以下何桁まで表示するか?のこと?
それですとテキストにはこんな感じでごちゃごちゃのってます。
cout << setw(4) << setprecision(2) << setiosflags(ios::right | ios::fixed | ios::showpoint)
<< 2.5

467 名前:デフォルトの名無しさん :03/05/24 00:01
>>464-466
指数表示だって。
たとえば、その場合だと
 3.14e+00
とか
 2.5e+00
と表示されてほしいの。

468 名前:デフォルトの名無しさん :03/05/24 00:03
cout.setf(ios::scientific, ios::floatfield);

469 名前:デフォルトの名無しさん :03/05/24 00:06
wstring hoge = "ほげ";
cout << hoge << endl;
ができないことに驚いたのですが wstringってどうやって使うために存在するんでしょうか?

470 名前:デフォルトの名無しさん :03/05/24 00:07
wcout

471 名前:デフォルトの名無しさん :03/05/24 00:14
やっぱりcoutって使いにくいですね。
みなさんもそう思いませんか?

472 名前:デフォルトの名無しさん :03/05/24 00:14
Σ(゚Д゚)気が付かなかった。

C++勉強中なので疑問に思ってしまうのですが、
なんで <<演算子のオーバーロードじゃなくて
wcoutが用意されているんでしょうか。

473 名前:デフォルトの名無しさん :03/05/24 00:15
>>468
それだ!
ありがとう!

474 名前:デフォルトの名無しさん :03/05/24 00:18
>>471
激しく尿意なので、
boost::format でも使うべし。

475 名前:デフォルトの名無しさん :03/05/24 00:21
>>473 かぶるが
http://www.cplusplus.com/ref/iostream/ios_base/_fixed_scientific.html
も参考に汁!

476 名前:デフォルトの名無しさん :03/05/24 00:40
>>475 もありが・!

477 名前:デフォルトの名無しさん :03/05/24 01:11
>>472
C++ のストリームライブラリは、文字の定義を変えることによって、動作を変更できる。
デフォルトで char, wchar_t に対応したストリームが用意されている。

wcout は wchar_t 用に特殊化したストリーム。
ほかにユーザー定義型でも特殊化できる。
(例えば、入出力の単位データ幅を変更できたりする)



478 名前:デフォルトの名無しさん :03/05/24 02:54
うーん・・・どうしようもない馬鹿ですみませんが。
char型変数内の1byteを16進数の文字コードで取り出したいのですがどうすればいいのでしょう・・・

479 名前:デフォルトの名無しさん :03/05/24 03:03
>>478
MFCスレのマルチポスト真性教えて君の中の人ですか?

480 名前:デフォルトの名無しさん :03/05/24 03:17
char s[3];
sprintf(s, "%02X", (char)c);

ライブラリを使わない実装は宿題とする

481 名前:デフォルトの名無しさん :03/05/24 03:31
(char)c しても結局 int にされちまわないか?

482 名前:デフォルトの名無しさん :03/05/24 03:42
c の型は char ですよ、と言いたいんじゃないの?
もしくは、c が int で、中の値を char の範囲に落としたいとか。

483 名前:デフォルトの名無しさん :03/05/24 03:48
char a[3];
sprintf( s, "%02X", (unsigned int)c );
でいいんじゃ?

484 名前:デフォルトの名無しさん :03/05/24 03:53
sprintf( s, "%02X", c & ( ( 1 << CHAR_BIT ) - 1 ) );

485 名前:デフォルトの名無しさん :03/05/24 03:56
const char figures[] = "0123456789ABCDEF";
char str[] = { figures[(c&0xFF)/0x10], figures[c&0x0F], 0 };

486 名前:デフォルトの名無しさん :03/05/24 07:38
char sOut[ 3 ];
char cIn;
int iTmp;
int iCnt;

for( iCnt = 0; iCnt < 2; iCnt ++ ){
 iTmp = cIn / 0x10;
 if( iTmp >= 10 )
  sOut[ iCnt ] = 'A' + iTmp % 10;
 else
  sOut[ iCnt ] = iTmp;
}

sOut[ 2 ] = '\0';

これでどーよ?

487 名前:486 :03/05/24 07:42
missった

char sOut[ 3 ];
char cIn;
int iTmp;
int iCnt;

for( iCnt = 0; iCnt < 2; iCnt ++ ){
 iTmp = ( cIn / ( int )pow( ( double )0x10 , ( double )iCnt ) ) % 0x10;
 if( iTmp >= 10 )
  sOut[ iCnt ] = 'A' + iTmp % 10;
 else
  sOut[ iCnt ] = iTmp;
}

sOut[ 2 ] = '\0';

吊ってくる

488 名前:デフォルトの名無しさん :03/05/24 11:15
質問ですが、クラスにコンストのメンバってもてないですよね?
初期化ができないと思うんで・・・。

489 名前:デフォルトの名無しさん :03/05/24 11:18
>>488
constメンバ変数はコンストラクタで初期化できる

490 名前:r :03/05/24 11:36
>>488
class A {
const int n;
A( int i ) : n(i) {}
};
とかって書く。

491 名前:488 :03/05/24 11:45
あ、そのやり方ですか、なるほど・・・。
じゃ、コンストラクタの定義ブロック内では
初期化できないんですね?

492 名前:デフォルトの名無しさん :03/05/24 12:23
コンストラクタのブロック内ではメンバの初期化はできない。
しているというのなら、それは代入だ。

493 名前:デフォルトの名無しさん :03/05/24 12:49
クラスのstaticメンバってありますよね。
あれは、一度どこかで定義しないといけないと思うのですが、
グローバルスコープで定義するとうまくいくのですが、
main関数内で定義すると「再宣言あるいは再定義エラー」に
なるのはなぜでしょうか?

494 名前:デフォルトの名無しさん :03/05/24 13:50
関数内でんな事するな。

495 名前:デフォルトの名無しさん :03/05/24 13:56
ちゃんとしたコンパイラならスタティックメンバは定義と初期化が同時に出来ます。

496 名前:ピー子について :03/05/24 14:30
次のように記述できるオブジェクトを作りました。
使い道はありますか?
aboutPiko()
{
  //description
  Obj Piko("piko");  //ピー子

  Obj Bird("bird");  //鳥
  Piko.is(Bird);    //ピー子は鳥です。
  Obj Sing("sing"), Morning("morning"), Tree("tree");
  Bird.does(Sing).when(Morning).where(Tree);
  Obj ChunChun("chunchun"), Cage("cage");
  Piko.does(Sing).how(ChunChun).where(Cage);
  Obj Wing("wing"), Shoulder("shoulder"), Folding("folding");
  Bird.has(Wing).where(Shoulder).how(Folding);

  //dialogue
  Anser Ans;
  Ans<<Is(Piko,Bird);    cout<<Ans<<endl;  //out=piko is bird
  Ans<<Has(Piko,Wing);    cout<<Ans<<endl;  //out=piko has wing
  Ans<<Where(Has(Piko,Wing));  cout<<Ans<<endl;  //out=piko has wing where shoulder
  Ans<<Where(Does(Piko,Sing));  cout<<Ans<<endl;  //out=piko does sing where cage
  Ans<<How(Has(Piko,Wing));  cout<<Ans<<endl;  //out=piko has wing how folding
  Ans<<When(Does(Piko,Sing));  cout<<Ans<<endl;  //out=piko does sing when morning
  Ans<<Why(Does(Piko,Sing));  cout<<Ans<<endl;  //out=unknown
}


497 名前:松田 融作 :03/05/24 15:01
何じゃこりゃー!

498 名前:r :03/05/24 15:15
>>496
Prolog風なのかな。
つか...詩?

499 名前:デフォルトの名無しさん :03/05/24 18:20
>>495
privateメンバなら直接初期化はできないんじゃ・・・

500 名前:デフォルトの名無しさん :03/05/24 19:14
class mona
{
 static const int ITTEYOSHI = -2614;
};
通ったよ。bcc5.6.4


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.