[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/13 10:33 / Filesize : 185 KB / Number-of Response : 779
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part66



1 名前:デフォルトの名無しさん [2009/01/11(日) 11:21:38 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part65
pc11.2ch.net/test/read.cgi/tech/1230341243/

596 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 05:50:11 ]
>>586
毒舌っていうのは理性と知性によって導き出されるものだよ。
馬鹿な人間が感情のままに吐くのは、面白味も攻撃力も無い単なる罵倒。

597 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 15:16:18 ]
>>596
まぁ、すてきな毒舌なこと。

598 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 15:51:35 ]
>>596
>馬鹿な人間が
自虐?

599 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:04:21 ]
ごめん、何に噛み付いてるのかよくわからない。
メイヤーズやサッターが理性的でないと言いたいのか、
それとも「毒舌というのが知性や理性の欠如から出るものなんだ」と主張したいのか、
それとも普段の自分が否定されたみたいで悔しいのか。

600 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:19:14 ]
ごめん、何を必死に弁解してるかわからない。


いや、マジで

601 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:23:39 ]
>>599
かみつくという認識もないくらい、ただの脊髄反射煽りだから気にすんな。

602 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:24:42 ]
>>601
そうやって煽り返すから荒れるんだよ
もう少し自重しようよ

603 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 17:02:39 ]
>599はどのレスの人間で、どのレスに噛み付かれたのかと思ったんだ?


604 名前:デフォルトの名無しさん [2009/04/13(月) 17:21:35 ]
メイヤーズやサッターが知性も理性の欠片もない。
面白味も攻撃力も無い単なる罵倒。



605 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 17:40:10 ]
わどらー

606 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:21:38 ]
プログラム中でint型の変数を2種類(a,bとする)定義し、その2つによって複
素数の型の要素を持つa列b行の2次元配列を定義したいのですが、

------
#include <iostream>
#include <complex>

using namespace std;

void main(){
 int a,b;
 complex<double> c[][];

 cin >> a;
 cin >> b;

 complex<double> *c = new int[a][b];
------

これでエラーが多発してしまいます。
配列の定義に問題があれば教えていただけないでしょうか。

607 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:25:00 ]
std::vector<std::vector<std::complex<double> > > c(a, std::vector<std::complex<double> >(d));

608 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:27:27 ]
>complex<double> *c = new int[a][b];

型が違うからね。
>>607 の方法が一番素直なやり方と思う。

609 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:28:31 ]
×(d)
○(b)

610 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:29:35 ]
std::vectorならresize()メソッドが使えるから後から大きさを変更する事もできる
アクセスは c[1][2] のように書ける

611 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:51:41 ]
Boostを使ってもいいなら、boost::multi_arrayを検討してみるのもいい。

612 名前:デフォルトの名無しさん [2009/04/13(月) 22:26:09 ]
file 1

template<class T> class Parent {
void Umu() { Child* p = new Child; p->Method() }
};

file 2

template< class T > class Child {
void Umaseru() { m_pParent->Umu(); }
}

テンプレの場合、実装部分をcppに退避する事ができないので、
上記のような相互参照するクラスのテンプレートって実装できないのでしょうか?

613 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:29:15 ]
先行宣言すればいいよ

614 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:46:20 ]
先行宣言しても、そのクラスのメンバ呼出ししてたらコンパイルできない気がする。



615 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:03:59 ]
基底クラス内にあるクラスは派生クラスで特殊化可能ですか?

616 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 07:26:03 ]
a Gr bner basis

617 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 09:59:34 ]
template<class T> class Parent {
void Umu();
};

template< class T > class Child {
void Umaseru() { m_pParent->Umu(); }
}

template<class T>
void Parent::Umu() { Child<T>* p = new Child<T>; p->Method() }

618 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 06:30:03 ]
質問です。お時間あればよろしくお願いします。
--------------------------------
class Base
{
// 省略
    virtual size_t getSize() const { return sizeof(*this); }
};

class Derived : public Base
{
// 省略
};

int main()
{
    Derived d;
    d.getSize();

--------------------------------
d.getSize()の値がBaseなのですが、自分が期待していたのはDerivedのサイズの取得です。
DerivedではgetSize()を定義せず、
Derivedのサイズを返すメンバ関数をBaseで定義することはできるでしょうか?
何か良い方法があれば教えていただきたいです。


619 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 06:57:06 ]
>>618
もし、Derivedにprivateなメンバ関数を追加することが許されるのであれば、
BaseとDerivedに、それぞれsizeof(Base)とsizeof(Derived)を返すprivateでvirtualなメンバ関数を追加する。
で、Base::getSize() からはそれを呼び出すようにする。

