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 あたり
0652デフォルトの名無しさん
2005/08/02(火) 15:31:59あきらめろ
0653デフォルトの名無しさん
2005/08/02(火) 15:32:40説明して欲しいんだが、出てきてはくれんかな?
恥かいちゃったんでもう出てこれないか…
0654デフォルトの名無しさん
2005/08/02(火) 15:52:07というのも、書籍だとまず数学的準備から始まって、数学的証明で終わる。
その中に時々本当にやりたいことについて説明した数式が入ってる。
基礎を押さえて勉強したいとか、信号処理の研究をしたいとかならいざしらず
単にプログラムが書ければよければ信号処理 fft wavelet等でgoogleおすすめ
0655デフォルトの名無しさん
2005/08/02(火) 20:37:37独習C++って本を買おうと思ってます。
C言語については
基礎的な事はある程度できると思いますが
使いこなせていない状況です。
こんなヘッポコレベルの私でも独習C++を理解することができて
また、C++を使いこなすことができますか?
0656デフォルトの名無しさん
2005/08/02(火) 20:40:120657デフォルトの名無しさん
2005/08/02(火) 20:41:22早速アメゾネで注文してきます。
0658デフォルトの名無しさん
2005/08/02(火) 20:44:360659デフォルトの名無しさん
2005/08/02(火) 20:45:37どなたか 最後の決断をたのみます。
0660デフォルトの名無しさん
2005/08/02(火) 20:47:130661デフォルトの名無しさん
2005/08/02(火) 20:56:35Cが「使いこなせてない」と感じる理由が、最近のソフトやフレームワークが
C++ で書かれていることが多いから、ということなら C++ に移行する意味はある。
そうではなく、C で書かれた様々なもののソースを観てもピンとこないというのなら、
C++ に移行したところで何がどうなるとも思えないので VB や C# や Mathmatica
や perl など適当に優しげなものに移行すべきかと思う。
0662デフォルトの名無しさん
2005/08/02(火) 21:05:46とてもよい、アドヴァイスありがとうございます。
私はゲームプログラマーを志望しているのですが
ゲームについてのアルゴリズムを
ゲームのアルゴリズムについて書かれている本やウェブサイトで学んでいます。
私C++に移行したいと思った理由は
C++を元に解説をしている書物などがあるからです。
というわけで アマゾネで注文することを決めました。
0663デフォルトの名無しさん
2005/08/02(火) 21:09:100664デフォルトの名無しさん
2005/08/02(火) 21:13:160665デフォルトの名無しさん
2005/08/02(火) 21:14:13翻訳ソフトで翻訳されたような 日本語でしたね
日本人なので、安心してください>>663さん
0666デフォルトの名無しさん
2005/08/02(火) 21:28:53sox
audacity
ソフトだとこのあたりが参考になると思う
0667デフォルトの名無しさん
2005/08/02(火) 21:29:56日本人だからと言って日本語が話せるとは限らない。
0668デフォルトの名無しさん
2005/08/03(水) 02:23:58音声データだと思っている香具師と、
波形データと思っている香具師と、
意図的に混乱させている香具師と、
その他の悪乗りがレスしているものの
本人が出てこないもんだから決着つかない罠。
0669デフォルトの名無しさん
2005/08/03(水) 05:49:150670デフォルトの名無しさん
2005/08/03(水) 11:50:10何とか「真相は闇の中」的オチに持っていこうとしてるんでしょう。彼が。
0671デフォルトの名無しさん
2005/08/03(水) 11:57:210672デフォルトの名無しさん
2005/08/03(水) 12:54:260673639
2005/08/03(水) 14:51:14template <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:06std::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:30std::ostream& operator<< (std::ostream& os, const D& d){ return os << static_cast <const B&> (d); }
0676デフォルトの名無しさん
2005/08/03(水) 17:53:36つ〜か、VC7.1ならそのままで普通に通るんだが。
0677デフォルトの名無しさん
2005/08/03(水) 17:57:50そう書いててダメだったのでわからなかったんですが
すげースンマセン! クラス設計変えて、継承をやめてました!
どおりでinvalid static_castエラーのはずだわー
うへえー(´д`;)
0679デフォルトの名無しさん
2005/08/03(水) 19:53:28多重継承はまぞくておもしろいです。
0680デフォルトの名無しさん
2005/08/03(水) 20:03:21あれはマゾどころか魔窟だ。
0681デフォルトの名無しさん
2005/08/03(水) 20:13:010682デフォルトの名無しさん
2005/08/03(水) 22:15:46なんでそんなことに?
>640のほうがはるかにマシに見えるんだが。
0683デフォルトの名無しさん
2005/08/04(木) 00:49:520684デフォルトの名無しさん
2005/08/04(木) 13:00:57そんなにしてほしいのか?
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ダライアス継承は仮想継承にしてなんぼだろうが。
0686デフォルトの名無しさん
2005/08/04(木) 15:23:14あとは たのむ
0687デフォルトの名無しさん
2005/08/04(木) 19:49:35A::~A() が virtual になっているなら空の B::~B() を手動で定義しなくてよい
0688デフォルトの名無しさん
2005/08/04(木) 22:32:20そうなのか?てっきり全部ばらばらの働きをするデストラクタも含めて継承して
この例だとIか、あの最後の奴を継承したときどうなるかってことだと思ってたんだが。
685とあわせて全然修行不足だな。すまん。
0689デフォルトの名無しさん
2005/08/04(木) 22:56:17どうすれば?
int a[s][t][u][v][w]
int b[s][t][u][v][w]
という配列に値は入っています。
クラス (ここをどうするか)
{コンストラクタで代入はできますか}
0690デフォルトの名無しさん
2005/08/04(木) 23:02:190691デフォルトの名無しさん
2005/08/04(木) 23:20:30{
}
よくわかりません。解説お願いします。
これでa,b2つの配列ともクラスに渡せて、そのクラスの中で配列に入っている値を得ることが
できますか?
TEST::TEST(int 何か,int 何か){}のようなものを予想していました。
0692デフォルトの名無しさん
2005/08/04(木) 23:22:24次元を減らして考えてみろ。
0693デフォルトの名無しさん
2005/08/04(木) 23:25:25{}
こういうことでしょうか?
0694デフォルトの名無しさん
2005/08/04(木) 23:28:12あーあ俺もいいかげん焼き回ったな
0695デフォルトの名無しさん
2005/08/04(木) 23:29:48そう思ったら、聞く前にまず試してみる
0696デフォルトの名無しさん
2005/08/04(木) 23:32:03内部で新たに5次元配列を宣言して渡すという形にしたほうがいい?
動的配列だからその方法もわかりません。
0697デフォルトの名無しさん
2005/08/04(木) 23:38:53何がどうダメだったのか、分かるか?
0698デフォルトの名無しさん
2005/08/04(木) 23:43:19TEST::TEST(int a1[][t][u][v][w],int a2[][t][u][v][w])
{ここになにか}
そりゃ入れないとだめですね。
3次元動的配列をクラスに渡す場合はどうやるのでしょうか?それを応用して考えてみようを思います。
配列の渡しわからねーー。
0699デフォルトの名無しさん
2005/08/04(木) 23:49:05ひとつ低い次元の配列を要素サイズ分確保してループで埋めて作るやつかね?
そんなの自動で渡る方法なんかないっしょ。
クラス作ってコピーコンストラクタも提供でもせんと
0700デフォルトの名無しさん
2005/08/04(木) 23:51:08そうです。自動で渡る方法ないんですか?
0701デフォルトの名無しさん
2005/08/05(金) 00:08:20TEST::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妥協
0704デフォルトの名無しさん
2005/08/05(金) 01:16:340705デフォルトの名無しさん
2005/08/05(金) 01:31:13コンストラクタで組み込み配列型メンバの初期化は制御できない。全部デフォルトの初期化になる。
つまり無理。
0706デフォルトの名無しさん
2005/08/05(金) 04:07:11配列を渡したいのか、配列へのポインタを渡すだけで良いのかによって変わる。
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:240709デフォルトの名無しさん
2005/08/05(金) 10:40:50boost::base_from_memberを使えばできる。
http://www.kmonos.net/alang/boost/classes/base_from_member.html
0711デフォルトの名無しさん
2005/08/05(金) 12:51:35そもそも、派生クラスのオブジェクトに依存する基底クラスって設計がおかしい気がするのだが……
0712デフォルトの名無しさん
2005/08/05(金) 13:39:57Visual Studioに便利がツールが添付されてたりとか・・・
0713デフォルトの名無しさん
2005/08/05(金) 13:42:26Base(){
((Ext*)this)->init();
this->i = 0;
}
};
class Ext {
init();
};
これでひとつ。
0714デフォルトの名無しさん
2005/08/05(金) 17:05:24VBCommenter 参考にしてプラグインを”自作”。
ただし C++ 用の CodeDOM は実装されていないので、
気合でパーサ書いて、実装しないとダメかも。
0715デフォルトの名無しさん
2005/08/06(土) 00:52:20まともに動く保証は無い?
0716デフォルトの名無しさん
2005/08/06(土) 01:05:05「catch 句の中へ飛ぶような使い方はするなボケ」で、
それ以外は規格的には大丈夫っぽい。
解釈が間違ってたら誰かふぉろーよろしく。
0717デフォルトの名無しさん
2005/08/06(土) 01:38:380718デフォルトの名無しさん
2005/08/06(土) 07:50:32同じ流れを例外で行えばデストラクタが呼ばれるとき、longjmpを行うと未定義と書いてある。
JIS X3014 18.7
0719デフォルトの名無しさん
2005/08/06(土) 12:50:25あー、"解体"ってのがデストラクタのことか。
俺も JIS X3014 を見てたんだけど、
ISO/IEC 14882 のほうがやっぱり読みやすいね。
0720デフォルトの名無しさん
2005/08/06(土) 15:37:270721デフォルトの名無しさん
2005/08/06(土) 16:53:54たくさんの(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:380723デフォルトの名無しさん
2005/08/06(土) 17:07:05なんで static const になってんの?
Hoge のインターフェースを見ると、メンバに LoadFile 持てばいいだけに見えるけど。
0724デフォルトの名無しさん
2005/08/06(土) 17:09:01class A {.....};
int main() { A a[20160]; }
とするとエラーが出ます。
自分で定義したクラスの配列には、制限があるのでしょうか。お願いします。
0725デフォルトの名無しさん
2005/08/06(土) 17:10:030726デフォルトの名無しさん
2005/08/06(土) 17:11:480727724
2005/08/06(土) 17:16:30取りあえずコンストラクタ作ってみます。リアルタイムでサンクス。
0728デフォルトの名無しさん
2005/08/06(土) 17:18:55char c[4ギガ]
}
0729?V?Q?S
2005/08/06(土) 17:30:500730721
2005/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:080733デフォルトの名無しさん
2005/08/06(土) 21:46:13無理。
そういうのはインタプリタ言語じゃないと難しいと思う。
0734デフォルトの名無しさん
2005/08/06(土) 21:49:28サブルーチン内のstatic変数とかじゃダメなん?
0735デフォルトの名無しさん
2005/08/06(土) 21:55:210736デフォルトの名無しさん
2005/08/06(土) 22:00:160737デフォルトの名無しさん
2005/08/06(土) 22:01:410738デフォルトの名無しさん
2005/08/06(土) 22:06:510739デフォルトの名無しさん
2005/08/06(土) 22:19:07「サブルーチンからだけは見える」は実現できないけど
0740デフォルトの名無しさん
2005/08/06(土) 22:32:22擬似的に
void func() {
struct {
int internal;
void routine() {
hoge(internal);
}
} sub;
sub.routine();
}
0741デフォルトの名無しさん
2005/08/06(土) 22:55:13マルチすまん
なんか難しそうなことはわかった
素直に参照渡し使うことにする
0742デフォルトの名無しさん
2005/08/07(日) 05:13:56{
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:12a.operator->();
a.operator()();
0744デフォルトの名無しさん
2005/08/07(日) 05:34:56なんでコピペしないで手で写してるの?
0745デフォルトの名無しさん
2005/08/07(日) 09:17:25operator []()は普通参照を返すけど。
0746デフォルトの名無しさん
2005/08/07(日) 11:22:490747デフォルトの名無しさん
2005/08/07(日) 11:45:240748デフォルトの名無しさん
2005/08/07(日) 11:51:08->の後にはメンバがなければならない。
[]や()はたとえオーバーロードしていようと演算子だから->の後には続けられない。
0749デフォルトの名無しさん
2005/08/07(日) 12:17:37"operator"も書けば呼べなくもない
0750デフォルトの名無しさん
2005/08/07(日) 13:37:160751デフォルトの名無しさん
2005/08/07(日) 14:17:44特別バージョンに指定するtemplate<>ですが、どうしてこれを書く必要があるのかわかりません。
template<typename T>
class C {
// ...
};
//template<>
class C<int> {
// ...
};
下が上の特別バージョンであることをコンパイラは判断できないんですか?
■ このスレッドは過去ログ倉庫に格納されています