トップページ⇒tech
1001コメント300KB

C++相談室 part9

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
現在最高のプログラム言語と言われるC++についてのご相談承ります。
(´∀`).。o(関連URLは>>2-5の辺り)
0652デフォルトの名無しさんNGNG
>>644
それだけだと、

 スタックの巻き戻し(一時変数のデストラクタ呼び出し)
 対応する catch を見つける

なんつー処理ができない。もう少し面倒だよ。
0653デフォルトの名無しさんNGNG
>>651
Yes

コンストラクタ中で例外が発生すると、対応するデストラクタが呼ばれないから、

 自前で try - catch を書く
 auto_ptr などのスマートポインタを使う
 メンバ変数の初期化を使う

いずれかで対応する。
0654デフォルトの名無しさんNGNG
例外として(藁
newに失敗したインスタンスのdeleteは不要。
0655デフォルトの名無しさんNGNG
標準のストリームクラスで、

istream.read(buffer, offset, streamsize) ではなく
istream.read(buffer, streamsize)

という形式になっている理由がわかりません。

ストリームの使用者は
ランダムアクセスよりも順次アクセスの頻度が高いと仮定して、
後者の性能を高めるためでしょうか?
0656デフォルトの名無しさんNGNG
>>655
ランダムアクセスしまくりたいの?
0657デフォルトの名無しさんNGNG
>>655
ランダムアクセス出来ないデバイスを抽象化しやすいようにするため
0658デフォルトの名無しさんNGNG
もしよかったら、どなたかこの板で編み出されたVC6で通るtypelist.h等を
わけていただけませんか?
0659質問小僧ANGNG
今C++勉強中で、ある程度ソースかけるようになりました。
簡単なリスト作成ツールなどをせこせこ作って自己満足してますw
で、今作成したプログラムはDOS窓で動くんです。
それをwindowsの窓で動くプログラムにしたいのですが、なにからはじめればいいでしょうか?
参考書、やり方などなんでもいいので、教えていただけないでしょうか?
0660デフォルトの名無しさんNGNG
>>659
「猫でも」
0661質問小僧ANGNG
>>660
そこは無論聞く前に見て、勉強しました。
ですが、いまいちしっくりこないというか、微妙な感じというか・・・
0662デフォルトの名無しさんNGNG
>>659
C++BuilderかC++.NET買え。
それ以外の方法は効率が悪すぎる。
0663デフォルトの名無しさんNGNG
所詮Winだから・・・・。
0664デフォルトの名無しさんNGNG
>>659
環境ぐらい書かないとアドバイスしようがない。
0665デフォルトの名無しさんNGNG
       /■ヽ
      (´Д`)
  (( ─━OO━─ ))
        ∪∪
0666デフォルトの名無しさんNGNG
>>659

「プログラミングWindows」を読む。
それで難しいと感じたら、C++ Builderでやってみる。
0667デフォルトの名無しさんNGNG
>>658
http://www.42ch.net/UploaderSmall/source/1028634544.zip
いちおう確認したけど、LokiPortの存在は知ってるよな?
0668デフォルトの名無しさんNGNG
>>667
あれはVC6だめじゃないの?
0669デフォルトの名無しさんNGNG
クラスの演算子のオーバーライド(ロード?)でリンカのエラーがでます

error LNK2005: "bool __cdecl operator<(double const &,class TestClass const &)" (??M@YA_NABNABVTestClass@@@Z)
はすでに foo.obj で定義されています

ヘッダファイルに直接以下のように書いているのですが、なにがダメなのでしょうか?

// 比較演算子(upper_boundで必要)
bool operator < ( const double &a, const TestClass &v )
{
  return v.x < a;
}