原則としてsizeofの値はコンパイル時に決まるのであり、実行時の型で決まるものではないことに注意。
(C99の可変長配列は例外となる。)

620 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 08:53:01 ]
>>619
早速の返答ありがとうございます。
なるほどサイズは動的に決まるわけではないんですね。
そもそもこんな事をしたくなる設計がよくないんでしょうかね…


621 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 10:19:50 ]
ifstreamでバイナリファイルを読み込んでいます。
現在の読み込み位置のアドレスを知る方法はないのでしょうか?
operator>>で読み込むたびにカウントするしかないのでしょうか?

622 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 11:18:42 ]
>>621
tellg()

623 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 12:05:18 ]
ファイルサイズはseek+tellで得るのが定石だった頃が俺にもありました

624 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 13:02:25 ]
>>620
もしよければ、なんでサイズを取得する必要があるのかを教えてくれないか。
今までそういう場面に遭遇したことがない。
インスタンスの正体を調べたいなら、getClassのインプリメントなりdynamic_caseで済むと思うが・・・



625 名前:592 mailto:sage [2009/04/16(木) 13:48:03 ]
>>593
>>595
ありがとうございます。

どうやら私のstatic関数への理解がおかしいみたいなので、
勉強してきます。

なんか同じstaticという予約語を使っていながら、
使い方しだいでだいぶ意味が違う気がするんですが・・・。


626 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 17:28:05 ]
>>625
> なんか同じstaticという予約語を使っていながら、
> 使い方しだいでだいぶ意味が違う気がするんですが・・・。
いかにもそのとおり。
それが嫌なので、C++ではグローバルでstaticなものを宣言する代わりに、無名名前空間が推奨されている。

627 名前:621 mailto:sage [2009/04/16(木) 19:05:12 ]
>>622
ありがとうございます
おかげさまで tellg, tellp, seekp, seekg 等を知ることができ
無事プログラムを動かすことができました

628 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 21:08:54 ]
C++のifstreamではtellp==tellg、seekp==seekgなんだよな

stringstreramではtellp!=tellg、seekp!=seekgなのに

この事に気づくのに手間取ってしまった

629 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 22:30:06 ]
ifstreamにtellp、seekpは無いっしょ

630 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 22:40:31 ]
>>629
ある
普通に使える
が、tellpはtellgと同じ意味になるし、seekpはseekgと同じ意味になる
やってみそ

631 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 22:44:14 ]
たしかfstreamでもpとgのシーク位置は連動するはず。

632 名前:629 mailto:sage [2009/04/16(木) 22:53:10 ]
>>630
fstreamにはpとg両方あるけど、ifstreamにはgしかなくね?

633 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 22:58:26 ]
>>632
悪い
fstreamでなくてifstreamだったか
酔ってるスマソ

634 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 00:17:13 ]
Windows XPのコマンドプロンプト画面から
 g++ hoge.cpp piyo.cpp
みたいな感じで使えて、
標準準拠性も良くて、無料な
コンパイラ(リンカ付き)ってありませんか?

g++を使っていて、エラーメッセージがイミフな時に別のコンパイラで試すのに使いたいんです。
VC++だとコマンドから使えないですよね?




635 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 00:18:42 ]
つかえますよ。

636 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 00:22:43 ]
>>635
まぢすか。
VC++が使えれば文句ありません。

もう一度調べ直してきます。

637 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 05:27:19 ]
windowsで無料で使えて新しめってg++とcl位?


638 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 06:39:15 ]
ちょっとスレ違いになってしまうかもしれないんですが、
巷で言われているメモリプール化というのをしようとしてるんですけど
概念として教えてもらいたいものがあります。

ヒープ領域とは全体の確保されたメモリ
チャンク領域とはこれから使う為にヒープ領域から必要なだけ小出しに取ってきたメモリ

って感じでいいんでしょうか?
プールとは?チャンクと同じような概念でよろしいでしょうか?


639 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 07:06:21 ]
ヒープ領域 newでシステムから借りてきたメモリ領域。

プール=確保したもの、プール金とかのプールと意味は同じ。予めシステムから借りておく。
お金が必要なたびにいちいちATMに逝くのではなく、必要になる前に家に現金を置いておくイメージ。

チャンク=こまぎれ。
数バイト毎とかでチマチマ確保すると効率が悪いので、大きな単位で確保する。

必要な額だけをATMからおろすのではなく、必要な額を10万円単位で切り上げておろす、みたいなイメージ。
1万円必要になったら10万円おろし、
11万必要になったら20万円おろす。

640 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 08:00:39 ]
その手の比喩は、7-8割理解できている人間に「トドメの刺す」のには有効だけど、
初期に読まされると余計混乱すると思うよ。

