トップページ⇒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 あたり
0652デフォルトの名無しさん2005/08/02(火) 15:31:59
>>651
あきらめろ
0653デフォルトの名無しさん2005/08/02(火) 15:32:40
>>647がどう思ってこれを書いたのか、興味があるので
説明して欲しいんだが、出てきてはくれんかな?
恥かいちゃったんでもう出てこれないか…
0654デフォルトの名無しさん2005/08/02(火) 15:52:07
作りたいだけなら、書籍よりwebでサーチした方がいいよ。
というのも、書籍だとまず数学的準備から始まって、数学的証明で終わる。
その中に時々本当にやりたいことについて説明した数式が入ってる。
基礎を押さえて勉強したいとか、信号処理の研究をしたいとかならいざしらず
単にプログラムが書ければよければ信号処理 fft wavelet等でgoogleおすすめ
0655デフォルトの名無しさん2005/08/02(火) 20:37:37
C言語からC++に乗り換えようと思って
独習C++って本を買おうと思ってます。

C言語については
基礎的な事はある程度できると思いますが
使いこなせていない状況です。

こんなヘッポコレベルの私でも独習C++を理解することができて
また、C++を使いこなすことができますか?
0656デフォルトの名無しさん2005/08/02(火) 20:40:12
うん
0657デフォルトの名無しさん2005/08/02(火) 20:41:22
わかりました
早速アメゾネで注文してきます。
0658デフォルトの名無しさん2005/08/02(火) 20:44:36
運の間違いじゃないか?
0659デフォルトの名無しさん2005/08/02(火) 20:45:37
>>658さんの発言で迷いました。
どなたか 最後の決断をたのみます。
0660デフォルトの名無しさん2005/08/02(火) 20:47:13
647 晒しage
0661デフォルトの名無しさん2005/08/02(火) 20:56:35
何がしたいかにも寄るけど・・・

Cが「使いこなせてない」と感じる理由が、最近のソフトやフレームワークが
C++ で書かれていることが多いから、ということなら C++ に移行する意味はある。

そうではなく、C で書かれた様々なもののソースを観てもピンとこないというのなら、
C++ に移行したところで何がどうなるとも思えないので VB や C# や Mathmatica
や perl など適当に優しげなものに移行すべきかと思う。
0662デフォルトの名無しさん2005/08/02(火) 21:05:46
>>661さん
とてもよい、アドヴァイスありがとうございます。
私はゲームプログラマーを志望しているのですが
ゲームについてのアルゴリズムを
ゲームのアルゴリズムについて書かれている本やウェブサイトで学んでいます。

私C++に移行したいと思った理由は
C++を元に解説をしている書物などがあるからです。

というわけで アマゾネで注文することを決めました。
0663デフォルトの名無しさん2005/08/02(火) 21:09:10
どちらの国の方ですか?
0664デフォルトの名無しさん2005/08/02(火) 21:13:16
特定ロケールに依存するなタコ
0665デフォルトの名無しさん2005/08/02(火) 21:14:13
ごめんなさい、私は言葉が不自由な人間なので
翻訳ソフトで翻訳されたような 日本語でしたね

日本人なので、安心してください>>663さん
0666デフォルトの名無しさん2005/08/02(火) 21:28:53
>>646
sox
audacity
ソフトだとこのあたりが参考になると思う
0667デフォルトの名無しさん2005/08/02(火) 21:29:56
>>663
日本人だからと言って日本語が話せるとは限らない。
0668デフォルトの名無しさん2005/08/03(水) 02:23:58
結局>646に関しては、
音声データだと思っている香具師と、
波形データと思っている香具師と、
意図的に混乱させている香具師と、
その他の悪乗りがレスしているものの
本人が出てこないもんだから決着つかない罠。
0669デフォルトの名無しさん2005/08/03(水) 05:49:15
わざわざ難しく解釈して悦に入っている香具師が一人いるだけの希ガス
0670デフォルトの名無しさん2005/08/03(水) 11:50:10
悦にっていうか、このままじゃ自分だけが馬鹿ってことで決着しちゃうから、
何とか「真相は闇の中」的オチに持っていこうとしてるんでしょう。彼が。
0671デフォルトの名無しさん2005/08/03(水) 11:57:21
結局、音声データファイルをWAVEファイルと言ってたって落ちでよさそうですが。
0672デフォルトの名無しさん2005/08/03(水) 12:54:26
671=647?
06736392005/08/03(水) 14:51:14
結局こんな風にした。CGiveValueMethodFunctorはFunctorでなくて関数ポインターにしたかったけど、なぜかコンストラクターが関数ポインターを受け取らないのでFunctorにした
template <class CValue,class CGiveValueMethodFunctor>
class CValueWithGivenFlag
{
public:
bool given;
CValue value_;
CGiveValueMethodFunctor giveMethod_;
CValueWithGivenFlag(CGiveValueMethodFunctor &giveMethod):giveMethod_(giveMethod), given(false){}
CValueWithGivenFlag(CValue &valueInput, CGiveValueMethodFunctor &giveMethod): giveMethod_(giveMethod), given(true), value_(valueInput){}
CValue & value(){
if(given){
return value_;
}else{
giveMethod_(value_, given);
return value_;
}
}
void putValue(CValue &v)
{
given=true;
value_=v;
}
};
0674デフォルトの名無しさん2005/08/03(水) 16:15:06
struct B { int member; };
std::ostream& operator<< (std::ostream& os, const B& b) { return os << b.member; }
これで、
B b; std::cout << b << std::endl;
が通る。