なぜか解りませんがinlineを付けるとエラーが出ませんでした。
0670デフォルトの名無しさんNGNG
>>669
そのままinlineつけておけばいい
0671669NGNG
あ、普通に考えると定義だけヘッダに書いて、中身はcppでかくのかな?
でもinlineではエラーにならないのが解りません。
0672デフォルトの名無しさんNGNG
>>671
ヘッダに実装を書いた場合、そのヘッダを複数回includeすると、
実体も複数できるからリンク時エラーになる。
inlineにすれば実際には関数を作らないのでエラーにならん
0673デフォルトの名無しさんNGNG
>>670>>672
ああなるほど。言われてみればそうですね。
ありがとうございます。
0674デフォルトの名無しさんNGNG
訂正:>>669
 ○ return a < v.x;
 × return v.x < a;
0675デフォルトの名無しさんNGNG
画面を更新させるにはどうすればよいのでしょうか?
Sleepを使ったら文がいっきに表示されて困っています。
0676デフォルトの名無しさんNGNG
画面を更新する命令を呼べよ
0677デフォルトの名無しさんNGNG
画面を更新する命令ってなんですか?
0678質問小僧ANGNG
>>662
買うお金が・・・

>>664
すいません。環境かいてませんでした(汗
開発環境はVisualC++6.0です。OSはWin2000とWin98です。

>>666
さっそくその本立ち読みしに大学までいってきます。
ところで・・・獣の数字・・・w
0679デフォルトの名無しさんNGNG
>>678
学生だろ?アカデミックパックで安いものじゃん
そもそも今の学生って俺たちより余程金持ってるじゃん
0680デフォルトの名無しさんNGNG
>>677
知らんよ。というか 675 が意味不明だから、補足しろと言ってるんじゃないの?
0681デフォルトの名無しさんNGNG
>>667
ありがとう!
0682質問小僧ANGNG
>>679
それは偏見なのでは・・・(汗
少なくとも私は貧乏生活です・・・
成人祝いに買って貰ったVisualStudioで頑張ってるんです。
0683デフォルトの名無しさんNGNG
>>682
MFC使えばいいんじゃないか?
自分は良いサンプル集めて勉強してる。
ダイアログアプリなら簡単だよ。

0684質問小僧ANGNG
>>683
その良いサンプルをできればおしえていただけませんか?
はっきりいってどこから手をつければいいのか・・・
0685デフォルトの名無しさんNGNG
VC6にもサンプルついてると思うけど
自分は主にココにある物を参考にしてる。
http://www.codeproject.com/
http://www.codeguru.com/
CDialogだったらボタンとかリストとかを
ダイアログエディタでくっつけて、動作は自分で記述することになるよ。
MSDNにCButtonやCListBox,CListCtrlがあるからそのメンバ関数とかをみれば
使い方は分かる。

0686デフォルトの名無しさんNGNG
age
0687デフォルトの名無しさんNGNG
NT4.0でVisualC++6.0を使っています。
ネットワーク経由のメッセージを契機に、
特定プログラムを起動するサービス(NT4.0上で動作)を
作りたいと考えています。
NT4.0サービスを作成・インストールする部分がわからないのですが、
参考になる書籍など、ご存知でしたら教えてください。
MSDNを見ると、「ATL COM AppWizard を使う」とありましたので、
早速使ってみたのですが、どこに記述してよいやらわかりません。
よろしくお願いします。
0688 NGNG
>>687
サービスとCOMに何の関係が?
0689デフォルトの名無しさんNGNG
>>688
あるじゃん。COM を使わずに直接 API 叩く方法もあるが、ふつーは COM の
形で実装するし、そのための Wizard も用意されてる。
0690デフォルトの名無しさんNGNG
includeした先にある名前って
グローバルスコープ?ファイルスコープ?
どちらになる?
0691 NGNG
>>690
もうちょい具体的に
0692デフォルトの名無しさんNGNG
>>690
意味がわからん。
0693デフォルトの名無しさんNGNG
includeしてもスコープは何も変わらん
0694デフォルトの名無しさんNGNG
ファイルスコープって??
0695 NGNG
>>694
そのファイルの中だけに限定されたスコープ
0696デフォルトの名無しさんNGNG
my.hで
#include <stdio.h>
をするとここではprintfを使うものの
#include "my.h"
をしたときにprintfという名前を占有してほしくないとする
どうにもならない?
namespace使うとふるいヘッダでエラーが出ることがあるし
0697デフォルトの名無しさんNGNG
プリプロセッサの出力は翻訳単位と言う(第三版から)
0698デフォルトの名無しさんNGNG
>>696
private_my.hをつくれ。
0699 NGNG
>>696
ヘッダファイルの中からprintf()呼ぶ気か?
0700デフォルトの名無しさんNGNG
printfは例えばで実際にはwindows.hなんだが
>>698
どういうこと?
0701デフォルトの名無しさんNGNG
>>700
my.h内でincludeするのではなく、別にprivate_my.h等を作ってこっちで
includeすればいいじゃん。で、private_my.cpp等にprintfを必要を
必要とするモジュールを封じ込める
0702デフォルトの名無しさんNGNG
>>701
テンプレートはどうにもならん?
exportがサポートされないとだめかな?
0703デフォルトの名無しさんNGNG
>>702
なにがやの?
0704デフォルトの名無しさんNGNG
膨大なdefineマクロと膨大な関数名
0705デフォルトの名無しさんNGNG
>>704
マクロはともかく、標準関数は std ネームスペースに封じられてるから問題ない。
問題は Win32 API だけど、こいつはどうにもならんね……。
0706デフォルトの名無しさんNGNG
defineやめてconstとinlineにして
::windowsに閉じ込めるバージョンがあればいいんだが
0707デフォルトの名無しさんNGNG
namespace windows {

#include <windows.h>

}
は?
0708デフォルトの名無しさんNGNG
>>707
そもそも KERNEL32.DLL とか USER32.DLL にある API の本体が、namespace
なし、extern "C" でコンパイルされておろうが。
0709つまづきさんNGNG
これの意味を理解できるように教えてくだされ
for (sum=0, i=0; i<v.size(); i++)
vectorクラスでデータの総和をとる計算の一部なんだけどわからない(欝
0710デフォルトの名無しさんNGNG
>>709
size()は要素数を返す。ってゆーかイテレータを使うだろ普通
0711710NGNG
ついでにaccumulateも
0712デフォルトの名無しさんNGNG
>>710
むしろ std::accumulate を使うと思われ。
0713デフォルトの名無しさんNGNG
やはりC++はCをやってからの方がいいな。
forを知らずにvectorとはこれいかに。
0714つまづきさんNGNG
えっとまだ本を読んでる状態なんで・・・・
iがv.sizeより小さかったらi++と判断したらいいのかなぁ
この後にsum += v[i] が続いてるんだけど
0715デフォルトの名無しさんNGNG
>>714
その部分も予め書きなよ。
0716つまづきさんNGNG
すんません
0717デフォルトの名無しさんNGNG
自分は
709のスタイルなんだが、
iterator使ったコーディングにするとどう違ってくるの?
0718デフォルトの名無しさんNGNG
>>715
いってることは正しいが書かなくてもわかるな普通。
それよりforを知らないのが信じられない。
0719つまづきさんNGNG
v[i]っていうのは何をさしてるんですか?
0720デフォルトの名無しさんNGNG
for(std::vector<int>::const_iterator i = v.begin(); i != v.end(); ++i)
{
  sum += *i;
}
かな?
0721デフォルトの名無しさんNGNG
>>719
キーワードは STL と vector だ。あとは「プログラミング言語 C++」を読め。
0722デフォルトの名無しさんNGNG
>>717
sum=0;
for(vector<int>::iterator vi=v.begin();vi!=v.end();vi++)
sum+=*vi;
みたいな
0723つまづきさんNGNG
using namespace std ;
void main ( )
{
 vector < int > v ;
 int i, data, sum ;

 cout << "数値以外の文字を入力して終了" << endl ;

 while ( cin.good ( ) ) {
cin >> data ;
if ( cin.good ( ) ) v.push_back ( data ) ;
}               

for ( sum = 0, i = 0 ; i < v.size ( ) ; i ++ ) {
sum += v[i] ;
cout << v[i] << " - " << sum << endl ;
}
}
できればforからの文を日本語で説明して欲しい
0724デフォルトの名無しさんNGNG
>>723
さすがに C++ の「いろは」から解説を頼むのは、スレ違いだと思われ。とりあえず
本を読んで、最低限の知識を身につけてクレ。
0725デフォルトの名無しさんNGNG
723は多分、STLのvectorを知らないんだと思われ。
STLの解説がある本をお勧めする。
0726つまづきさんNGNG
>>724
そりゃそだね、とりあえずこれはとばして読み続けてみるよ
>>725
まだ本の最初のほうだからでてきてないのかも
0727717NGNG
コンテナのある部分の合計を取るような関数を作ったときに
iteratorで記述してれば、記述は大変だが、使うときに便利になる。

アルゴリズムの記述が、特定のポインタでなく、様々なコンテナに
適用できる点がiteratorのいいところということだと思った。

0728デフォルトの名無しさんNGNG
>>727
さらに一歩進んで、template 関数 or 関数オブジェクトにしないと、あまり嬉しくないと
思うが。
0729nnsNGNG
連番ファイルに切られたファイル(使うのは連番MPEG2ストリームファイル)をビット単位でうまいこと読み書きできるクラスのサンプルどこかにありませんか?
一応作ってはいるんだが挫折しそう。
0730デフォルトの名無しさんNGNG
std::stringをpublic継承させて機能を追加したクラス、
CStringを作りたいと思っています。

class CString :
  public std::string
{
public:
  // 追加機能いろいろ省略。
private:
  static void* operator new(size_t);
};

「仮想デストラクタのないクラスからpublic継承してはいけない」
というのはC++の常識らしいですが、こういう風にnewを自分で禁止しておけば、
ポインタからアクセスすることがなくなるので問題はないと思うのですが、
どうでしょうか? これでも、まだなにかやばい事が起こり得る抜け道って
ありますか?

0731デフォルトの名無しさんNGNG
可変引数リストで質問なのですが、
sscanfを別の関数から呼びたいのですが、
どうやったら...の部分を渡せるのでしょうか?
sprintfの場合は、vsprintfでva_listを渡せばできるのですが、
sscanfにはvsscanfのようなものは見あたりません。

test(const char* buffer,const char* format,...)
{
//sscanf が呼びたい
va_list arg;
va_start(arg, format);
int i = sscanf(buffer,format,arg);//うまくいかない。
va_end(arg);
return i;
}
sscanf(const char*,const char*,...);
0732デフォルトの名無しさんNGNG
>>730
newできないと残念だから、継承させないでstd::stringのインスタンスを
メンバに持たせたらどう?
ちょっとめんどくさくなるけど。
0733デフォルトの名無しさんNGNG
>>731
ちなみにそれで何をするの?
0734731NGNG
>>733
スイマセン。よく調べてみたら、
sscanfはdoubleの変換ができないようなので
atoi,atof系を使わないとだめですね。

C++的には

double d;
std::stringstream a;
a << "123.456789";
a >> d;
0735デフォルトの名無しさんNGNG
try {
6nbsp;int *ip = new int[-1];
}
catch (std::bad_alloc &a) {
 cerr<<"(・∀・)マンコー"<<endl;
}
0736デフォルトの名無しさんNGNG
>>734
> sscanfはdoubleの変換ができないようなので

そんなことないでしょ?
0737731NGNG
>>736
MSDNの
scanf 関数の型フィールド文字に
e、E、f、g、G
はfloatのポインタと書いてある。

でもやっぱり、sscanf使えないと面倒だなぁ。(鬱
0738デフォルトの名無しさんNGNG
>>737
MSDNをよく読んでみましょう。
0739731NGNG
>>738
ありがとう!!doubleやっぱり使えるんですね。
「printf 関数と wprintf 関数の書式指定フィールド」を参照してください。
とあるのにリンク先をクリックすると
scanf 系関数の書式指定フィールド
になっている罠
だったんだねぇ。

731の件は sscanf.cにソースがあり解決しました。

後一つだけ質問させてください。お願いします。
sscanfを Cでコンパイル(*.c)すると問題ないのですが、
C++でコンパイル(*.cpp)するとRUNTIMEエラーがでてしまうのですが、
どうしたら回避できるのでしょうか?
(浮動小数点の場合に起きています。)

#include<stdio.h>
int main()
{
double d;
sscanf("123.456","%f",&d);
}
0740デフォルトの名無しさんNGNG
>>739
>sscanf("123.456","%f",&d);

sscanf("123.456","%lf",&d);
0741731NGNG
sscanfの前にsprintfを実行したら
floating-point support not loaded
とでていたのがそれ以後、不思議と直りました。
>>740 ありがとうざいました。
0742デフォルトの名無しさんNGNG
>>730
CString* ps = new CString[1];
0743730NGNG
>>732
いや、メンバで持たせるのはちょっとやってみたんですが、stringが持ってる
関数を全部委譲させようとすると、かなりの量の作業が必要なので。
で、いくつか委譲作業をやってる途中で思ったのです。『public継承って、もともと
こういう面倒な記述をしなくていいようにするために出来たんじゃないの?』って。
そう思って冷静に考えたら、委譲の保守の労力と、ポインタ間接が一個増えることによる
効率の悪化、このふたつの変わりに得られるメリットが、string*経由のdeleteという
落とし穴を回避できる、ってのは、あんまりじゃないですか。
だから、なんとかpublic継承させたいんです。

>>742
おおっと。そうですね。たしかに、それも回避しておかないと。
0744デフォルトの名無しさんNGNG
>>743
> で、いくつか委譲作業をやってる途中で思ったのです。『public継承って、もともと
> こういう面倒な記述をしなくていいようにするために出来たんじゃないの?』って。
いいえ。
0745デフォルトの名無しさんNGNG
その手の用途にはprivate継承とusingを使うのが定石。
publicで済ませるのは、暗黙の型変換が考えられない場合
(traitsとかね)だけ。
0746730NGNG
>>744
いや、あの。どうせなら、どういう歴史的経緯があったのか、教えてくださいよ。知ってるんでしょ?

>>745
private継承とusing……? private継承でも、using宣言でCStringのスコープに
stringの各関数をインポートできる、ってことですか? もしそうなら、
ひとつのusing宣言でstringをまるごとインポートできればいいんですけど……。
ま、調べてみます。
ところで、
>publicで済ませるのは、暗黙の型変換が考えられない場合
ってのは、どういう意味ですか? 「暗黙の型変換はよくない」と
前提した上で、CStringからstringへの暗黙の型変換がいっぱい起こりうるから
public継承はやめとけよ、って意味でいいんでしょうか。
0747744NGNG
>>746
public 継承は実装の再利用ではなく、あくまで OOP のパラダイムを実現する
ための機能。あまり書き方は良くないんだが「プログラミング言語 C++」に記述
があるよ。
0748デフォルトの名無しさんNGNG
>>746
なんでそんなことするの?
std::stringにどんな拡張をする計画なの?
0749デフォルトの名無しさんNGNG
C++サードは色々なことが載ってて役に勃つ!
マンセー
0750730NGNG
>>747
ありがとですー。

>>748
// 最初に現れる指定文字位置を探す。日本語を含んだ文字列でも正常動作する。
int Find(char ch) const;

// 最初に現れる指定文字で分割できる部分文字列(左側)を返す。日本語含んでもOK。
CString FindLeft(char ch) const;

// 最初に現れる指定文字で分割できる部分文字列(右側)を返す。日本語含んでもOK。
CString FindRight(char ch) const;

// 文字列が "10" "-5" 等ならtrue。
bool IsDigit(void) const;

こんな感じです。
0751デフォルトの名無しさんNGNG
>>750
メンバにする必要ある?
■ このスレッドは過去ログ倉庫に格納されています