641 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 08:03:11 ]
×トドメの ○トドメを

>>638
「Effective C++」に確か、実例つきで説明があったはずだから、
それを読んでみるといいんじゃないかな。

642 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 10:10:02 ]
〜_tはtypedefの証というけど、
これは規約上予約されている?
例えば自分で
numeric_t
とかしちゃだめ?

643 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 10:33:18 ]
全然。いくら使っても大丈夫。_tamuraとか__tamuraとかも衝突しない限り使って大丈夫。

644 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 10:52:01 ]
>>643
ありがとう。
MY__M__A__C__R__O
とか予約されてるじゃん。これと同じ感じで予約されてたらやだなと思ったのだ。



645 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 12:03:25 ]
> MY__M__A__C__R__O
なんだ俺の知らない世界の話か
Cのプリプロに名前を教え込むのは極力避けたい

646 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 12:50:47 ]
>>643
_tamura はグローバルでは予約されてるから使えない。
__tamura はどこでも予約されてるから使えない。

647 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 12:53:10 ]
// main.cxx
namespace {
typedef int _INT;
}

int main() {}

std::でもグローバルでもないならおk?

648 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 12:58:46 ]
>>647
_INT みたいにアンダースコア〜英大文字で始まる名前は
ダブルアンダースコアを含む名前と同じくどこでも予約。ダメ。

649 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:04:41 ]
>>645
_が二連続した名前は予約済みなんだよ。


650 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:04:42 ]
s/_INT/_iNT/

# おk?

651 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:07:51 ]

ttp://msdn.microsoft.com/ja-jp/library/cc440188(VS.71).aspx
ここの
 予約名の形式
ってところに書いてあるね。

652 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:12:26 ]
どこの独自コンパイラだよ^^
_hoge も __fuga もうちのコンパイラは全然大丈夫だよ。

653 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:14:29 ]
>>647,650
アンダースコア〜英小文字で始まる名前はグローバルで予約されてる。
処理系がグローバルに _iNT って名前を置いてたら曖昧になっちゃうから、
すぐに未定義動作とは言えなくてもやっぱりダメだろう。

早い話、そもそもアンダースコア始まりの名前なんか使わなきゃいい。

654 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:17:02 ]
>>652
予約されてるかどうかが問題なんだよ。
今大丈夫でも、コンパイラを変えたりコンパイラのバージョンやコンパイルオプションを
変えたりしただけでエラーになるコードじゃ困るだろう。



655 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:20:52 ]
>>653
すべての識別子において、
ファイルスコープを持つ ならば グローバルスコープを持つ
ということ??

656 名前:655 mailto:sage [2009/04/17(金) 13:24:20 ]
自己解決しました

657 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:36:11 ]
>>639
なるほど!
>>641
あー、よく聞く本です。ちょっと探してこようかな…


658 名前:デフォルトの名無しさん [2009/04/17(金) 22:21:47 ]
演算子について教えてください。

(見やすさとか保守性とかは考えないとしてC++の規格上)
a と b が int 型の時、
以下の表現は問題無いでしょうか?

『 b ? a=b : a++; 』

? : よりも = の方が優先順位は低いのですが、
? と : は2個セットの演算子なので、

(b ? a) = (b : a++);

このように別々になることができず
b ? (a=b) : a++;
の解釈しか出来ないはずで、
VCでも正常にコンパイル出来、ちゃんと動作します。


659 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 22:30:15 ]
>>658
うん、大丈夫。
文法上、「論理和式 ? 式 : 代入式」となっているので問題ない。
そう、ついでに言えば、?と:の間に?:を入れ子にもできてしまうということも導かれる。

660 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 23:25:55 ]
>>659
ありがとうございます


661 名前:デフォルトの名無しさん [2009/04/17(金) 23:54:12 ]
暗黙の型変換について教えてください。

以下のようなものはdoubleからintへの暗黙の型変換は行われないのでしょうか?
私の環境ではコンパイルエラーになってしまいます。

int a[1.0];
int b = 1%1.0;
int c = 1&1.0;
enum{d=1.0};

暗黙の型変換が行われない例は他にありますでしょうか?


662 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:25:24 ]
doubleの値はintでは表現できないので暗黙に変換できない。
基本的に情報落ちが発生する方へは暗黙で変換できない。

663 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:28:31 ]
処理系によるぞ

VC9だと、

int i = 1 * 0.8;

は warning 扱いになる。(int)で黙る。


664 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:30:25 ]
型変換にはいろいろあるんだぞー
算術式での格上げとか暗黙の型変換とか



