C++相談室 part41
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/07/01(金) 13:09:21ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ part40
http://pc8.2ch.net/test/read.cgi/tech/1113408957/
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0446デフォルトの名無しさん
2005/07/24(日) 21:06:06C++の話を汁
0447デフォルトの名無しさん
2005/07/24(日) 21:08:03deleteしてしまえばOK
0448445
2005/07/24(日) 21:13:35なるほど、それで安心しました。thx
0449デフォルトの名無しさん
2005/07/24(日) 21:21:170450デフォルトの名無しさん
2005/07/24(日) 21:47:14振込先を聞いて警察に通報しr
0451デフォルトの名無しさん
2005/07/24(日) 21:49:190452質問です
2005/07/24(日) 22:05:26このメモリに、あるファイルの完全パスの文字列が割り当てられています。
このパスの2階層上のフォルダパス文字列を
CString型の変数に割り当てる処理を行おうとしております。
Ex)”C:\test\test1\hogehoge.cpp” -> "C:\test"
C++で上記処理を行う場合、どのような処理方法が一般的なのでしょうか?
よろしくお願いいたします。
0453デフォルトの名無しさん
2005/07/24(日) 22:17:07CStringがそもそも一般的じゃありませんから。
0454デフォルトの名無しさん
2005/07/24(日) 22:18:170455デフォルトの名無しさん
2005/07/24(日) 22:24:17(つェ`)えーん
VC専用スレがみつからなかったんですよ。
【VC++】プログラム作成に手を貸して下さい!!
スレなんですかね?板汚しすまそんでした。。
他のスレは過疎ってそうなのでwebでも少し探してみます。ありがとうでした
0456デフォルトの名無しさん
2005/07/24(日) 22:30:09shlwapi.hのPathRemoveFileSpecを2回呼べば?
あとVCのスレはここね。こんな名前だからVCじゃ引っかかるわけないな。
★初心者にVisual C++を教えるスレ★ Part20
http://pc8.2ch.net/test/read.cgi/tech/1120222322/l50
0457デフォルトの名無しさん
2005/07/24(日) 22:38:40ぎゃ・・・検索が甘すぎでした
PathRemoveFileSpec
お、こんな便利なAPIがあったんですね、これで試してみます。
ありがとうございました。
0458デフォルトの名無しさん
2005/07/25(月) 11:21:380459デフォルトの名無しさん
2005/07/25(月) 11:23:330460デフォルトの名無しさん
2005/07/25(月) 11:43:36うまくいく場合と行かない場合があります。
ファイルから1行読み込み、2桁の数字、5桁の数字、12桁の英数文字
を抜き取る作業なのですが関数の使い方は合っているでしょうか?
----------------------------------------
FILE *fp;
int a, b;
char str0[256];
char str1[256];
fp = fopen ("M:\\test\\data1.txt", "r");
if (fp == NULL) exit (-1);
while (fscanf (fp, "%s", str0) != EOF) {
strncpy (str1, str0, 2);
a = atoi (str1);
strncpy (str1, str0 + 3, 5);
b = atoi (str1);
strncpy (str1, str0 + 9, 12);
keisan1 (hwnd, a, b, str1);
}
fclose (fp);
---------------------------------------
データファイルの中身
01,23456,abc456ghijkl
52,63481,vwxyz.abcdef
:
:
0461デフォルトの名無しさん
2005/07/25(月) 11:49:06strncpyは指定された文字数ちょうどをコピーしたときには文字列終端の'\0'を書き込まないため。
0463デフォルトの名無しさん
2005/07/25(月) 12:54:270464デフォルトの名無しさん
2005/07/25(月) 13:54:29なして?
0465デフォルトの名無しさん
2005/07/25(月) 14:40:23>>460のケースだと、固定幅フィールドファイルではなく、CSVファイルに見えたから。
であるなら、車輪の再開発はしなくてもいいのにと思った。
ただ、ソースコードはCコンパイラでコンパイルできるものなので、
C++は使えない環境なのかもしれないとも思った。
C++は使えても、boostは使えない環境なのかもしれないとも思った。
0466デフォルトの名無しさん
2005/07/25(月) 14:51:30このスレではC++が使えない環境のことは考えなくていいんでは
boostは使えないかもしれないけど
0467デフォルトの名無しさん
2005/07/25(月) 15:01:06もちろんboost::tokenizerとは挙動がいろいろと違うけれどね。
0468デフォルトの名無しさん
2005/07/25(月) 15:29:250469デフォルトの名無しさん
2005/07/25(月) 16:43:56素直にTSVつかっとけよ
0470デフォルトの名無しさん
2005/07/25(月) 19:52:55毎回コーディングし直すからうざいんちゃうの?
0471デフォルトの名無しさん
2005/07/25(月) 20:14:470472デフォルトの名無しさん
2005/07/25(月) 20:26:120473デフォルトの名無しさん
2005/07/26(火) 04:59:30なので,低い程よくなります.そこで,1試合ごとの投球回数と失点数
を入力し,「全試合を通しての防御率」と「最近5試合の防御率」を入
力するたびに計算するプログラムを作ってください.ただし,1/3 回
のようなアウトカウントによる投球回数は考えず,投球回数単位で計算
するものとします.
下の表に出ている値で正しいかどうかを確認してください.
なお,最大140試合まで入力できるようにしてください.また,
日本のプロ野球では,延長戦は12回までなので,投球回数に12より
大きい数値は入らないようにしてください.
0474デフォルトの名無しさん
2005/07/26(火) 06:08:09マルチ氏ね。そもそもスレ違い
0475デフォルトの名無しさん
2005/07/26(火) 07:33:55クラスの継承で、アクセスコントロールをメンバ関数個別に設定する事は可能でしょうか?
たとえば、
class A{
...
public:
void Func1();
void Func2();
};
class B : public A{
...
};
の時、
「クラスAのオブジェクト → 外部からFunc1,Func2両方アクセスできる」
という条件を維持したままで、
「クラスBのオブジェクト → 外部からFunc1はアクセス可だが、Func2は不可」
のような設定を実現する方法はあるでしょうか。
0476475
2005/07/26(火) 07:45:43継承先のクラスでprivateで多重定義すればよかったですね。
0477デフォルトの名無しさん
2005/07/26(火) 08:26:46class A {
public:
void Func1();
void Func2();
};
class B : public A {
void Func2();
};
こういうことならこうできるけどいい?
B obj;
obj.A::Func2();
0478デフォルトの名無しさん
2005/07/26(火) 09:05:15で、再定義するよりも、public部で公開したいものをusingする方が
メンテ上ベターでしょう。
0479475
2005/07/26(火) 11:15:22>private継承ということではなかろうか。
はい、そうです。
478さんの方法を試してみます。
勉強になります。
0480475
2005/07/26(火) 13:09:40private継承して継承先からはアクセス不可にしておきたい基底クラスのメンバはごく一部で、
継承先のpublic部でusingして公開しようとしているメンバの方が数が圧倒的に多いです。
そのため、今478さんの方法を試そうとしているのですが、
継承先のpublic部にかなりたくさんのusing記述をする事になってしまいそうです。
他に、継承先クラスから基底クラスの一部のメンバだけを個別にアクセス制限
できるような方法はないものでしょうか。
継承クラス関係で調べているのですがなかなかそういう方法がみつかりません。
0481デフォルトの名無しさん
2005/07/26(火) 13:16:47無理かもしれんが、クラスがでかすぎるようなら
役割でクラスを分割して複数のオブジェクトにするといいかも
0482デフォルトの名無しさん
2005/07/26(火) 13:17:54struct base
{
void a();
void b();
void c();
};
struct derived : base
{
private:
void c() { base::c(); }
}:
0483デフォルトの名無しさん
2005/07/26(火) 13:18:59publicで継承して、見せたくない部分だけprivateでusingすればいいんじゃね?
0484デフォルトの名無しさん
2005/07/26(火) 15:22:06>private継承して継承先からはアクセス不可にしておきたい基底クラスのメンバはごく一部で、
>継承先のpublic部でusingして公開しようとしているメンバの方が数が圧倒的に多いです。
を理由に
>>482
>publicで継承して、見せたくない部分だけprivateでusingすればいいんじゃね?
はあんまり良くないと思うよ
public継承ってことは
基底クラスの参照ポインタで普通にアクセスできてしまうからね
0485デフォルトの名無しさん
2005/07/26(火) 16:18:19char *run()
{char *dp,d[]="running";
dp=d;
return dp;
}
void main()
{char *tp,t[10];
tp=t;
tp=run();
cout << tp << endl;
}
何分基本的な事で申し訳ありません
文字列を返す関数を作りたいのですが、上記のもの実行すると
running・↕ฺと、お呼びでないものも表示されてしまうのです
多分メモリが解放されている為だと思うのですが、何か良い方法は有りませんか?
0486デフォルトの名無しさん
2005/07/26(火) 16:35:00std::string
0487デフォルトの名無しさん
2005/07/26(火) 16:35:50{まず、中括弧をキモイ位置に配置するのはやめなさい。
}
const char* run() {
const char*dp="running";
return dp;
}
0488デフォルトの名無しさん
2005/07/26(火) 16:40:04char *dp="running";
return strcpy(s,dp);
}
0489デフォルトの名無しさん
2005/07/26(火) 16:55:400490デフォルトの名無しさん
2005/07/26(火) 17:09:32>#include <iostream.h>
アナクロすぎ。
文字列を返す関数が欲しいだけなら
const char * run() {return "running";}
でいい。
0491デフォルトの名無しさん
2005/07/26(火) 20:17:08template使うときにこれが障害になることがかなり多いんだけど。
0492デフォルトの名無しさん
2005/07/26(火) 20:28:56え? そういう必要があるときに template 使うよ??
0493デフォルトの名無しさん
2005/07/26(火) 20:31:39for ( int a = 0, unsigned int b = 0; a < 10; a++, b++ ) {
}
これってなぜにダメなのでしょう?
初期値に宣言でおけるのは1つだけ?
おとなしく
unsigned int b = 0;
for ( int a = 0; a < 10; a++, b++ ) {
}
としておけということ?
0494デフォルトの名無しさん
2005/07/26(火) 20:32:55型は1つですよ
0495デフォルトの名無しさん
2005/07/26(火) 20:33:43unsigned は予約語なので変数名になれない
コンパイラは心を持たない
0496493
2005/07/26(火) 20:34:18ちと言葉足らずでしたが
for内だけのスコープを持つ変数宣言は1つしかできないのか?
という意味です
for ( a = 0, b = 0; a < 10; a++, b++ )
ができるのはわかっています。
0497493
2005/07/26(火) 20:34:54いくつでもできる気がしてた・・
0498デフォルトの名無しさん
2005/07/26(火) 20:36:43俺んとこではダメだったけど、これなら通ってもよさそうな気がする
for ( (int a = 0), (unsigned int b = 0); a < 10; a++, b++ ) {
}
0499デフォルトの名無しさん
2005/07/26(火) 20:37:56そいつは無理な相談
0500デフォルトの名無しさん
2005/07/26(火) 20:38:32なんで?
0501デフォルトの名無しさん
2005/07/26(火) 20:46:55規格の文法上不可能だから。
ISO/IEC 14882:1998 Annex A Grammar summaryより
for ( for-init-statement condition(opt) ; expression(opt) ) statement
for-init-statement:
expression-statement
simple-declaration
expression-statement:
expression(opt) ;
simple-declaration:
decl-specifier-seq(opt) init-declarator-list(opt) ;
decl-specifier-seq:
decl-specifier-seq(opt) decl-specifier
decl-specifier:
storage-class-specifier
type-specifier
function-specifier
friend
typedef
init-declarator-list:
init-declarator
init-declarator-list , init-declarator
init-declarator:
declarator initializer(opt)
0502493
2005/07/26(火) 21:04:07↑はgcc拡張だったぽ・・
通常規約上だめなのかも・・ちなみにVCだめ
gccばっかつかってたためか標準でおkかとおもてた
orz
0503デフォルトの名無しさん
2005/07/26(火) 21:04:49オブジェクトの定義を囲う括弧が実行文でなくなる制限についての関連事項はどこだ?
0504デフォルトの名無しさん
2005/07/26(火) 21:12:40namespace
で細かい分類をするのって薦められるやりかたなのでしょうか?
こんな感じです
MyLib::SubsDataA::sub1(){ .. }
MyLib::SubsDataB::sub1(){ .. }
MyLib::SubsDataC::sub1(){ .. }
0505デフォルトの名無しさん
2005/07/26(火) 21:14:01それを>501はそのまんま書いているわけなんだけど……。
もしかして規格書の文法記述読めない?
0506デフォルトの名無しさん
2005/07/26(火) 21:18:49for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。
0507501
2005/07/26(火) 21:24:28for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。
0508501
2005/07/26(火) 21:27:55for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。
0509501
2005/07/26(火) 21:30:02for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。
0510デフォルトの名無しさん
2005/07/26(火) 21:30:210511デフォルトの名無しさん
2005/07/26(火) 21:33:30VCとCWで拡張なしで普通に通ったよ?
int main()
{
int a, b;
for (a = 0, b = 0; a < 10; a++, b++){}
}
0512デフォルトの名無しさん
2005/07/26(火) 21:42:32全然わかんねえ
何だその説明は?
0513デフォルトの名無しさん
2005/07/26(火) 21:53:340514デフォルトの名無しさん
2005/07/26(火) 21:58:45全然わかんねえ
何だその説明は?
0515デフォルトの名無しさん
2005/07/26(火) 22:04:370516デフォルトの名無しさん
2005/07/26(火) 22:09:36カンマ演算子自体はC時代から普通に使えるよな
0517501
2005/07/26(火) 22:12:360518デフォルトの名無しさん
2005/07/26(火) 22:14:50それ(a=0, b=0)は宣言ではなくてexpressionだから。
えー、pc8鯖が強烈に重いので、多重注意しておくれ。
0519デフォルトの名無しさん
2005/07/26(火) 22:20:53C++相談室で回答者やる程度にはC++と規格書の読み方に関する知識がある人間じゃない?
0522デフォルトの名無しさん
2005/07/26(火) 23:15:070523デフォルトの名無しさん
2005/07/27(水) 00:53:120524デフォルトの名無しさん
2005/07/27(水) 02:53:19必要なメモリ量=実行ファイルの大きさ
で合ってます??くだらない質問ですいません。
0525デフォルトの名無しさん
2005/07/27(水) 03:06:22初めから終わりまで全く違います。
0526デフォルトの名無しさん
2005/07/27(水) 03:22:34>くだらない質問
0527デフォルトの名無しさん
2005/07/27(水) 03:24:44そのようですね。
0528デフォルトの名無しさん
2005/07/27(水) 03:25:14むしろCの方がどのくらいメモリを使うかは分かりやすいかと。
あまりそういう細かいことを知らなくても人の作った部品をうまく
組み合わせて全体を作るためのオブジェクト指向でもあるわけだし。
0529デフォルトの名無しさん
2005/07/27(水) 04:05:06こういう感じの。
struct A
{
int x;
int y;
std::vector<int> vect;
};
0530デフォルトの名無しさん
2005/07/27(水) 04:07:450531デフォルトの名無しさん
2005/07/27(水) 04:08:31何がやりたいのか意味が分からん
0532デフォルトの名無しさん
2005/07/27(水) 04:10:01それは激しく環境依存。
0533デフォルトの名無しさん
2005/07/27(水) 04:11:25memcpyとかでは使えない
0534デフォルトの名無しさん
2005/07/27(水) 04:12:25コピーコンストラクタを持たせるべき
0535デフォルトの名無しさん
2005/07/27(水) 04:30:49いったいどこが?
0536デフォルトの名無しさん
2005/07/27(水) 04:56:15structの中にstd::vectorを入れることはできるし、std::vectorを使うことが直接的な問題は引き起こさない。
ただし、セオリーとして、std::vectorを使うときはコンストラクタでだいたいの大きさを指定する:
A() : vect(1000) {} // A::vectはほとんどのケースで1000程度の要素数を持つと予想されるとき
これはパフォーマンスのためと、そのクラスがどの程度のデータを扱うことを想定しているかのヒントのため。
>>534
コピーコンストラクタは、ポインタをメンバに持つときに定義するべきでは?
std::vectorなら、コンパイラが暗黙に定義するコピーコンストラクタで問題ないはず。
0537デフォルトの名無しさん
2005/07/27(水) 06:38:37全然わかんねえ
何だその説明は?
0538デフォルトの名無しさん
2005/07/27(水) 06:58:01それはクラスになっちゃうのでクラスの性質がよくわからない人はやっちゃダメです。
0539デフォルトの名無しさん
2005/07/27(水) 07:29:050540デフォルトの名無しさん
2005/07/27(水) 09:41:33ん? そういうヒントのためにはvector::reserveを使うべきでは?
いや、最初から1000の要素が必要ならそれでも良いけど。
0541デフォルトの名無しさん
2005/07/27(水) 11:17:38>>536 そんなセオリーもありません。プログラムの都合にあわせて好きにすればいいはずです。
>>538 C++での「クラス」と「構造体」に性質の違いはありません。
0542デフォルトの名無しさん
2005/07/27(水) 11:19:09なにこの板。
0543デフォルトの名無しさん
2005/07/27(水) 12:08:41そこがハッキリしてないな。
0544デフォルトの名無しさん
2005/07/27(水) 12:11:19それぐらい知ってますよ
C++でいう構造体とクラスは本質的には同じ物で、何も書かなかった時にデフォルトでpublicかprivateになるという違いがあるだけでしょう?
0545デフォルトの名無しさん
2005/07/27(水) 12:52:38じゃあ何が聞きたいんだよ
人間初心者はお断りだぞ
■ このスレッドは過去ログ倉庫に格納されています