このベースクラスBを派生すると
struct D : public B {};
D d; std::cout << d << std::endl; // エラー
コンパイルできない。

ベースクラス用のoperator<<()を呼び出すような実装をするとき、
std::ostream& operator<< (std::ostream& os, const D& d) { この部分; }
に何を書けばいいのか教えてください。
0675デフォルトの名無しさん2005/08/03(水) 16:35:30
>>674
std::ostream& operator<< (std::ostream& os, const D& d){ return os << static_cast <const B&> (d); }
0676デフォルトの名無しさん2005/08/03(水) 17:53:36
>>674
つ〜か、VC7.1ならそのままで普通に通るんだが。
0677デフォルトの名無しさん2005/08/03(水) 17:57:50
>>675
そう書いててダメだったのでわからなかったんですが

すげースンマセン! クラス設計変えて、継承をやめてました!
どおりでinvalid static_castエラーのはずだわー
うへえー(´д`;)
06786752005/08/03(水) 18:03:28
>>676
あっほんとだ
0679デフォルトの名無しさん2005/08/03(水) 19:53:28
誰も聞いてないと思うが、その継承をやめたクラスはダライアスでいうとステージHあたりです。
多重継承はまぞくておもしろいです。
0680デフォルトの名無しさん2005/08/03(水) 20:03:21
ダライアス継承?
あれはマゾどころか魔窟だ。
0681デフォルトの名無しさん2005/08/03(水) 20:13:01
クジラとタツノコを多重継承したやつと戦ってみたい
0682デフォルトの名無しさん2005/08/03(水) 22:15:46
>>673
なんでそんなことに?
>640のほうがはるかにマシに見えるんだが。
0683デフォルトの名無しさん2005/08/04(木) 00:49:52
そういや、ダライアス継承実装したサンプルってどこかにある?
0684デフォルトの名無しさん2005/08/04(木) 13:00:57
>>683
そんなにしてほしいのか?

struct A { A() {} virtual ~A() {} };
struct B : public A { B() {} virtual ~B() {} };
struct C : public A { C() {} virtual ~C() {} };
struct D : public B { D() {} virtual ~D() {} };
struct E : public B, public C { E() {} virtual ~E() {} };
struct F : public C { F() {} virtual ~F() {} };
struct G : public D, public E { G() {} virtual ~G() {} };
struct H : public E, public F { H() {} virtual ~H() {} };
struct I : public G, public H { I() {} virtual ~I() {} };

動くかどうか検証はしていない。ご利用は計画的に。
0685デフォルトの名無しさん2005/08/04(木) 13:17:02
>>684
ダライアス継承は仮想継承にしてなんぼだろうが。
0686デフォルトの名無しさん2005/08/04(木) 15:23:14
>>685
あとは たのむ
0687デフォルトの名無しさん2005/08/04(木) 19:49:35
>>684
A::~A() が virtual になっているなら空の B::~B() を手動で定義しなくてよい
0688デフォルトの名無しさん2005/08/04(木) 22:32:20
>>687
そうなのか?てっきり全部ばらばらの働きをするデストラクタも含めて継承して
この例だとIか、あの最後の奴を継承したときどうなるかってことだと思ってたんだが。
685とあわせて全然修行不足だな。すまん。
0689デフォルトの名無しさん 2005/08/04(木) 22:56:17
動的に確保して値を代入した5次元の配列2つをあるクラスに渡すには
どうすれば?
int a[s][t][u][v][w]
int b[s][t][u][v][w]
という配列に値は入っています。
クラス (ここをどうするか)
{コンストラクタで代入はできますか}
0690デフォルトの名無しさん2005/08/04(木) 23:02:19
unko::unko((int (*manko)[s][t][u][v])) : chinko(manko) { }
0691デフォルトの名無しさん2005/08/04(木) 23:20:30
TEST::TEST(int (*kontena)[s][t][u][v])) :kontena2( kontena)
{
}
よくわかりません。解説お願いします。
これでa,b2つの配列ともクラスに渡せて、そのクラスの中で配列に入っている値を得ることが
できますか?
TEST::TEST(int 何か,int 何か){}のようなものを予想していました。
0692デフォルトの名無しさん2005/08/04(木) 23:22:24
>>691
次元を減らして考えてみろ。
0693デフォルトの名無しさん2005/08/04(木) 23:25:25
TEST::TEST(int a1[][t][u][v][w],int a2[][t][u][v][w])
{}
こういうことでしょうか?
0694デフォルトの名無しさん2005/08/04(木) 23:28:12
ありゃりゃ、括弧が2重になってるやん
あーあ俺もいいかげん焼き回ったな
0695デフォルトの名無しさん2005/08/04(木) 23:29:48
>>693
そう思ったら、聞く前にまず試してみる
0696デフォルトの名無しさん2005/08/04(木) 23:32:03
だめみたいです。
内部で新たに5次元配列を宣言して渡すという形にしたほうがいい?
動的配列だからその方法もわかりません。
0697デフォルトの名無しさん2005/08/04(木) 23:38:53
>>696
何がどうダメだったのか、分かるか?
0698デフォルトの名無しさん2005/08/04(木) 23:43:19
配列が渡ってないようです。
TEST::TEST(int a1[][t][u][v][w],int a2[][t][u][v][w])
{ここになにか}
そりゃ入れないとだめですね。

3次元動的配列をクラスに渡す場合はどうやるのでしょうか?それを応用して考えてみようを思います。
配列の渡しわからねーー。
0699デフォルトの名無しさん2005/08/04(木) 23:49:05
n次元動的配列って(1次元になるまで多重に)ループで
ひとつ低い次元の配列を要素サイズ分確保してループで埋めて作るやつかね?
そんなの自動で渡る方法なんかないっしょ。
クラス作ってコピーコンストラクタも提供でもせんと
0700デフォルトの名無しさん2005/08/04(木) 23:51:08
>>699
そうです。自動で渡る方法ないんですか?
0701デフォルトの名無しさん2005/08/05(金) 00:08:20
動的に確保したんだろ?
TEST::TEST(int***** a1,int***** a2)
これじゃまずいか
0702デフォルトの名無しさん2005/08/05(金) 00:14:33
その方法わかるんやけど、どうやって配列の値を受け取るかわかる?
こんな風にクラスのある内部関数で
int temp =a1[2][2][4][5][7];
0703デフォルトの名無しさん2005/08/05(金) 00:30:31
TEST::TEST(int***** a1,int***** a2,int s, int t, int u, int v, int w)

妥協
0704デフォルトの名無しさん2005/08/05(金) 01:16:34
つかvector使えば?
0705デフォルトの名無しさん2005/08/05(金) 01:31:13
>>689
コンストラクタで組み込み配列型メンバの初期化は制御できない。全部デフォルトの初期化になる。
つまり無理。
0706デフォルトの名無しさん2005/08/05(金) 04:07:11
>>691
配列を渡したいのか、配列へのポインタを渡すだけで良いのかによって変わる。
2次元で考えると:

class X {
int **_x, **_y;
public:
X(int **x, int **y) : _x(x), _y(y) {}
};

自分なら、配列や配列へのポインタは扱わず、多次元配列のクラスを使う。
既存品ならBoost.Multiarrayかな。
でも5次元に特化した配列クラスなら1時間もあれば書けるでしょ。
そのクラスのインスタンスを、受け取りたい関数に渡す。

void f(CMultiArray *X, CMultiArray *Y) {}
CMultiArray *A = new CMultiArray(s, t, u, v, w);
CMultiArray *B = new CMultiArray(s, t, u, v, w);
f(A, B);

または、その5次元配列がなんらかの処理とセットで使われるなら、
それらをまとめてひとつのクラスにする。

ハッキリ言って5次元配列とかnewのループまわして作るのめんどいので
配列自体をカプセル化した方が良いよ。
0707デフォルトの名無しさん2005/08/05(金) 10:37:28
コンストラクタ初期化子で
基底クラスの初期化の前に
派生クラスのオブジェクトを初期化することはできないのでしょうか?
0708デフォルトの名無しさん2005/08/05(金) 10:39:24
無理。設計を見直しましょう。
0709デフォルトの名無しさん2005/08/05(金) 10:40:50
>>707
boost::base_from_memberを使えばできる。
http://www.kmonos.net/alang/boost/classes/base_from_member.html
07107072005/08/05(金) 11:19:39
>>708,709
ありがとうございます。
先に派生クラスのメンバを持つクラスを継承しておけば初期化できるんですね。

0711デフォルトの名無しさん2005/08/05(金) 12:51:35
>>707
そもそも、派生クラスのオブジェクトに依存する基底クラスって設計がおかしい気がするのだが……
0712デフォルトの名無しさん2005/08/05(金) 13:39:57
doxygenより楽にドキュメント作る方法ないんでしょうか?
Visual Studioに便利がツールが添付されてたりとか・・・
0713デフォルトの名無しさん2005/08/05(金) 13:42:26
class Base {
  Base(){
    ((Ext*)this)->init();
    this->i = 0;
  }
};
class Ext {
    init();
};
これでひとつ。
0714デフォルトの名無しさん2005/08/05(金) 17:05:24
>>712
VBCommenter 参考にしてプラグインを”自作”。
ただし C++ 用の CodeDOM は実装されていないので、
気合でパーサ書いて、実装しないとダメかも。
0715デフォルトの名無しさん2005/08/06(土) 00:52:20
C++でsetjmp(),longjmp()を使ったら例外処理とか
まともに動く保証は無い?
0716デフォルトの名無しさん2005/08/06(土) 01:05:05
18.7.4 の意味を正確に掴め兼ねるが多分、意訳すると
「catch 句の中へ飛ぶような使い方はするなボケ」で、
それ以外は規格的には大丈夫っぽい。

解釈が間違ってたら誰かふぉろーよろしく。
0717デフォルトの名無しさん2005/08/06(土) 01:38:38
まぁ、基本的にはC++でsetjmp/longjmp使うぐらいなら例外で処理しとけ。
0718デフォルトの名無しさん2005/08/06(土) 07:50:32
>>715-716
同じ流れを例外で行えばデストラクタが呼ばれるとき、longjmpを行うと未定義と書いてある。
JIS X3014 18.7
0719デフォルトの名無しさん2005/08/06(土) 12:50:25
>>718
あー、"解体"ってのがデストラクタのことか。
俺も JIS X3014 を見てたんだけど、
ISO/IEC 14882 のほうがやっぱり読みやすいね。
0720デフォルトの名無しさん2005/08/06(土) 15:37:27
随伴って何のことかと思ったよ
0721デフォルトの名無しさん2005/08/06(土) 16:53:54
外部ファイルから読み取った値で,クラスのstatic const メンバー変数を初期化したいのです。
たくさんの(50くらいの)メンバーをこの方法で初期化するため,ファイルを読み込むクラスも作りました。⇒LoadFile
この方法ではうまく初期化できなかったので,別の方針をお尋ねしたいのですが…。
一度mapに全部ファイルの内容を流し込んでしまう方法も考えましたが,流し込む時点ではメンバーの型が
分からないので困っています。(外部ファイルに例えば「L=3」と書いてあっても,mapに追加する時点では
int, double, charのどれに利用するのか分からない)


#include <iostream>
#include "LoadFile.h"
using namespace std;

class Hoge {
   static const int L;
   static const double X;
public:
   int getL() const { return L; }
   double getM() const { return X; }
};

LoadFile fl("test.dat");   //ファイル名を渡すとそこから読み込んでくれるようにしました
/*fl.func();*/   //メソッドはいじれない
const int Hoge::L = 2;
/*const int Hoge::M = fl.getDouble("X");*/   //メソッドはいじれない

int main() {
   Hoge hoge;
   cout << hoge.getL() << endl;
/*  cout << hoge.getX() << endl;*/
   return 0;
}
0722デフォルトの名無しさん2005/08/06(土) 16:58:38
実行時に動的に初期化することはできません。
0723デフォルトの名無しさん2005/08/06(土) 17:07:05
>>721
なんで static const になってんの?
Hoge のインターフェースを見ると、メンバに LoadFile 持てばいいだけに見えるけど。
0724デフォルトの名無しさん2005/08/06(土) 17:09:01
class について質問です。

class A {.....};

int main() { A a[20160]; }

とするとエラーが出ます。
自分で定義したクラスの配列には、制限があるのでしょうか。お願いします。
0725デフォルトの名無しさん2005/08/06(土) 17:10:03
>>724 エラーが出るならエラーメッセージ貼れ。
0726デフォルトの名無しさん2005/08/06(土) 17:11:48
デフォルトコンストラクタがないと予想
07277242005/08/06(土) 17:16:30
SIGSEGV です。メモリのアクセス違反でしょうか。
取りあえずコンストラクタ作ってみます。リアルタイムでサンクス。
0728デフォルトの名無しさん2005/08/06(土) 17:18:55
int main(){
  char c[4ギガ]
}
0729?V?Q?S2005/08/06(土) 17:30:50
class A のサイズ576ですた(泣。
07307212005/08/06(土) 17:43:17
お二方,どうもありがとうございます。

>>722
そうですか…orz

>>723
staticなのは,Hogeのオブジェクト(複数)間で共通の定数だからですが,
定数なのでconstをつけようとして,おかしくなってきました。
もともとメンバーにLoadFileがあったので,staticだけにする方向で行きます。
0731デフォルトの名無しさん2005/08/06(土) 21:35:36
他の関数からは見えないけどサブルーチンからだけは見える変数って作れる?

関数{
  変数宣言
  サブルーチン呼び出し
}

サブルーチン{
  呼び出し元の変数使用
}

みたいに
0732デフォルトの名無しさん2005/08/06(土) 21:46:08
またきた・・・
0733デフォルトの名無しさん2005/08/06(土) 21:46:13
>>731
無理。
そういうのはインタプリタ言語じゃないと難しいと思う。
0734デフォルトの名無しさん2005/08/06(土) 21:49:28
>>731
サブルーチン内のstatic変数とかじゃダメなん?
0735デフォルトの名無しさん2005/08/06(土) 21:55:21
サブルーチンって懐かしい言葉だな
0736デフォルトの名無しさん2005/08/06(土) 22:00:16
>>731 関数とサブルーチンの違いは何なの?
0737デフォルトの名無しさん2005/08/06(土) 22:01:41
つか引数でわたしゃいいんじゃねーの?
0738デフォルトの名無しさん2005/08/06(土) 22:06:51
まず考えるのは引数で参照(or ポインタ)渡しじゃないの?
0739デフォルトの名無しさん2005/08/06(土) 22:19:07
スタックさかのぼるとか
「サブルーチンからだけは見える」は実現できないけど
0740デフォルトの名無しさん2005/08/06(土) 22:32:22
>>731
擬似的に
void func() {
    struct {
        int internal;
        void routine() {
            hoge(internal);
        }
    } sub;
    sub.routine();
}
0741デフォルトの名無しさん2005/08/06(土) 22:55:13
>>733-740
マルチすまん
なんか難しそうなことはわかった
素直に参照渡し使うことにする
0742デフォルトの名無しさん2005/08/07(日) 05:13:56
struct A
{
  A* hello()
  {
    std;;cout _<< "Hello" << std::endl;
  }
  A* operator->()
  {
    std::cout << "A::oprator->()" << std::endl;
    return this;
  }
  A* operator[](const std::string& s)
  {
    std::cout << "A::operator[]()" << std::endl;
    return this;
  }
  A* operator()()
  {
    std::cout << "A::operator()()" << std::endl;
    return this;
  }
};
int main()
{
  A a;
  a->hello()   //OK
  a->();       //error
  a->["hello"];  //error
}
operator->でA*を返してるはずなのにエラーになったりならなかったり
どういうことでしょうか? vc7.1です
0743デフォルトの名無しさん2005/08/07(日) 05:31:12
>>742
a.operator->();
a.operator()();
0744デフォルトの名無しさん2005/08/07(日) 05:34:56
>>742
なんでコピペしないで手で写してるの?
0745デフォルトの名無しさん2005/08/07(日) 09:17:25
>>742
operator []()は普通参照を返すけど。
0746デフォルトの名無しさん2005/08/07(日) 11:22:49
なんでこう的外れなレスばっか出てくるんだろう。
0747デフォルトの名無しさん2005/08/07(日) 11:45:24
夏休みだから。
0748デフォルトの名無しさん2005/08/07(日) 11:51:08
>>742
->の後にはメンバがなければならない。
[]や()はたとえオーバーロードしていようと演算子だから->の後には続けられない。
0749デフォルトの名無しさん2005/08/07(日) 12:17:37
>>748
"operator"も書けば呼べなくもない
0750デフォルトの名無しさん2005/08/07(日) 13:37:16
a->operator[]("hello");
0751デフォルトの名無しさん2005/08/07(日) 14:17:44
かなり初歩的な質問ですいませんが教えてください。
特別バージョンに指定するtemplate<>ですが、どうしてこれを書く必要があるのかわかりません。

template<typename T>
class C {
  // ...
};

//template<>
class C<int> {
  // ...
};

下が上の特別バージョンであることをコンパイラは判断できないんですか?
■ このスレッドは過去ログ倉庫に格納されています