665 名前:おもち [2009/04/18(土) 00:39:16 ]
プログラム初心者なのですが、いい参考書などないでしょうか?

666 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:41:43 ]
>>665
死ね

667 名前:デフォルトの名無しさん [2009/04/18(土) 00:44:18 ]
>>666
久しぶりに激しくワラタwwwwwwwwwwww
・・・俺も寂しいな

>>665
感覚を養うために難しい本じゃなくまず
センスオブプログラミングみたいな素養本を読め
言語本は辞典代わりで十分

668 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:47:52 ]
初心者がC++・・・うーむ。
大概の入門書はCを知っていることを前提に書かれているからなぁ。
ところで、大昔javaが出たての頃に読んだ入門書は
C++を知っていること前提みたいな内容だった。
どこでもかしこでもC++との比較が載っていて、
そんなのが全体の1/4くらいを占めていた。

何も知らないで使えるのはBASICとかRubyとかそのへんかな。

669 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:56:59 ]
コンピュータのことを知らなくてもできるのはhaskellかな…
別の知識がいるけど、基本は因数分解と展開(四則演算より単純な算術)なんで
人によっては普通の言語よりわかりやすいのかもしれない
ついでにC++は普通の言語と関数型言語の難しいところだけを集めたような言語だと思ってる

670 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 01:11:16 ]
ぶっとんでるな

671 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 02:00:40 ]
>>662 >>663 >>664
関数の引数やコンストラクタはdoubleからintに暗黙的型変換が行われますよね?

int f(int a){ return 0 };
f(1.0);

int a = 1.0;

とかは大丈夫なはず。

これが大丈夫で、>>661 がダメだというのは、
規格書のどの辺に書かれているのですか?
もしわかれば教えていただけないでしょうか。


672 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 02:06:18 ]
自分で探せやカス

673 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 02:15:35 ]
>>661
> int b = 1%1.0;
がdoubleに余剰演算かけようとしてエラーになってるんじゃないの?
式の中での暗黙の型変換なんだから1の方がdoubleに変換されて
> int b = 1.0%1.0;
になると思うんだが。

>>671
それは代入時の暗黙の型変換なんだから左辺側に変換される。

674 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 08:12:20 ]
>>673
たとえば関数なら、

int a(int x,int y);
int a(double x,double y);
int b(int x,int y);
が定義されてたら、

a(1,1.0) は汎整数昇格の方が優先される為、
a(1.0,1.0) となりますが、
b(1,1.0) は b(1.0,1.0) の定義がないので
b(1,1) と変換されると思います。

%演算子の場合も同じように、1.0%1.0の定義が無いため
同じように1%1と型変換されたりしないのでしょうか?

あと、
int a[1.0];
enum{d=1.0};
これはNGですか?




675 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 10:33:21 ]
>674
> 5.6/2
>The operands of * and / shall have arithmetic or enumeration type;
>the operands of % shall have integral or enumeration type. The usual
>arithmetic conversions are performed on the operands and determine
>the type of the result.

usual arithmetic conversion は 5/9 で規定されていて幅が広がる方向の
変換しか規定されていない。

>664 や >673 の言っている通り、どういう時にどういう変換がかかるかは一つじゃない。

676 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 10:46:32 ]
> あと、
> int a[1.0];
> enum{d=1.0};
> これはNGですか?

integral constant expression ではないので NG。
論拠は7.2/1、8.3.4/1、5.19/1。

677 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 10:50:16 ]
7.2/1、8.3.4/1、5.19/1って何を見ればいいの?
ネット上で閲覧できるもの?

678 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:02:45 ]
ANSI規格。

679 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:05:07 ]
で、それはネット上で閲覧できるもの? URLは?

680 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:21:06 ]
ドラフトならタダで見れるだろ

681 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:29:25 ]
で、URLは?

682 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:41:50 ]
自分でググれよ

683 名前:デフォルトの名無しさん [2009/04/18(土) 11:45:03 ]
出た、「ググれよ」ww

684 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 12:11:49 ]
そりゃ出るだろう。出る箇所だもの。



685 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 12:24:34 ]
www.open-std.org/JTC1/sc22/WG21/docs/projects

この程度もぐぐれないのならネットやるなよ

686 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 12:33:52 ]
>>675 >>676
ありがとうございました。
書かれている場所まで記述していただいて
非常に参考になりました。


687 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:04:10 ]
C++のANSI規格が見られるURLを教えてください。

688 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:14:09 ]
>>687
ありません
購入しましょう

689 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:20:08 ]
一次ソースはISOな。
日本語訳がJISのサイトで閲覧できる。

690 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:21:07 ]
で、URLは?

