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

C++相談室 part41

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/07/01(金) 13:09:21
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。

前スレ part40
http://pc8.2ch.net/test/read.cgi/tech/1113408957/

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0446デフォルトの名無しさん2005/07/24(日) 21:06:06
>>445
C++の話を汁
0447デフォルトの名無しさん2005/07/24(日) 21:08:03
>>445
deleteしてしまえばOK
04484452005/07/24(日) 21:13:35
>>447
なるほど、それで安心しました。thx
0449デフォルトの名無しさん2005/07/24(日) 21:21:17
電話の向こうで泣いてる俺が来ましたよ
0450デフォルトの名無しさん2005/07/24(日) 21:47:14
>>445
振込先を聞いて警察に通報しr
0451デフォルトの名無しさん2005/07/24(日) 21:49:19
んな超有名なコピペに反応せんでも…
0452質問です2005/07/24(日) 22:05:26
char[] hoge
このメモリに、あるファイルの完全パスの文字列が割り当てられています。

このパスの2階層上のフォルダパス文字列を
CString型の変数に割り当てる処理を行おうとしております。
Ex)”C:\test\test1\hogehoge.cpp” -> "C:\test"
C++で上記処理を行う場合、どのような処理方法が一般的なのでしょうか?
よろしくお願いいたします。
0453デフォルトの名無しさん2005/07/24(日) 22:17:07
>>452
CStringがそもそも一般的じゃありませんから。
0454デフォルトの名無しさん2005/07/24(日) 22:18:17
残念、VCは専用スレへ斬り!
0455デフォルトの名無しさん2005/07/24(日) 22:24:17
>>453−454
(つェ`)えーん
VC専用スレがみつからなかったんですよ。
【VC++】プログラム作成に手を貸して下さい!!
スレなんですかね?板汚しすまそんでした。。

他のスレは過疎ってそうなのでwebでも少し探してみます。ありがとうでした
0456デフォルトの名無しさん2005/07/24(日) 22:30:09
>>452
shlwapi.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
>>456
ぎゃ・・・検索が甘すぎでした

PathRemoveFileSpec
お、こんな便利なAPIがあったんですね、これで試してみます。
ありがとうございました。
0458デフォルトの名無しさん2005/07/25(月) 11:21:38
my_dick.insert(find(pussy.begin(), pussy.end(), boost::bind(younger_than, _1, 25)));
0459デフォルトの名無しさん2005/07/25(月) 11:23:33
>>458 dick に pussy をいれるのか?
0460デフォルトの名無しさん2005/07/25(月) 11:43:36
strncpy()関数の使い方の確認なのですが 下記の使い方で
うまくいく場合と行かない場合があります。
ファイルから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:06
>>460
strncpyは指定された文字数ちょうどをコピーしたときには文字列終端の'\0'を書き込まないため。
04624602005/07/25(月) 12:23:29
>>461
なるほど! どうもありがとうございました m(_ _)mぺこ
0463デフォルトの名無しさん2005/07/25(月) 12:54:27
CSVファイルの読み込みにboost::tokenizer使うのは、やっぱりダメなんだろうか。
0464デフォルトの名無しさん2005/07/25(月) 13:54:29
>>463
なして?
0465デフォルトの名無しさん2005/07/25(月) 14:40:23
>>464
>>460のケースだと、固定幅フィールドファイルではなく、CSVファイルに見えたから。
であるなら、車輪の再開発はしなくてもいいのにと思った。

ただ、ソースコードはCコンパイラでコンパイルできるものなので、
C++は使えない環境なのかもしれないとも思った。
C++は使えても、boostは使えない環境なのかもしれないとも思った。
0466デフォルトの名無しさん2005/07/25(月) 14:51:30
>>465
このスレではC++が使えない環境のことは考えなくていいんでは
boostは使えないかもしれないけど
0467デフォルトの名無しさん2005/07/25(月) 15:01:06
boostが駄目でもstd::getlineがある。こいつに','を指定すれば……。

もちろんboost::tokenizerとは挙動がいろいろと違うけれどね。
0468デフォルトの名無しさん2005/07/25(月) 15:29:25
マルチバイト文字の罠もあるね。
0469デフォルトの名無しさん2005/07/25(月) 16:43:56
CSVは""の扱いとかウザい
素直にTSVつかっとけよ
0470デフォルトの名無しさん2005/07/25(月) 19:52:55
>>469
毎回コーディングし直すからうざいんちゃうの?
0471デフォルトの名無しさん2005/07/25(月) 20:14:47
MTじゃなさ気だし、strtok()使うのが吉。
0472デフォルトの名無しさん2005/07/25(月) 20:26:12
strtok()使うくらいならsscanf()でいいじゃない。
0473デフォルトの名無しさん2005/07/26(火) 04:59:30
野球におけるピッチャーの防御率は,9回あたりの失点数で計算します.
なので,低い程よくなります.そこで,1試合ごとの投球回数と失点数
を入力し,「全試合を通しての防御率」と「最近5試合の防御率」を入
力するたびに計算するプログラムを作ってください.ただし,1/3 回
のようなアウトカウントによる投球回数は考えず,投球回数単位で計算
するものとします.

下の表に出ている値で正しいかどうかを確認してください.

なお,最大140試合まで入力できるようにしてください.また,
日本のプロ野球では,延長戦は12回までなので,投球回数に12より
大きい数値は入らないようにしてください.
0474デフォルトの名無しさん2005/07/26(火) 06:08:09
>>473
マルチ氏ね。そもそもスレ違い
0475デフォルトの名無しさん2005/07/26(火) 07:33:55
質問です。
クラスの継承で、アクセスコントロールをメンバ関数個別に設定する事は可能でしょうか?
たとえば、

class A{
  ...
  public:
  void Func1();
  void Func2();
};

class B : public A{
  ...
};

の時、
「クラスAのオブジェクト → 外部からFunc1,Func2両方アクセスできる」
という条件を維持したままで、
「クラスBのオブジェクト → 外部からFunc1はアクセス可だが、Func2は不可」
のような設定を実現する方法はあるでしょうか。
04764752005/07/26(火) 07:45:43
すいません、自己解決しますた。
継承先のクラスでprivateで多重定義すればよかったですね。
0477デフォルトの名無しさん2005/07/26(火) 08:26:46
>>476
class A {
public:
  void Func1();
  void Func2();
};

class B : public A {
  void Func2();
};
こういうことならこうできるけどいい?
B obj;
obj.A::Func2();
0478デフォルトの名無しさん2005/07/26(火) 09:05:15
private継承ということではなかろうか。

で、再定義するよりも、public部で公開したいものをusingする方が
メンテ上ベターでしょう。
04794752005/07/26(火) 11:15:22
>>477-478 回答ありがとうございました。

>private継承ということではなかろうか。
はい、そうです。
478さんの方法を試してみます。
勉強になります。
04804752005/07/26(火) 13:09:40
たびたびすいません。

private継承して継承先からはアクセス不可にしておきたい基底クラスのメンバはごく一部で、
継承先のpublic部でusingして公開しようとしているメンバの方が数が圧倒的に多いです。

そのため、今478さんの方法を試そうとしているのですが、
継承先のpublic部にかなりたくさんのusing記述をする事になってしまいそうです。

他に、継承先クラスから基底クラスの一部のメンバだけを個別にアクセス制限
できるような方法はないものでしょうか。

継承クラス関係で調べているのですがなかなかそういう方法がみつかりません。
0481デフォルトの名無しさん2005/07/26(火) 13:16:47
>>480
無理かもしれんが、クラスがでかすぎるようなら
役割でクラスを分割して複数のオブジェクトにするといいかも
0482デフォルトの名無しさん2005/07/26(火) 13:17:54
>>480
struct base
{
void a();
void b();
void c();
};

struct derived : base
{
private:
void c() { base::c(); }
}:
0483デフォルトの名無しさん2005/07/26(火) 13:18:59
>>480
publicで継承して、見せたくない部分だけprivateでusingすればいいんじゃね?
0484デフォルトの名無しさん2005/07/26(火) 15:22:06
>>480
>private継承して継承先からはアクセス不可にしておきたい基底クラスのメンバはごく一部で、
>継承先のpublic部でusingして公開しようとしているメンバの方が数が圧倒的に多いです。
を理由に

>>482
>publicで継承して、見せたくない部分だけprivateでusingすればいいんじゃね?
はあんまり良くないと思うよ
public継承ってことは
基底クラスの参照ポインタで普通にアクセスできてしまうからね
0485デフォルトの名無しさん2005/07/26(火) 16:18:19
#include <iostream.h>

char *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:00
>>485
std::string
0487デフォルトの名無しさん2005/07/26(火) 16:35:50
> 何か良い方法は有りませんか?
{まず、中括弧をキモイ位置に配置するのはやめなさい。
}

const char* run() {
 const char*dp="running";
 return dp;
}
0488デフォルトの名無しさん2005/07/26(火) 16:40:04
char *run(char*s){
    char *dp="running";
    return strcpy(s,dp);
}
0489デフォルトの名無しさん2005/07/26(火) 16:55:40
>>486-488 すみません、どうも有難う御座いました
0490デフォルトの名無しさん2005/07/26(火) 17:09:32
>>485
>#include <iostream.h>
アナクロすぎ。

文字列を返す関数が欲しいだけなら
const char * run() {return "running";}
でいい。
0491デフォルトの名無しさん2005/07/26(火) 20:17:08
コンストラクタが自動的に継承されない理由って何?
template使うときにこれが障害になることがかなり多いんだけど。
0492デフォルトの名無しさん2005/07/26(火) 20:28:56
>>491
え? そういう必要があるときに template 使うよ??
0493デフォルトの名無しさん2005/07/26(火) 20:31:39
質問です

for ( 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
>>493
型は1つですよ
0495デフォルトの名無しさん2005/07/26(火) 20:33:43
>>493
unsigned は予約語なので変数名になれない
コンパイラは心を持たない
04964932005/07/26(火) 20:34:18
>初期値に宣言でおけるのは1つだけ?
ちと言葉足らずでしたが
for内だけのスコープを持つ変数宣言は1つしかできないのか?
という意味です
for ( a = 0, b = 0; a < 10; a++, b++ )
ができるのはわかっています。
04974932005/07/26(火) 20:34:54
あら、1つだったのね・・
いくつでもできる気がしてた・・
0498デフォルトの名無しさん2005/07/26(火) 20:36:43
>>493
俺んとこではダメだったけど、これなら通ってもよさそうな気がする
for ( (int a = 0), (unsigned int b = 0); a < 10; a++, b++ ) {
}
0499デフォルトの名無しさん2005/07/26(火) 20:37:56
>>498
そいつは無理な相談
0500デフォルトの名無しさん2005/07/26(火) 20:38:32
>>499
なんで?
0501デフォルトの名無しさん2005/07/26(火) 20:46:55
>>500
規格の文法上不可能だから。
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)
05024932005/07/26(火) 21:04:07
for ( a = 0, b = 0; a < 10; a++, b++ )
↑はgcc拡張だったぽ・・
通常規約上だめなのかも・・ちなみにVCだめ
gccばっかつかってたためか標準でおkかとおもてた
orz
0503デフォルトの名無しさん2005/07/26(火) 21:04:49
>>501
オブジェクトの定義を囲う括弧が実行文でなくなる制限についての関連事項はどこだ?
0504デフォルトの名無しさん2005/07/26(火) 21:12:40
関数の名前のつけかたなのですが
namespace
で細かい分類をするのって薦められるやりかたなのでしょうか?

こんな感じです

MyLib::SubsDataA::sub1(){ .. }

MyLib::SubsDataB::sub1(){ .. }

MyLib::SubsDataC::sub1(){ .. }
0505デフォルトの名無しさん2005/07/26(火) 21:14:01
>503
それを>501はそのまんま書いているわけなんだけど……。
もしかして規格書の文法記述読めない?
0506デフォルトの名無しさん2005/07/26(火) 21:18:49
>>503
for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。
05075012005/07/26(火) 21:24:28
>>503
for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。
05085012005/07/26(火) 21:27:55
>>503
for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。
05095012005/07/26(火) 21:30:02
>>503
for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。
0510デフォルトの名無しさん2005/07/26(火) 21:30:21
読めないから503みたいな事書いたんだろうね
0511デフォルトの名無しさん2005/07/26(火) 21:33:30
>>502
VCとCWで拡張なしで普通に通ったよ?
int main()
{
    int a, b;
    for (a = 0, b = 0; a < 10; a++, b++){}
}
0512デフォルトの名無しさん2005/07/26(火) 21:42:32
>>506
全然わかんねえ
何だその説明は?
0513デフォルトの名無しさん2005/07/26(火) 21:53:34
読めないなら素直にそう言えよ……
0514デフォルトの名無しさん2005/07/26(火) 21:58:45
>>506
全然わかんねえ
何だその説明は?
0515デフォルトの名無しさん2005/07/26(火) 22:04:37
自分の発言の読者の知識をどのように想定しているんだ?
0516デフォルトの名無しさん2005/07/26(火) 22:09:36
>>511
カンマ演算子自体はC時代から普通に使えるよな
05175012005/07/26(火) 22:12:36
人大杉だったのか…多重書き込みスマソ
0518デフォルトの名無しさん2005/07/26(火) 22:14:50
>511
それ(a=0, b=0)は宣言ではなくてexpressionだから。

えー、pc8鯖が強烈に重いので、多重注意しておくれ。
0519デフォルトの名無しさん2005/07/26(火) 22:20:53
>515
C++相談室で回答者やる程度にはC++と規格書の読み方に関する知識がある人間じゃない?
05205112005/07/26(火) 22:34:36
>>516
俺が書きたかったのは、>>502がおかしいということ。
05215112005/07/26(火) 23:03:00
>>518だった。
0522デフォルトの名無しさん2005/07/26(火) 23:15:07
なんで書き込めないんだ
0523デフォルトの名無しさん2005/07/27(水) 00:53:12
ある程度復活したようで。
0524デフォルトの名無しさん2005/07/27(水) 02:53:19
"C++はメモリがいくら使われるか分かる"らしいんですけど,
必要なメモリ量=実行ファイルの大きさ
で合ってます??くだらない質問ですいません。
0525デフォルトの名無しさん2005/07/27(水) 03:06:22
>>524
初めから終わりまで全く違います。
0526デフォルトの名無しさん2005/07/27(水) 03:22:34
とりあえずここは合ってる
>くだらない質問
0527デフォルトの名無しさん2005/07/27(水) 03:24:44
>>525
そのようですね。
0528デフォルトの名無しさん2005/07/27(水) 03:25:14
>>524
むしろCの方がどのくらいメモリを使うかは分かりやすいかと。
あまりそういう細かいことを知らなくても人の作った部品をうまく
組み合わせて全体を作るためのオブジェクト指向でもあるわけだし。
0529デフォルトの名無しさん2005/07/27(水) 04:05:06
構造体のメンバにstd::vectorを入れることは出来ますか?
こういう感じの。
struct A
{
int x;
int y;
std::vector<int> vect;
};
0530デフォルトの名無しさん2005/07/27(水) 04:07:45
>>529 まずやってみて、問題があったなら問題点を相談しろ。
0531デフォルトの名無しさん2005/07/27(水) 04:08:31
>>529
何がやりたいのか意味が分からん
0532デフォルトの名無しさん2005/07/27(水) 04:10:01
>>529
それは激しく環境依存。
0533デフォルトの名無しさん2005/07/27(水) 04:11:25
コンパイルできるかならできる
memcpyとかでは使えない
0534デフォルトの名無しさん2005/07/27(水) 04:12:25
可変データを扱う場合はclassを使うべき
コピーコンストラクタを持たせるべき
0535デフォルトの名無しさん2005/07/27(水) 04:30:49
>>532
いったいどこが?
0536デフォルトの名無しさん2005/07/27(水) 04:56:15
現実的には、C++の構造体=デフォルトのアクセス制限がpublicなclassだから、
structの中にstd::vectorを入れることはできるし、std::vectorを使うことが直接的な問題は引き起こさない。

ただし、セオリーとして、std::vectorを使うときはコンストラクタでだいたいの大きさを指定する:
A() : vect(1000) {} // A::vectはほとんどのケースで1000程度の要素数を持つと予想されるとき
これはパフォーマンスのためと、そのクラスがどの程度のデータを扱うことを想定しているかのヒントのため。

>>534
コピーコンストラクタは、ポインタをメンバに持つときに定義するべきでは?
std::vectorなら、コンパイラが暗黙に定義するコピーコンストラクタで問題ないはず。
0537デフォルトの名無しさん2005/07/27(水) 06:38:37
>>519
全然わかんねえ
何だその説明は?
0538デフォルトの名無しさん2005/07/27(水) 06:58:01
std::vectorのようにコンストラクタを持つデータを構造体の中に入れちゃったら
それはクラスになっちゃうのでクラスの性質がよくわからない人はやっちゃダメです。
0539デフォルトの名無しさん2005/07/27(水) 07:29:05
クラスになると言うより、PODでなくなると言う方が適切だと思う。
0540デフォルトの名無しさん2005/07/27(水) 09:41:33
>>536
ん? そういうヒントのためにはvector::reserveを使うべきでは?
いや、最初から1000の要素が必要ならそれでも良いけど。
0541デフォルトの名無しさん2005/07/27(水) 11:17:38
>>534 そんなルールはありません。
>>536 そんなセオリーもありません。プログラムの都合にあわせて好きにすればいいはずです。
>>538 C++での「クラス」と「構造体」に性質の違いはありません。
0542デフォルトの名無しさん2005/07/27(水) 11:19:09
もううんざりするほどバカが多いね。
なにこの板。
0543デフォルトの名無しさん2005/07/27(水) 12:08:41
C++での「クラス」と「構造体」の違いなのか、他のなんというかワカラン概念での「クラス」と「構造体」なのか
そこがハッキリしてないな。
0544デフォルトの名無しさん2005/07/27(水) 12:11:19
>>543
それぐらい知ってますよ
C++でいう構造体とクラスは本質的には同じ物で、何も書かなかった時にデフォルトでpublicかprivateになるという違いがあるだけでしょう?
0545デフォルトの名無しさん2005/07/27(水) 12:52:38
>>544
じゃあ何が聞きたいんだよ
人間初心者はお断りだぞ
■ このスレッドは過去ログ倉庫に格納されています