691 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:24:06 ]
自分でググれよ


692 名前:デフォルトの名無しさん [2009/04/18(土) 13:26:45 ]
出た、「ググれよ」ww

693 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:31:23 ]
そりゃ出るだろう。出る箇所だもの。

694 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:33:58 ]
www.open-std.org/JTC1/sc22/WG21/docs/projects

この程度もぐぐれないのならネットやるなよ



695 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:34:11 ]
www.open-std.org/JTC1/sc22/WG21/docs/projects

この程度もぐぐれないのならネットやるなよ

696 名前:デフォルトの名無しさん [2009/04/18(土) 13:35:31 ]
精神レベルの低い、幼稚なお子ちゃまがよぉ、軽々しく死ねとか言うなよ?
お前を育てた奴は人間社会では、かなりレベルの低いバカだったんだな。
育てられたお前がかわいそうとか思わない。大人になって苦労するのはてめぇ。
いつか死ぬから、バカな存在として一生を無駄に過ごしなさい。

697 名前:デフォルトの名無しさん [2009/04/18(土) 13:37:02 ]
誤爆

698 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:39:06 ]
軽々しくググれとか言うなよ

699 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:40:32 ]
こんなものは最初からテンプレに入れとけって話だよ。
お前らの怠慢を質問者になすりつけるな。

700 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:40:38 ]
どうかググってくださいお願いします。


701 名前:デフォルトの名無しさん [2009/04/18(土) 13:44:37 ]
人にググれという前に、自分でググって見つけたURLを貼りなさい。

702 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:51:04 ]
で、何のURLを貼って欲しいの?


703 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:58:13 ]
C++のANSI規格が見られるURL

704 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:01:12 ]
とあるライブラリを使おうと思ったら、コールバック関数がCの関数ポインタでした。
データも渡したいんですが、関数オブジェクトが使えないので困っています。
データをグローバル変数にするしか方法はないのでしょうか?



705 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:03:14 ]
とりあえず、使いたいライブラリの機能と、コールバック関数と、渡したいデータを教えてください。

706 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:14:28 ]
>>703
www.jisc.go.jp/app/JPS/JPSO0020.html
へ行ってX3014で検索してこい。章番号は変わらないはずだから。
ISOもANSIもJISも売り物なので、ちゃんとした物は金を払わなければ見られない。
ダウンロード販売のURLも貼ろうか?


707 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:14:42 ]
そういうコールバックは、データを保持できるvoid *をペアで登録することができて
そいつが引数としてコールバックに渡される仕様になってるはずだが
そうでないならあきらめな

708 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:18:02 ]
>>706
ちゃんとした物とちゃんとしてない物は何が違うの?

709 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:23:52 ]
>>708
ちゃんとしていない物=非合法なコピー品。
提供した者の手が後ろに回る可能性がある。

あと、JISの規格書なんかは閲覧は出来てもダウンロードしてオフラインで見ることは出来ない。


710 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:26:02 ]
>>709
ちゃんとしていない物=非合法なコピー品が何故公式ページからリンクされてるの?

711 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:30:52 ]
まずはどこからどこへリンクされているのかURLを示せよ。
ISOのストアで販売しているものをISOが別のページでタダで配るわけないだろ。


712 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:35:48 ]
>>711
誰に言ってるの?

713 名前:711 mailto:sage [2009/04/18(土) 14:37:45 ]
>>712
>>710へ言っている。

714 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:38:40 ]
>>707
ありました。
thxでした。



715 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:42:56 ]
>>713
www.jisc.go.jp/app/pager?id=4555
から
javascript:openPDF('X3014,01');
でPDFが開く。

716 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 15:02:24 ]
>>715
あ、公式っていうのはISOではなくJISのこと?
それはタダで見られる数少ない合法的なものだよ。
(ちなみにそのURLは検索結果のものだから他の人には見えないよ)
>>709の文章の書き方が悪いって言う話?
ちゃんとしていないものの例=非合法なコピー品
と書くべきだったかな?


717 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 15:04:58 ]
>>706
初めからそう書けよ

718 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 15:05:44 ]
おまえら釣られまくりだな。

719 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 15:08:12 ]
>>716
>>708が言ってるのは、
>タダで見られる数少ない合法的なもの

>金を払わなければ見られないもの
の違いを教えて、ってことだと思うよ。

720 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 15:11:32 ]
>※最新バージョン9の使用は今しばらくお待ちください。

おい。

721 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 15:12:14 ]
久々に見に来たら何唾壺の有様は。
まったり進行していた時代はどこへ行った!

大人は黙ってまとめてあぼんだな。


722 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 15:13:20 ]
セキュリティが厳しくなる前に保存しておいて正解だったな

723 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 16:45:31 ]
static const volatile int x=42;
とかあったとするじゃん。
この前のC++における型名や修飾子の順番ってどう規定されている?
どんな順番が望ましいとか、どこまで好き勝手並べて良いとか。。。


724 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 16:54:59 ]
この前っていつのことだよ。覚えてねーよ。



725 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 17:08:54 ]
>>724
日本語おかしかったか。

static const volatile int x=42;
とかあったとするじゃん。
このように変数名の前につけるような
型名や修飾子の順番ってC++においてどう規定されている?
どんな順番が望ましいとか、どこまで好き勝手並べて良いとか。。。

726 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 17:25:35 ]
const volatileって意味あるの?

727 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 17:28:18 ]
>>726
ハードウェアが書き込み,プロセッサが読み出す領域: const volatile
ハードウェアが書き込み,プロセッサが読み書きする領域: volatile
プロセッサが書き込み,ハードウェアが読み出す領域: volatile

っていうのを見つけた。
[C,C++] const と volatile - bnez の日記
ttp://slashdot.jp/~bnez/journal/281985



728 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 17:41:23 ]
>>725
別に決まりはないけど、まあみんな常識で考えて
記憶クラス指定子→cv修飾→型名の順番にしているね。
コンパイラを通すだけならint const volatile staticなんて並べても通る。

729 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 17:42:24 ]
好みが現れるのはポインタ・参照の*と&の前後の空白の開け方、constとの順序だな。
int *p; int* q;とか。

const int* p2; int const* q2;
上のq2は、constなポインタへのconstで一貫性があるように見える。
const int* const p3; int const* const q3;

730 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 17:54:08 ]
>>725
ストレージクラス(static) 型(int) cv修飾(const volatile) 識別子(x)

基本的にcvはその直前(左)にある型を修飾するけど、例外的にその左に型がない場合は直後の型を修飾する

規格では7.1あたりに書いてあるよ

731 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 18:10:15 ]
一応誤解されないように言っとくと一番左の型の修飾子はその左に置くのが一般的だと思う
static const volatile int x でok

732 名前:725 mailto:sage [2009/04/18(土) 18:13:17 ]
>>728-730
ほっほ〜。
了解しました。
ありがとう。


733 名前:デフォルトの名無しさん [2009/04/18(土) 18:40:53 ]
質問です

struct fruit{
  int apple;
  int banana;
  void clear(){
    ZeroMemory(this, sizeof(*this));
  }
  int orange;
};

この構造体をローカル変数に定義した場合、メモリ見るとそれぞれの
3つの値がスタックに順に並びました。
clear を呼ぶと、確かに apple, banana, orange が
クリアされます。
ZeroMemory で this を渡していますが、clear() は含まれていないようです。

この構造体の場合、fruit.clear() は main() と同じように、
code セグメントに配置されるんでしょうか。
class も同じ考え方になるのでしょうか。

734 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 18:42:50 ]
>>733
当然、そうしないといけないという決まりはないが、
自然に実装すればだいたいそんな感じになる。classでも同じ。



735 名前:デフォルトの名無しさん [2009/04/18(土) 19:49:59 ]
>>731
コンパイラーによっては前付きは古いって怒られることあるよ。
ここらへんに増築の限界感を感じる・・・

736 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 21:56:22 ]
1) const int *p;
2) int const *p;
3) int *const p;

1と2がpointer to const intで、3はconst pointer to intであってますよね?

737 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 21:57:06 ]
>>736
あってる。

738 名前:デフォルトの名無しさん [2009/04/18(土) 21:57:16 ]
あってます。

739 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 21:59:07 ]
declarator としての const は常に * const の形で現れる。
っていうか、構文解析法は頭に叩き込みましょう^^

740 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 22:00:58 ]
派生クラスのメンバ関数foo()が例えprivateでも、
基底クラスで同じメンバ関数foo()がvirtualと指定されていれば
基底クラスのポインタを介した場合のみ呼び出せるのか。

実際やってみるとうまくいくんだが、別におかしくはないよね?
class Base
{
public:
virtual void foo(){std::cout << "Base foo!" << std::endl;};
Base(){std::cout << "Base Constructor!" << std::endl;};
virtual ~Base(){std::cout << "Base Destructor!" << std::endl;};
};

class Derived : public Base
{
void foo(){std::cout << "Derived foo!" << std::endl;};
public:
Derived(){std::cout << "Derived Constructor!" << std::endl;};
virtual ~Derived(){std::cout << "Derived Destructor!" << std::endl;};
};
void foo()
{
Base* pbd(new Derived);
pbd->foo();
delete pbd;
}


741 名前:デフォルトの名無しさん [2009/04/18(土) 22:07:06 ]
>基底クラスのポインタを介した場合のみ呼び出せるのか。

派生クラス(Derived)のポインタを介した場合でも呼び出せるでしょ?


742 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 22:08:11 ]
おかしくないよ。
もし呼び出せなくなったりするのなら
ポリシークラスとか存在価値なくなっちゃうし。

743 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 22:08:22 ]
>>741
コンパイルエラーになったよ。

744 名前:デフォルトの名無しさん [2009/04/18(土) 22:09:53 ]
自分のメンバ関数なのに?



745 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 22:11:16 ]
privateにしたら呼び出せなくなるのは当たり前だろ

746 名前:740 mailto:sage [2009/04/18(土) 22:11:19 ]
>>741
error: `virtual void Derived::foo()' is private
って言われますね。
>>744
「自分のメンバ関数から」ならprivateメンバ関数も呼出せるけどね。

747 名前:740 mailto:sage [2009/04/18(土) 22:19:08 ]
あと、基底クラスのデストラクタがprotected指定されていても、
派生クラスのデストラクタがpublic指定されていれば
boost::shared_ptrを使った場合なら呼出せるのね。

必要条件:
基底クラスのデストラクタがprivateでないこと。
また、派生クラスのデストラクタがpublicであること。
さらに生のポインタじゃダメなようだ。


748 名前:740 mailto:sage [2009/04/18(土) 22:20:08 ]

class Base
{
protected:
virtual ~Base(){std::cout << "Base Destructor!" << std::endl;};
public:
virtual void foo(){std::cout << "Base foo!" << std::endl;};
Base(){std::cout << "Base Constructor!" << std::endl;};
};

class Derived : public Base
{
virtual void foo(){std::cout << "Derived foo!" << std::endl;};
public:
Derived(){std::cout << "Derived Constructor!" << std::endl;};
virtual ~Derived(){std::cout << "Derived Destructor!" << std::endl;};
};
void foo()
{
boost::shared_ptr<Base> pbd(new Derived);
pbd->foo();
}

しかもboost::shared_ptrの動的削除子のおかげでデストラクタにvirtualすら付けなくてもいけるのか。


749 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 00:39:35 ]
>748 >454

750 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 11:55:04 ]
>>727
>ハードウェアが書き込み,プロセッサが読み出す領域: const volatile
この使い方って本当に大丈夫?
例示できないけどconst有り無しのオーバーロード関数とか・・・


751 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 12:10:18 ]
>プロセッサが書き込み,ハードウェアが読み出す領域: volatile

これも疑問だよな

プロセッサもハードウェアも読み書きする領域じゃないのか?

752 名前:デフォルトの名無しさん [2009/04/19(日) 12:16:38 ]
そのコードが動作するプロセッサの管理外で読み書きされる領域

753 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 13:47:07 ]
プロセッサによって細かい挙動は違うだろうけど、
volatileって常に最新の実体を参照するようにするだけだよね?

754 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 13:52:46 ]
最適化を無効にしてるだけだから



755 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 14:38:46 ]
その変数を扱っているプログラムとは別のなにかによって内容が変更されうる変数。
volatile int i;
int j;
if ( i == 1 ) j = i;
で j == 1 でないときがありえる変数。

constをつけるとそのプログラムからは内容が変更できないのに参照するたびに内容はかわるかもしれない変数になる。

ポインタ経由でアドレスにマッピングされたI/Oポートとやり取りするのに使ったりする。



756 名前:733 [2009/04/19(日) 14:51:18 ]
>>734
thx! 亀レススマソ

「自然に実装すれば」というのは、アセンブル段階で
構造体やクラスのコードはすべて code セグメントに集約している
場合、ということでしょうか。

もう1つ謎なのは、インスタンス化を可能とするために、
clear() を呼んだ際に、どのメモリ領域が this に該当するのかを
どうにかして渡しているはずですが、その文献が見当たりません。
どのように処理しているんでしょうか。

757 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 16:36:28 ]
>>756
> 「自然に実装すれば」というのは、アセンブル段階で
> 構造体やクラスのコードはすべて code セグメントに集約している
> 場合、ということでしょうか。

クラス(あるいは構造体)のメンバ変数は、
インスタンス毎に値が違うので、各インスタンスごとに
用意してやる必要があるが、メンバ関数は各クラス毎に
一つだけ用意してやればよい。
よって、>>733の場合だと、スタックにメンバ関数(へのポインタ)が
用意される必要はない(virtual関数は微妙に別)


> もう1つ謎なのは、インスタンス化を可能とするために、
> clear() を呼んだ際に、どのメモリ領域が this に該当するのかを
> どうにかして渡しているはずですが、

>>733の例のclear()の場合、処理系が勝手に

__struct_fruit_clear(fruit* this)

のような関数に置き換える(ことが多い)。ただし、処理系依存。

758 名前:733 [2009/04/19(日) 17:46:48 ]
>>757
丁寧な説明、本当にありがとうございます。
かなり理解できました。

759 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 20:32:45 ]
個人開発にて C++ にインターフェースの概念を取り入れようとしております。
.NET や Java では interface が言語仕様として存在しますが、
C++ では言語仕様レベルで Java のような interface は存在しません。
なので、単一継承とは別に、
純粋仮想関数だけで固められたクラスのみ、多重継承を許可して実装しようと思ってます。
そのような実装で問題点などありますでしょうか。
よろしくお願いします。

760 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 20:35:38 ]
特に問題はないと思うけど、インターフェイスだと分かるようなクラス名にするとか工夫した方がいいかも
結局は規約次第だと思うが

761 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 20:59:23 ]
>>760
レスありがとうございます。
やっぱり規約や、実装者の意識の問題になりそうですよね。
個人(自分だけ)での開発なので、その辺の問題は薄そうですが・・・
コンパイラで上手くカスタマイズして、
間違った実装したときに警告とか出せればいいんですけどね。

762 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 21:03:35 ]
>>759
struct IHoge {virtual ~IHoge();};
struct IFoo : IHoge {};
struct IBar : IHoge {};

class Piyo : IFoo, IBar {};
Piyo piyo;
このとき、(IHoge*)(IFoo*)&piyo == (IHoge*)(IBar*)&piyoが
真になるとは限らないということを許容できないなら、仮想継承を使うべきと言っておく。

処理系間や多言語間での互換性を高めるため、仮想継承を使っていないMSのCOMでは、
これが理由でポインタの比較が面倒(仮想継承の代わりに規約で縛りを入れて対処している)。

763 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 21:45:10 ]
>>762
operatorの再定義のことを言ってる?
よく分からん。

764 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 22:00:25 ]
>>763
仮想継承しなければ、IFooの部分オブジェクトのIHogeとIBarの部分オブジェクトのIHogeは別物ということ。

インタフェースという元のお題からは外れるが、IHogeに非静的メンバ変数xがあれば、
IFoo側のxとIBar側のxは、仮想継承しないなら別々、仮想継承したら同一の存在だろ。
(かなり乱暴な言い方だけど)
それと同じ話。単にメンバ変数がないからポインタの比較でもしないと問題が発覚しないだけで。



765 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 22:20:17 ]
教科書に書いてある内容なんだから
「仮想継承」も調べておいた方がいいとかで済ませればいいのに

766 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 23:49:51 ]
>>762
レスありがとうございます。
仮想継承はよく理解してなかったんで、Wikipedia とかで調べてました。
多重継承する上で理解しておかないといけない概念ですね。
ありがとうございました。

767 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 23:52:40 ]
おまえらスレがもったいないから
>>765さんが教科書で覚えたことはいちいち説明するなよ。
ググレカス。

768 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 23:56:49 ]
俺もC|Java|C#|VB厨だから仮想継承を調べてみた
たしかにこれはググればわかる気がする
今後は namespace C++{ 仮想継承 } とか名前空間で囲んでくれると名前的にわかりやすい
RDFでも可

769 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 13:17:27 ]
namespaceは神
これさえあればC言語風に書けるしなw
クラス?
そんなもんいらね。

770 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 13:26:09 ]
namespaceはCに取り込まれるべきだと思うね
コメントの//より優先されるべきだった

771 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 14:31:19 ]
namespaceだとC++と同じだから、namekukanでCに取り込んだら
どうだろうか

772 名前:デフォルトの名無しさん [2009/04/20(月) 14:33:16 ]
programminglang::C::namespaceでいいよ。

773 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 15:40:24 ]
namespace 入れてくれれば enum を気兼ねなく使えるしな

namespaceだとC++と同じだから、miniascapeでCに取り込んだらどうだろうか

774 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 19:37:14 ]
普通に
namespaceでいいよ。だからさっさと取り込んでくれ。



775 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 22:17:27 ]
namespiceでいいよ

776 名前:デフォルトの名無しさん [2009/04/20(月) 22:20:40 ]
namaespaceでいいよ

777 名前:デフォルトの名無しさん [2009/04/20(月) 23:33:28 ]
namaekukanだろjk

778 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 23:35:43 ]
無名名前空間も頼む。
staticいちいち付けるの面倒なんじゃ。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<185KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef