■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part46
501 名前:デフォルトの名無しさん :2006/01/30(月) 22:08:39
>>497
そこは「アドレス」が通称なので気にしなくてよい。

502 名前:デフォルトの名無しさん :2006/01/30(月) 22:27:41
>>501
失礼、言葉足らずでスマソ
俺もポインタのだと思って、ちゃんと作ってから答え見たら
「street」とか「city」とかの情報を文字列で保存してあったのですよ・・・('A`)
訳書なので、独習CはよかたのにC++はイマイチなのかな、と
//問題原文一部→「名前とアドレス情報を保存するクラスを作成しなさい。クラスの非公開メンバ〜〜desplay()というなまえを付けます)。」

>>500
C&C++書いた人と、Java書いた人は違うみたいでした。
Javaもいつかやるかもだから、気をつけてみます

503 名前:デフォルトの名無しさん :2006/01/30(月) 22:55:42
>>502
>desplay()

それは酷いな

504 名前:デフォルトの名無しさん :2006/01/30(月) 23:34:49
>>503
ワラタ


505 名前:デフォルトの名無しさん :2006/01/30(月) 23:53:54
確かに酷い
そこは、純粋に俺の誤植ですよ・・・('A`)

どうせもう買っちゃったわけだし、素直に全部読んでみます。
ありがとうございました

506 名前:デフォルトの名無しさん :2006/01/31(火) 01:18:22
正直なところC++は入門書1冊読んだくらいではどうにもならないから
どれでもいいと思う

507 名前:デフォルトの名無しさん :2006/01/31(火) 04:04:38
おまいらはC++の本を何冊持ってるの?

508 名前:デフォルトの名無しさん :2006/01/31(火) 04:12:10
1冊も持ってない

509 名前:デフォルトの名無しさん :2006/01/31(火) 04:21:24
習うより慣れろだにょ

510 名前:デフォルトの名無しさん :2006/01/31(火) 04:23:45
4冊。
どれも定番のみ

511 名前:デフォルトの名無しさん :2006/01/31(火) 04:37:27
初心者です。コピーコンストラクタを引数をもつコンストラクタに
書き換えることは出来ますか?あるいは出来る場合と出来ない場合があるのでしょうか?

512 名前:デフォルトの名無しさん :2006/01/31(火) 04:46:01
C++入門なら、高橋麻奈神のやさしいC++一冊+インターネットで十分だと思うよ
独習C++は激しく読みづらかった

513 名前:デフォルトの名無しさん :2006/01/31(火) 05:06:30
なんでもいいから1つプログラミング言語知ってるなら最初から禿本でいいと思うが。
あれ、結構内容浅いし。カバーしてる範囲は広いが。

514 名前:デフォルトの名無しさん :2006/01/31(火) 05:16:08
A級B型C++

515 名前:デフォルトの名無しさん :2006/01/31(火) 05:30:55
>>511
コピーコンストラクタの引数は決まってる。変更不可。
むしろ、変更したらコピーコンストラクタじゃなくなる、ってのが正しいかな。

516 名前:デフォルトの名無しさん :2006/01/31(火) 06:42:19
>>516ありがとうございます

517 名前:デフォルトの名無しさん :2006/01/31(火) 06:55:19
C++の本10冊あるが・・・
みんな以外と持ってない?

518 名前:デフォルトの名無しさん :2006/01/31(火) 07:36:40
Effective C++
More Effective C++
Effective STL
Modern C++ Design
D&E

この5冊があれば他にはいらない。


519 名前:デフォルトの名無しさん :2006/01/31(火) 07:37:03
>>517
今本棚見たら

・The C++ Programming Language
・Effective C++
・More Effective C++
・Effective STL
・Exceptional C++
・More Exceptional C++
・The C++ Standard Template Library
・Modern C++ Design
・Template Meta Programming
・The Annotated C++ Reference Manual
・Design and Evolution of C++
・Ruminations On C++
・Designing and Coding Reusable C++

が並んでた.一応10冊は超えてるけど,それでも10冊持ってるって相当のC++オタだと思うぞ.
(俺は研究上必要になったので揃えたんだが……)

520 名前:デフォルトの名無しさん :2006/01/31(火) 07:55:54
>>519
俺は英語読めないヘタレだから、
More Exceptional C++とか、
訳が糞らしいってだけで敬遠してる
More Effective C++は持ってない・・・
でもやっぱり買おうかどうか迷ってる。

でも持ってるだけで、難解すぎて読めてない本とか、
これから読む予定で予定は未定な本が半分くらいだったり

521 名前:デフォルトの名無しさん :2006/01/31(火) 07:56:41
PLCPP3rd
D&E
Boost

偏ってるなぁ俺……

522 名前:デフォルトの名無しさん :2006/01/31(火) 08:19:47
>>520
More Exceptional C++の訳書って出てるの?


523 名前:道化師 :2006/01/31(火) 08:28:42
>>517
JIS X 3014 や ISO/IEC 14882 の .pdf も数に含めていいですか?

...俺、初心者向けのも結構買ってたりするし数え方次第では20冊超えるかも。

>>519
`Д´)ノ ヲタ言うな!

あと、まだ上げられてないけど

 国際規格<ISO> C++ライブラリ ハンドブック

...俺はこいつを地味に重宝してたりする。( ただし、オススメはしない。 )

524 名前:デフォルトの名無しさん :2006/01/31(火) 10:13:59
Effcetive C++ と、
ピアソンエデュケーションが出しているC++本は鉄板。

持ってるのは、

Effective C++
Exceptional C++
Efficent C++
Modern C++ Design
Effective STL
STL 標準テンプレートライブラリによるC++プログラミング 第2版
C++ ネットワークプログラミング

初心者は Accelerated C++ 読んでおけ

525 名前:デフォルトの名無しさん :2006/01/31(火) 11:00:18
本を一冊も持たず、知りたいことが出てきたら
ネットと人に本を借りることでしのいでいる俺。
あと、一番役に立つのが自分が昔書いたコードだな。

しかしコードの全文検索って、ふつうの文書と同じように
全文検索してもうまく検索できないんだよな。
あとで検索することを考えたコメント書いておかないと。

526 名前:デフォルトの名無しさん :2006/01/31(火) 12:03:00
in depth 全部

527 名前:デフォルトの名無しさん :2006/01/31(火) 15:54:11
>>522
いや、出てないから持ってないって意味

528 名前:デフォルトの名無しさん :2006/01/31(火) 17:16:42
EffectiveとEfficentはなんか数回読むだけで十分な感じがしてしまう

529 名前:デフォルトの名無しさん :2006/01/31(火) 17:19:30
JIS X3014

規格票のくせにけっこう読みやすい

530 名前:デフォルトの名無しさん :2006/01/31(火) 18:47:13
質問です。

hoge = (CHoge)hoge2;

hoge = CHoge(hoge2);

同じものだと解釈しているのですが、この認識は正しいでしょうか。
可能であれば上の場合と、下の場合で呼ばれるコンストラクタを変えたいのですが…可能でしょうか?


531 名前:デフォルトの名無しさん :2006/01/31(火) 19:01:00
>>530
その2つには違いがあると思います
前者はhoge2をCHoge型にキャストするので
((CHoge)hoge2)();と同様だと思う。コンストラクタではCHoge()が呼ばれる
後者はCHogeの引数を1つ取るコンストラクタが呼ばれる


532 名前:デフォルトの名無しさん :2006/01/31(火) 19:09:58
>>531
> ((CHoge)hoge2)();と同様だと思う。
・・・いや、それは違うだろう。

533 名前:デフォルトの名無しさん :2006/01/31(火) 19:13:21
>>531
お返事ありがとうございます。
ただ、引数をとるコンストラクタが呼ばれるようです。

今のところ両方とも
CHoge(const CHoge2& hoge);
が呼ばれます。

534 名前:デフォルトの名無しさん :2006/01/31(火) 19:15:56
>>530
CHoge が hoge2 の型を取るコンストラクタを持ったクラス型なら、
どっちでも同じになりそう。

CHoge と hoge2 の意味に前提が無ければ、ちょっとだけ違うような気がする。
後者は static_cast<CHoge>(hoge2) と同じ。
前者は static_csat がダメでも const_cast, reinterpret_cast になるかもしれない。

535 名前:デフォルトの名無しさん :2006/01/31(火) 19:18:35
>>530
試してみた結果、

hoge2 も CHoge 型だとすると
・(CHoge)hoge2 は何もしない。
・CHoge(hoge2) はコピーコンストラクタが呼ばれる。

hoge2 が CHoge 型ではないとすると
・(CHoge)hoge2 も CHoge(hoge2) も hoge2 の型を引数にとるコンストラクタが呼ばれる。

あとはどの場合も代入演算子のオーバーロード関数が呼ばれる。

536 名前:デフォルトの名無しさん :2006/01/31(火) 19:22:34
(ノ∀`)アチャー やはり同じになってしまいますか。

JAVAの記述法をC++で再現という(意味の無い、C++の理解を深めるための)アソビをしておりまして。

DataInputStream型 と InputStream型を作ったのですが困っていたのです。
dis = (DataInputStream)is;
とやれるように作った(ダウンキャストを再現)はいいのですが、DataInputStreamのコンストラクタには普通にInputStreamを引数にするものがあるのです。

(DataInputStream)で変換された場合は「そのまま内部ポインタをコピー」すればいいのですが、
InputStreamを普通に引数にとるコンストラクタなら「InputStreamに無くてDataInputStreamにあるデータの初期化」も必要となります。

これは手詰まりかな…。



537 名前:デフォルトの名無しさん :2006/01/31(火) 19:26:50
なんて無駄かつ楽しそうなんだろうw

538 名前:デフォルトの名無しさん :2006/01/31(火) 20:53:10
hoge2が operator CHoge &() なんて類のメンバ関数を持ってても違いはでないんだっけ?

# コンストラクタに explicit の指定がないと曖昧だって言われてエラーになるような気もするけど。

539 名前:デフォルトの名無しさん :2006/01/31(火) 21:52:52
質問です。
何もライブラリが利用できない環境でC++を利用したい場合(組み込みとかOS等)
C++の言語の機能(ライブラリは除く)をフルに使うには何を実装すればよいかの
情報ってどこかにありませんか?

例えばnewやdeleteの中身は実装しないとC++は利用できないですよね。

540 名前:デフォルトの名無しさん :2006/01/31(火) 21:56:23
>>539 例外処理もいるよな。

541 名前:デフォルトの名無しさん :2006/01/31(火) 22:01:49
>>539
規格書を読めば逆に何を実装しなければならないかと言うことは書いてある。
組み込みのような環境は自立処理系などと言う呼称で一部のライブラリだけ用意されていればよいことになっている。

542 名前:デフォルトの名無しさん :2006/01/31(火) 23:16:11
>>540
組み込みで例外処理を独自に実装するのは、
よほどのチャレンジャーじゃない限り現実的じゃないぞ


543 名前:デフォルトの名無しさん :2006/02/01(水) 01:22:57
標準関数って std 名前空間の下にあるんですよね?
using namespace std; していなくても、
getchar() とか普通に使えるんですが・・・
もちろん std::getchar() でも使えるんですけど、
これじゃグローバルにあるのと変わらない気がします。
std 名前空間だけ特別扱い??

544 名前:デフォルトの名無しさん :2006/02/01(水) 01:24:40
釣りなら釣りとメールr


545 名前:デフォルトの名無しさん :2006/02/01(水) 01:31:14
(;゚д゚) ・・・
 
(つд⊂)ゴシゴシゴシ
  _, ._
(;゚ Д゚) …!?


546 名前:デフォルトの名無しさん :2006/02/01(水) 01:39:03
>>543
#include <stdlib.h>

#include <cstdlib>
の区別はついてる?

547 名前:デフォルトの名無しさん :2006/02/01(水) 01:41:31
>>546 はい、#include <cstdlib> しかしていなくても、
getchar() や ::getchar() が使えるんですが、
これは使用なんでしょうか?

548 名前:デフォルトの名無しさん :2006/02/01(水) 01:44:43
>>543
コンパイラは?まずはそこからだ

549 名前:デフォルトの名無しさん :2006/02/01(水) 01:47:25
#include <cstdlib>
#include <iostream>

int main(const int argc, const char* const  argv[]){
    std::cout << "えんたぁおして";
    ::getchar();
    return EXIT_SUCCESS;
}

このコードが通るので、何でだろうと思いました。
Visual C++ 2005 を使っています。

550 名前:デフォルトの名無しさん :2006/02/01(水) 02:00:17
>>549
それはね、C++の規格書のmissなんだよ。現在では修正されていたはずだけど。

551 名前:デフォルトの名無しさん :2006/02/01(水) 02:07:43
むしろ、VC2005の"cstdio"とかはstd名前空間に入ってないんじゃ。

#ifdef _STD_USING
#undef _STD_USING
#include <stdio.h>
#define _STD_USING

#else /* _STD_USING */
#include <stdio.h>
#endif /* _STD_USING */

"stdio.h"の内部に_STD_USINGに関する#ifディレクティヴなし。

意味あんのかこれ……。


552 名前:デフォルトの名無しさん :2006/02/01(水) 02:13:01
#include <cstdlib>

int main(const int argc, const char* const  argv[]){
    ::getchar();
    return EXIT_SUCCESS;
}

これだと getchar はグローバルな名前空間にないと怒られる。
Visual C++ 2005

553 名前:デフォルトの名無しさん :2006/02/01(水) 02:21:55
>>552
分かっているとは思うけど
cstdlibには標準入出力は定義されていない。
cstdioならグローバルな空間を汚染する。
>>549の場合iostreamが暗黙的にcstdioをincludeしてるから可能だった。

554 名前:デフォルトの名無しさん :2006/02/01(水) 02:33:04
あ、cstdioとcstdlibを読み違えてた。ていうか、なぁんで
cstdioはglobalに放り込むかなぁ

555 名前:553 :2006/02/01(水) 03:01:25
>>554
グローバル空間を汚染しない実装も可能だけど現実の問題として
C/C++両方のヘッダを弄るのが面倒なので

stdio.hはCのままで
cstdlibで

#include<stdio.h>
namespace{
  using ::getchar;
  using ::putchar;
  ......
}
こんな感じの実装をしてるのが原因だな。
ちなみにVC以外の他の多くのコンパイラでも同じような状況。
だからC言語の名前とだけは、
ぶつからないように定義しとかないと問題が発生しやすい。

556 名前:デフォルトの名無しさん :2006/02/01(水) 03:07:08
何回やるんだよこのネタ。

557 名前:デフォルトの名無しさん :2006/02/01(水) 03:11:56
>>556
「STLを使うと〜」のテンプレにみたいうまいことまとめてくれw

558 名前:デフォルトの名無しさん :2006/02/01(水) 15:59:52
質問です。
int a[] = {0, 0, 0, 0};
のような {x, y, z}という初期化パラメータ記述は、独自クラスででも使えるのでしょうか?
使えるなら記述法を知りたいのです。

559 名前:デフォルトの名無しさん :2006/02/01(水) 17:33:47
>>558
コンストラクタがなくて、メンバが全てパブリックなクラスなら使える。

560 名前:デフォルトの名無しさん :2006/02/01(水) 17:44:21
>>559 ほとんど構造体だな。

561 名前:デフォルトの名無しさん :2006/02/01(水) 19:26:35
文字列の簡単な解析をしているのですが,数値は数値として,
文字列は文字列としてVectorなどに格納したいと思っています.

現在はとりあえず全てstring型に変換してvector<string>へ格納し,
そのつど数値かどうか判定し数値ならばatofなどで変換をしています.
そのつど変換したり判定したりする部分がちょっとややこしいので
できればそのまま格納してやりたいのですが何か良い方法はないでしょうか?

562 名前:561 :2006/02/01(水) 19:28:51
>>561の補足です

すいません,簡潔に言うと,同じ1つのvectorに
複数の異なる型を入れたいと思っています.

vector<???> v;
v.push_back(10);
v.push_back('*');
v.push_back(23.5);

563 名前:デフォルトの名無しさん :2006/02/01(水) 19:30:15
>>561
boost::variant

564 名前:デフォルトの名無しさん :2006/02/01(水) 19:31:18
>>561
boost::any

565 名前:561 :2006/02/01(水) 19:40:42
>>563-564
おお,便利そうですね.これで解決できそうです.
ありがとうございました.

566 名前:デフォルトの名無しさん :2006/02/01(水) 19:45:39
なーんか設計見直したほうが最終的に良い予感がしてならないけどな
(保守・教育双方の観点から)
細かい事情が分からないからあまり突っ込んだことは言えないが

567 名前:561 :2006/02/01(水) 20:24:15
>>566
計算式が入っている文字列、例えば "10*(23.5-2)" を読み込んで
計算結果を得るものを作っています。

568 名前:デフォルトの名無しさん :2006/02/01(水) 20:34:10
boost でメタプログラミングするのはどうよ。

569 名前:デフォルトの名無しさん :2006/02/01(水) 20:35:52
出たなランバダブラザーズ

570 名前:デフォルトの名無しさん :2006/02/01(水) 21:10:41
ん?ラムダブラザーズ?

571 名前:デフォルトの名無しさん :2006/02/01(水) 21:39:42
ワンダバスタイル?

572 名前:デフォルトの名無しさん :2006/02/01(水) 22:49:13
見えないブラザーが保護者のようにキミを見る

573 名前:デフォルトの名無しさん :2006/02/01(水) 23:33:11
>>517 >>518 >>519
ここは自分の本棚を晒すスレですか?

・The C++ Programming Language
・Effective C++
・More Effective C++
・Effective STL
・Exceptional C++
・The C++ Standard Template Library
・Modern C++ Design
・Design and Evolution of C++
・C++ FAQ第2版
・C++ 再考
・C++ 標準的コーディング技法
・C++ Coding Standards
・Boost C++ Libraryプログラミング
・C++によるXML開発技法
・C++プログラミングの落とし穴

しかし、よくここまでよく揃えたものだ。
C++がお気に入りってのもあるけど。

でも、まだModern C++ Designは理解できない。orz

>>523
わーい、道化師さんだ〜!!

574 名前:デフォルトの名無しさん :2006/02/02(木) 00:25:51
ほんの話題が出ているようなので、
便乗で質問しますが、

どういう風にクラスを作ればよいのか、とか、
継承や多重継承の有効な使い方を解説した本でお勧めはありませんか?



575 名前:仕様書無しさん :2006/02/02(木) 00:30:33
継承とか一通り解っているのなら
「オブジェクト指向のこころ」

576 名前:デフォルトの名無しさん :2006/02/02(木) 00:35:54
「さ〜これからバリバリプログラミングの勉強するぞ〜」
っていう初心者に一番最初に教えるべき事は

「まず、プログラムを新しく書かずに済む方法を考えろ」


577 名前:574 :2006/02/02(木) 00:36:26
>>575
一応、C++の文法は一通り書いて、覚えてみたのですが、
どういう風にクラスを書いてよいのか、思いつかないのです。

578 名前:デフォルトの名無しさん :2006/02/02(木) 00:41:09
>>577
OOP的設計の仕方が分からんのか?
それなら憂鬱なryをお勧めする
わかりやすいし読んでて面白い

579 名前:仕様書無しさん :2006/02/02(木) 00:41:21
>>577
ちょいと(かなり?)背伸びするのなら
「アジャイル開発の奥義」

どうせならモダンなooの本を

580 名前:デフォルトの名無しさん :2006/02/02(木) 00:42:59
クラスってのは手段であって、目的じゃない。
やりたいことを明確にすれば、どういうクラスを書けばいいかわかるよ。
あとはある程度の量をこなさないと駄目だね。とにかく書く。
そのうち「あ、そういうことか」という瞬間が訪れるよ。
ま、やってみなはれ。

581 名前:仕様書無しさん :2006/02/02(木) 00:44:28
高凝集度と疎結合が書いてある本が良い

582 名前:デフォルトの名無しさん :2006/02/02(木) 00:47:53
>>574
オブジェクト指向本って、Javaを念頭において書かれてるのが多くて
やたら継承を多用してたり、仮想関数や動的解決に依存した
スタイルだったりするよな。

でも、C++はそれとは逆にテンプレートと静的解決の
ジェネリックプログラミングに向かってるから、
C++の勉強でOOP本を薦めるのは痛し痒しってとこだな。



583 名前:574 :2006/02/02(木) 00:55:19
確かに、いまはC++ Template Metaprogrammingという本にハマっているのですが。
今まで敬遠してきたboostが、ものすごく面白いライブラリに思えています。

ただ、boostの実装方法は、さっぱり理解できません。
ソースを読んでもさっぱり。
使う分には、簡単なのですが。

584 名前:仕様書無しさん :2006/02/02(木) 00:56:04
言われてみれば、>>575はJAVAの本だったorz
クラス設計の観点からは同じな部分多いんだけど

585 名前:デフォルトの名無しさん :2006/02/02(木) 01:02:55
boostの中身は魔法の呪文

586 名前:デフォルトの名無しさん :2006/02/02(木) 01:05:49
さすがにboost::arrayあたりは簡単だぞ

587 名前:デフォルトの名無しさん :2006/02/02(木) 01:18:43
今までなんでもかんでもオブジェクト指向で動的解決させてきたのが
ジェネリックプログラミングで静的にも解決させたほうがいい場面もある、って流れだろ?
基本文法→オブジェクト指向→ジェネリックって流れがいいと思うけどなぁ

588 名前:デフォルトの名無しさん :2006/02/02(木) 01:35:05
>>539
C++まで行くか知らないが
ttp://libc.blog47.fc2.com/
とか…?

589 名前:デフォルトの名無しさん :2006/02/02(木) 09:56:21
>>583
それ、読んでみたいけど、日本語版はまだないよね?
洋書でもいいんだけど、翻訳版が出そうな気がして手を出しづらい。

590 名前:デフォルトの名無しさん :2006/02/02(木) 10:04:28
MPLの作者が本書いたのか。知らなかった。

591 名前:デフォルトの名無しさん :2006/02/02(木) 12:42:38
std::string str;
  :
const char* p = str.c_str();

strが変更や破棄されない限り、pが指す先が有効である事は保証されているのでしょうか?
localtimeの様にバッファを共有していて、別オブジェクトのc_str()呼び出しで
内容が変わったりする実装があったりするんでしょうか?

592 名前:デフォルトの名無しさん :2006/02/02(木) 12:59:29
>>591
21.3.5
ttp://www.kuzbass.ru/docs/isocpp/lib-strings.html#lib.basic.string

593 名前:デフォルトの名無しさん :2006/02/02(木) 13:01:46
boost::mplよりTypeListの実装の方がカッコいい

594 名前:デフォルトの名無しさん :2006/02/02(木) 13:59:23
>>592
21.3.5じゃなくて21.3.6ですよね?

>21.3.6 - basic_string string operations [lib.string.ops]
>-2- Requires:
>Nor shall the program treat the returned value as a valid pointer value
>after any subsequent call to a non-const member function of the class basic_string
>that designates the same object as this.

ここの部分の翻訳に自信が無いんですが
「同じオブジェクト」の非constメンバを呼ぶまでポインタは有効
ってことでいいんでしょうか?


595 名前:デフォルトの名無しさん :2006/02/02(木) 15:24:23
>>594
21.3.6 basic_string string operations [lib.string.ops]
プログラムは配列に格納された値のいずれも変更しないものとする。
また、プログラムは、(c_str()の呼び出し時の)thisと同じオブジェクトを指す
basic_stringクラスの非constメンバ関数に対して、
その後のどんな呼び出しの後にも有効なポインタ値として戻り値を扱わないものとする。

→ 非constメンバ関数が呼び出された後は有効でなくなる。constメンバ関数については未定義。


596 名前:デフォルトの名無しさん :2006/02/02(木) 16:46:41
>constメンバ関数については未定義。

マジっすか?
非constメンバ呼び出し→以前のc_str()で得たポインタは有効でなくなる
そうでないなら(constメンバ呼び出しなど)→以前のc_str()で得たポインタは有効のまま
と解釈できると思うんだけど。

597 名前:デフォルトの名無しさん :2006/02/02(木) 20:05:54
そうえいば、以前 cppll だか、 vcppML だかで、実装によっては c_str() を使った
インスタンスをコピーしたインスタンスが書き換えられただけで無効になってしまうとかで
こんなんじゃ使いモンなるかー、ゴルァ(゚Д゚)って話を見た気がする・・・
確か、エピたんがSTLのヘッダのどこそこのオプション弄ればこの問題を回避できるとかって
言ってたようなとこまでは覚えてるんだけど・・・
かなり曖昧な記憶なんで、俺の記憶違いかも知れん。

598 名前:デフォルトの名無しさん :2006/02/02(木) 21:16:48
>>589
おそらくでないから。翻訳したところでマニアックな人にしか売れないから。
だから買おうね。


599 名前:デフォルトの名無しさん :2006/02/02(木) 21:17:26
21.3.6以外にbasic_stringのc_str()に関する記述がなければ、未定義ということになる。
constメンバ呼び出しなら変わらないと期待できそうだけれど、
実装の仕方によっては変わることもあり得る(効率のために)。
毎回c_str()を呼び出すか、自分が使用するコンパイラの実装を確認するしかないんじゃないかな。

600 名前:デフォルトの名無しさん :2006/02/02(木) 23:53:48
そこでvector<char>

601 名前:デフォルトの名無しさん :2006/02/03(金) 00:30:04
つーか毎回c_str呼んでなんか不都合あるのか?

602 名前:591 :2006/02/03(金) 00:45:12
>>601
suffix arrayに登録するのに、文字列中の各文字へのポインタが必要なんですよ。
std::vector<char>にコピーして使えばいいんですけど
文字列を重複して持つ事になるのは嫌だったので。

603 名前:デフォルトの名無しさん :2006/02/03(金) 08:39:51
俺も std::string を「凍結」して内部バッファを
取り出せたら便利だなぁ、と思ったことがある。

結局 c_str() で取り出して(一時的に文字列を重複して持つ)、
すぐ std::string を破棄することにした。
っていうか、>>591 は c_str() で取り出した後も
ずっと std::string を保持し続ける必要があるの?


604 名前:デフォルトの名無しさん :2006/02/03(金) 08:41:42
suffic array のライブラリの方を、
std::string を受け取って c_str() 毎回呼び出すように
改造するとか、どうよ。

って、今度は std::string 自体が重複するようになるだけか。
そうすると boost::shared_ptr<std::string> とかか。

605 名前:デフォルトの名無しさん :2006/02/03(金) 09:19:31
昔、自分自身は文字列を持たずに元文字列への参照を持つ部分文字列クラスとか考えたことあるな。

606 名前:デフォルトの名無しさん :2006/02/03(金) 12:48:17
正直、マルチスレッドが普及した今、
std::basic_stringの、refcountを前提とした設計は、時代遅れ。
素直に毎回バイト列をコピーして、スレッド内でのconst性を
確保したほうがマシ。

607 名前:デフォルトの名無しさん :2006/02/03(金) 18:10:55
短い文字列(短いといっても数100文字以下程度で多くの場合が該当)だと
deep copy + fast allocation + 短文字列最適化 で
スレッド安全な参照カウント実装での速度に十分到達できるか,
場合によっては outperform できるらしいですしね.
ここら辺の議論は GotW あるいは"More Exceptional C++" で
具体的な数字出して比較されています.

http://www.gotw.ca/publications/optimizations.htm

suffix array のような使い方だと,空間的な効率も似たりよったりか,
場合によっては deep copy の方が高効率かも知れませんし.
ただ,スレッド安全性を前提にしなくて良い場合もあるでしょうし,その場合の
参照カウントは有意な高速化が望める可能性があるとは思いますけれど.

608 名前:デフォルトの名無しさん :2006/02/03(金) 18:15:50
なんでthisは参照じゃなくてポインタになったんだろ-?
参照だったら「delete thisはしていんんですか?」「this=&rhsはしていんんですか?」問題なぞ発生しなかったろうに・・・

609 名前:デフォルトの名無しさん :2006/02/03(金) 18:23:05
>>608
C++ではthisという仕組みが先に出来て、
参照という仕様が出たのはそれよりもずっと後だから。

610 名前:デフォルトの名無しさん :2006/02/03(金) 18:23:41
その頃には参照なんてなかったのさ

611 名前:デフォルトの名無しさん :2006/02/03(金) 18:24:53
>>609
結婚しようか

612 名前:デフォルトの名無しさん :2006/02/03(金) 18:25:23
>>611
だが断る!


613 名前:デフォルトの名無しさん :2006/02/03(金) 18:29:26
ちょwwおまwwwww

614 名前:デフォルトの名無しさん :2006/02/03(金) 18:55:55
std::stringstream ss("abc");

std:istreambuf_iterator<char> it1(ss); it1++;
std::istreambuf_iterator<char> it2(it1); it1++;

std::cout << *it1;
std::cout << *it2 << std::endl;

実行結果:
cc

cbを期待していたのですが、私は何か間違っているでしょうか??

615 名前:デフォルトの名無しさん :2006/02/03(金) 19:09:56
>>614
istreambuf_iteratorはInputIteratorであってForwardIteratorではないから、
イテレータのコピーを取ってそれらを同時に操作しようとしても
期待した結果にはならない。

616 名前:デフォルトの名無しさん :2006/02/03(金) 19:39:28
>>614
InputIterator は、一度 dereference すると、その状態は保障されない。

InputIterator it = ...
InputIterator itDash = it;
bool a = ( *it == *itDash );

としたとき、a == true は保障されない。


617 名前:デフォルトの名無しさん :2006/02/03(金) 20:06:19
>>616
InputIterator は複数回の dereference が保証されていないのではなく
traverse 後のコピーの状態が保証されていないです.

>InputIterator it = ...
>InputIterator itDash = it;
>bool a = ( *it == *itDash );

での a == true は保証されていると思いますが,

value_type v = *it;
itDash = it;
++it;
bool b = ( *itDash == v );

での b == true が保証されていないというか,このときに itDash に
operator* を 適用できること自体がそもそも保証されていないです.

618 名前:デフォルトの名無しさん :2006/02/03(金) 21:19:42
すみません.
プログラミング言語 C++ 第3版を見ながら学習しているんですが,
等号演算子のオーバーライドで,

class X
{
// ...
const operator ==( X&, X& );
とするとコンパイルエラーになるんです.

「エラー E2080 cmem.cpp 74: 'CMem::operator ==(CMem &,CMem &)' は引数 1 つで宣言し
なければならない」

なぜなんでしょうか…


619 名前:デフォルトの名無しさん :2006/02/03(金) 21:21:01
きみは、X x,y,z;に対して、x.operator==( y,z )と呼びたいのかね?

620 名前:618 :2006/02/03(金) 21:24:06
誤)
class X
{
// ...
const operator ==( X&, X& );
正)
class X
{
// ...
const bool operator ==( X&, X& );
}

621 名前:618 :2006/02/03(金) 21:26:30
> X x,y,z;に対して、x.operator==( y,z )と呼びたいのか

すみません, もう少し詳しくお願いします.


622 名前:デフォルトの名無しさん :2006/02/03(金) 21:27:42
それで分からないんだったらやめた方がいいと思う

623 名前:デフォルトの名無しさん :2006/02/03(金) 21:31:30
>>621
ヒント:==は3項演算子ではない。


そういうことがやりたければ、クラスの外に出せばいい。

624 名前:618 :2006/02/03(金) 21:39:00

クラスの外に出せばいいのか...
了解です.


625 名前:618 :2006/02/03(金) 21:57:32
T1 operator @( T2 )
の T1 は,
a @ b
の a に当たるのではなくて,
演算子 @ が返す型だったということで解決.


626 名前:デフォルトの名無しさん :2006/02/04(土) 01:17:19
おいおい

627 名前:デフォルトの名無しさん :2006/02/04(土) 01:26:07
わかったからよしとしよう

628 名前:デフォルトの名無しさん :2006/02/04(土) 04:14:03
CでいきなりK&Rが無理じゃないのと違ってC++でいきなり禿本はきっつい。

629 名前:デフォルトの名無しさん :2006/02/04(土) 05:07:06
そう?

630 名前:デフォルトの名無しさん :2006/02/04(土) 12:47:40
Effective C++はちょっと当たり前すぎる感じがしたな。
むしろMore Effective C++が勉強になった

631 名前:592 :2006/02/05(日) 16:26:13
>>594-607
おそくなって申し訳ないけども、リンク先の 21.3 -5- のことを指したかったんだ。
お詫びにこんなのも拾ってきたよ。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#263

632 名前:デフォルトの名無しさん :2006/02/05(日) 21:54:29
C++の仕様書を読んでいます。(ISO/IEC 14882 First edition 1998-09-01)

関数の定義の仕様(8.4 Function definitions)を読んでいたのですが、

function_definition:
decl_specifier_seq( opt ) declarator ctor_initializer(opt) function_body

こんな感じで書かれています。
ここの、decl_specifier_seq が関数の戻り値の型に相当するようです。(8.4.2のExample参照)
で、これは7.1(Specifiers)で、以下のように定義されています。

decl_specifier_seq:
decl_specifier_seq(opt)
declspecifier

つまり、複数の declspecifier を含むことができるようになっています。
でも、それを額面どおりに受け取ると、戻り値型を複数指定できる、と
読めるのですが、もちろんそんなことはありませんよね?

int char Foo( ... )

とかはコンパイル通りませんし。なぜ仕様書ではこんな書き方になっているの
でしょうか?なにかを見落としているなら、教えてください。
それとも、ひょっとして複数型の戻り値が仕様的には正しいwのでしょうか?
ちなみに、decl_specifierにint とか charが含まれます。
よろしくお願いします。

633 名前:632 :2006/02/05(日) 22:00:33
8.4.2 のサンプルは、以下の通りです。

Example: a simple example of a complete function definition is

int max(int a, int b, int c)
{
int m = (a > b) ? a : b;
return (m > c) ? m : c;
}

Here int is the decl_specifier_seq;
max(int a, int b, int c) is the declarator; { /* ... */ } is
the function_body.


634 名前:デフォルトの名無しさん :2006/02/05(日) 22:03:24
>>632
7.1.5(Type specifiers) -1- より
"As a general rule, at most one type-specifier is allowed in the complete decl-specifier-seq of a declaration."

ttp://www.kuzbass.ru/docs/isocpp/dcl.html#dcl.type

635 名前:632 :2006/02/05(日) 22:07:56
>>634
感謝感激です!

636 名前:デフォルトの名無しさん :2006/02/06(月) 02:37:00
typedefを用いて定義した型の前方宣言(previous declaration)はどのようにしたらよいですか?

具体的には item.h が次のようになっていて

class Item
{
 // いろいろ
};
typedef std::list<Item> List;

別のヘッダファイル内でこの item.h をincludeせずに List を前方宣言したいのですが、
class List;
とか
typedef struct List;
とかすると型が一致しないと怒られてしまいます。

item.hをインクルードするしかないのでしょうか。
解決法があれば教えてください。

637 名前:デフォルトの名無しさん :2006/02/06(月) 02:55:34
>>636
面倒なのを厭わなければ、

class Item;
typedef std::list<Item> List;

という内容のitem_fwd.hを作って、item.hとItemの前方宣言が必要なファイルの両方からインクルードするという方法がある。

638 名前:デフォルトの名無しさん :2006/02/06(月) 03:18:40
これって実装の問題? それとも規格でそうなってんの?

639 名前:636 :2006/02/06(月) 06:49:40
>>637

なるほど、ありがとうございました。

640 名前:デフォルトの名無しさん :2006/02/06(月) 11:26:34
>>636,637
不完全方を引数にした標準テンプレートのインスタンス化による効果は未定義。
というわけで、標準コンテナを使ってる限り、その形で前方宣言は無理。

class Item;
typedef std::list<Item*> List;

これなら大丈夫。

641 名前:デフォルトの名無しさん :2006/02/06(月) 16:42:13
>>640
>不完全方を引数にした標準テンプレートのインスタンス化による効果は未定義。
未定義っつうかインスタンス化しようとしたところでコンパイルエラーになるのでは?
ちなみに637の内容はインスタンス化じゃないよね


642 名前:640 :2006/02/07(火) 01:57:55
>>641
ふむ。 typedef では完全な定義は要らないのでインスタンス化は起こらなさそうだな。
ただ、規格中にはっきりとした記述が見当たらない。

未定義じゃなくてコンパイルエラーになってくれればいいんだけど、例えば

class T
{
public:
 ... // public interface
private:
 class Impl;
 std::auto_ptr<Impl> pimpl;
};

なんて pimpl の雛型を書くと、ほとんどの実装でコンパイルは通るが
厳密に規格と照らし合わせると未定義動作になる。

643 名前:デフォルトの名無しさん :2006/02/07(火) 03:06:40
>>642
>ただ、規格中にはっきりとした記述が見当たらない。
これが正しいかどうかは検証が大変なので置いといて

>なんて pimpl の雛型を書くと、ほとんどの実装でコンパイルは通るが
>厳密に規格と照らし合わせると未定義動作になる。
Tのインスタンスを作ろうとするとT::Implの定義が必要でコンパイルエラーになる
インスタンスがないものは動作しようがないので(たぶん)未定義動作は起こらない
のでは?


644 名前:デフォルトの名無しさん :2006/02/07(火) 03:11:03
>642
コンパイルエラーにならないのは、pimplがポインタ変数(ポインタのサイズ
はポインタが指すオブジェクトのサイズに無関係)だからだろ?

std::auto_ptr<Impl> pimpl;



Impl impl;

だったらコンパイルエラーになる。Implの宣言が読み込まれていない
(sizeof(Impl)が不明な)状態で、sizeof(T)はいくつ?



645 名前:デフォルトの名無しさん :2006/02/07(火) 03:24:13
>>643
> Tのインスタンスを作ろうとするとT::Implの定義が必要でコンパイルエラーになる
それ、やってみて言ってる?エラーメッセージは?
手元のコンパイラ2つでは、両方とも警告しか出ない。

646 名前:デフォルトの名無しさん :2006/02/07(火) 03:24:47
>>644
それはわかってる。
auto_ptr<Impl> がコンパイル通るのに、実際には
規格で許されていないのが今の問題。

647 名前:デフォルトの名無しさん :2006/02/07(火) 03:29:11
一般に、C<T>をインスタンス化するためにTが完全な型である必要があるかどうかは
Cの実装に依存する。(インスタンス化した文脈と処理系にも依存したかもしれない)
だから、標準ライブラリのテンプレートに不完全な型を渡すと、
標準ライブラリの実装によってコンパイルの可否が左右される。
そこで、規格は、そういう実装依存のコードを避けるため、
標準ライブラリのテンプレートに不完全な型を渡すこと自体を禁止したのではないかと。

>>643
>Tのインスタンスを作ろうとするとT::Implの定義が必要でコンパイルエラーになる
g++3.4.2では警告だけ。

>>644
コンパイルエラーにならない原因はその通りだけど、
>>642はエラーにならないこと自体を問題視してるんだと思われ。

648 名前:デフォルトの名無しさん :2006/02/07(火) 03:29:56
>>645
訂正
>Tのインスタンスを作ろうとするとT::Implの定義が必要でコンパイルエラーになる
T::Implのインスタンスを作ろうとするとT::Implの定義が必要でコンパイルエラーになる


649 名前:647 :2006/02/07(火) 03:30:13
ごめん。とてもかぶった。

650 名前:デフォルトの名無しさん :2006/02/07(火) 03:32:03
>>647
>標準ライブラリのテンプレートに不完全な型を渡すこと自体を禁止したのではないかと。
禁止したの?
ソースを


651 名前:デフォルトの名無しさん :2006/02/07(火) 03:33:34
>>648
それは当たり前。今回の問題とは関係ない。

652 名前:デフォルトの名無しさん :2006/02/07(火) 03:33:38
>>650
表現がおかしかった。正確には>>640
>不完全方を引数にした標準テンプレートのインスタンス化による効果は未定義。
のこと。

653 名前:デフォルトの名無しさん :2006/02/07(火) 03:42:20
>>642
それ未定義動作を起こす可能性のあるソースって書ける?
642の例はインスタンス作ってないから動作しないよね


654 名前:デフォルトの名無しさん :2006/02/07(火) 03:46:17
>>653
それなら "public interface" を空にしてインスタンスの生成を追加すれば十分。

655 名前:デフォルトの名無しさん :2006/02/07(火) 03:52:46
>>654
class T
{
private:
 class Impl;
 std::auto_ptr<Impl> pimpl;
};
int main
{
T t;
}
これ未定義動作なの?


656 名前:デフォルトの名無しさん :2006/02/07(火) 04:02:57
>>655
そういうこと。(コンパイル通るように微調整すれば)

657 名前:デフォルトの名無しさん :2006/02/07(火) 04:04:57
結論としては、item.h をインクルード汁ってことか?

658 名前:デフォルトの名無しさん :2006/02/07(火) 04:07:36
>>657
違う。>>641参照。

659 名前:デフォルトの名無しさん :2006/02/07(火) 04:45:05
実際問題として、
Tのデストラクタ内でauto_ptrが delete p する必要があるでしょ。

で、この時に、Impl::~Impl()が実装されているのかどうか(呼び出すべきかどうか)が
コンパイラには判断できない。
(Implが実はPODのデータオンリー場合は、delete演算子はoperator delete()を呼ぶだけ)
で、多分(警告だけで済むってことは)、~Impl()を呼ばないコードを生成する。


・・・と思うんだけど、違うかな。

660 名前:デフォルトの名無しさん :2006/02/07(火) 05:05:29
「655が未定義動作を起こすかどうか」を分解すると
以下の(1),(2),(3)がそれぞれ未定義動作を起こすかどうかに帰結すると思う
(2)は確認してないけど多分問題ないよね.
659の指摘で(3)が通るのはいままで気づかなかった.

class A;
template <typename T> struct Hoge{};
int main ()
{
Hoge <A> h; // (1)
A *p; // (2)
delete p; // (3)
return 0;
}



661 名前:デフォルトの名無しさん :2006/02/07(火) 05:14:43
>「655が未定義動作を起こすかどうか」を分解すると
>以下の(1),(2),(3)がそれぞれ未定義動作を起こすかどうかに帰結すると思う
>>665の問題は「標準ライブラリの」テンプレート限定だから、それは違うんじゃないか?

662 名前:デフォルトの名無しさん :2006/02/07(火) 05:26:51
>>661
665は655の誤植として

それって「標準ライブラリの」テンプレートとその他のテンプレートで
振る舞いを変えるように規格で決められてるってこと?
それは不自然だと思うなぁ.
ソースがあるならよろしく


663 名前:デフォルトの名無しさん :2006/02/07(火) 05:32:49
>>658
いや、だから、item.h をインクルードして、
Item の定義をちゃんとしておけば大丈夫なんじゃないの?

664 名前:デフォルトの名無しさん :2006/02/07(火) 05:43:25
>>663
636の問いが
>item.hをインクルードするしかないのでしょうか。
だから663で問題が起こらなくとも636の答えにはなってない


665 名前:デフォルトの名無しさん :2006/02/07(火) 06:29:08
>>662
そうじゃない。 >640,652 が正解。

ほれ、ソースだ。17.4.3.6/2
http://www.kuzbass.ru/docs/isocpp/lib-intro.html#lib.res.on.functions

666 名前:デフォルトの名無しさん :2006/02/07(火) 06:55:24
でも>637は、ただ別名を定義しただけで、インスタンス化してる訳じゃない。
std::list<不完全型>自体を不完全型的に扱う限り、合法なんじゃないの。

667 名前:デフォルトの名無しさん :2006/02/07(火) 07:41:45
typedefした時点でインスタンス化が行われるとか云う話を、昔に聞いたことがあった。
というわけで、#defineでよくね?

668 名前:デフォルトの名無しさん :2006/02/07(火) 14:55:42
>>664
だから、「item.h をインクルードするしかない」という答えになるんじゃね?

>>667
#define しても、結局それを使う所で問題が起こると思われ。
ヘッダ内で使うと思うし。

669 名前:デフォルトの名無しさん :2006/02/07(火) 15:11:35
>>668
664の時点では637と640が提案されていて
637が合法かどうかは議論中であるが
640の提案に異存のあるレスはない
従って「item.h をインクルードするしかない」という答えにはならないヨ

>>667
>typedefした時点でインスタンス化が行われるとか云う話を、昔に聞いたことがあった。
これも規格中にソースを欲しいですね(私も探してますけど)

637といい642といい結構私は常用してるのですが
あんまりみなさん議論に乗ってこないとこ見るとやらないのかな?
pimplが非合法なんて影響でかいと思うのですが...


670 名前:デフォルトの名無しさん :2006/02/07(火) 15:22:43
pimplしたいならboost::shared_ptr使えば良いじゃない。
これは不完全型でも大丈夫だから

671 名前:デフォルトの名無しさん :2006/02/07(火) 15:44:58
>>670
ソースみたらboostのsmart_ptrは対策をしてあるようですね
pimplだったらscoped_ptrの方がいいのかな


672 名前:デフォルトの名無しさん :2006/02/07(火) 15:46:02
>>669
17.4.3.6/2 は標準ライブラリの話だよね。
おれは大体 pimpl に scoped_ptr 使うからどーでもいい。


673 名前:デフォルトの名無しさん :2006/02/07(火) 15:49:42
std::tr1::shared_ptr は問題が起こらないだろうけど、
標準ライブラリだから不完全型を使うと非合法になるのだろうか。

674 名前:デフォルトの名無しさん :2006/02/07(火) 16:14:19
いずれは boost:: じゃなくなりまするのか?

675 名前:デフォルトの名無しさん :2006/02/07(火) 19:34:39
>>669
>640の提案が>636の欲しかったものだとは思わないな。完全に違う実装だろこれ
でも正直、厳密な規格だのライブラリの実装だのを気にするくらいなら
不完全型を使うの控えて>640にするか素直に全部インクルードするな俺は

676 名前:デフォルトの名無しさん :2006/02/07(火) 20:21:51
std::string s;
std::cin >> s;

って具合に次々に文字列を読み込んでいくと、
確かに空白で区切られて読み込まれるんだけど、
改行した、ってのは認識できないですよね?
std::cin.peek() == '\n' とかで判定するんですか?

677 名前:デフォルトの名無しさん :2006/02/07(火) 20:27:11
>>676
std::getlineはだめ?

678 名前:デフォルトの名無しさん :2006/02/07(火) 20:34:43
ええ、あなた程度でも思いつくような事はさすがにやってます^^;;


679 名前:デフォルトの名無しさん :2006/02/07(火) 20:37:50
>>677 できれば全部 >> で出来たら便利だなぁと。
getline 使ってみますね。

680 名前:これがエラーになるのはなぜでしょうか? :2006/02/07(火) 20:51:22
namespace N {

class C {
public:
C(){}
friend std::istream operator>>(std::istream&, C&);
friend std::ostream operator<<(std::ostream&, const C&);

}; // class C
}//namespace N

681 名前:すみません、整形し直しました :2006/02/07(火) 20:51:53
namespace N {

class C {
public:
    C(){}
    friend std::istream operator>>(std::istream&, C&);
    friend std::ostream operator<<(std::ostream&, const C&);

}; // class C
}//namespace N

682 名前:デフォルトの名無しさん :2006/02/07(火) 20:57:12
エラーメッセージくらいよく読め

683 名前:デフォルトの名無しさん :2006/02/07(火) 21:40:51
ポインタを使用してa_typeというオブジェクトの配列にアクセスするとき、

a_type ob[10];
a_type *p = ob;
これは問題ないのに、

a_type ob[2][5];
a_type *p = ob;
これはエラーが出るのは何故?

684 名前:デフォルトの名無しさん :2006/02/07(火) 21:45:50
a_type**だから。

685 名前:デフォルトの名無しさん :2006/02/07(火) 21:47:13
a_type (*p)[5]=ob;


686 名前:デフォルトの名無しさん :2006/02/07(火) 22:07:50
684も未だにポインタが判らない人。

687 名前:デフォルトの名無しさん :2006/02/07(火) 22:23:25
>686
ほんとだ。すまんな、どうも気が触れていたようだ。
これで勘弁してくれ。つvoid*

688 名前:デフォルトの名無しさん :2006/02/07(火) 23:06:40
template<class T, int n>
class X
{
}

ここ int n の所を自分のオブジェクトにしたらコンパイルエラーが出るんだけどなんで?

template<class T, Point n>

みたいな感じで書くと

error: 'class Point' is not a vlid type for a template constant parameter

ってでちゃう。



689 名前:デフォルトの名無しさん :2006/02/07(火) 23:09:26
intじゃないから……

それは型じゃなくて値

690 名前:688 :2006/02/07(火) 23:13:19
>>689
ありがとう。
int 型の値 n が渡せて何で Point 型の値 n が渡せないの?


691 名前:デフォルトの名無しさん :2006/02/07(火) 23:15:31
規格票くらい自分で何とかしろ
タダで閲覧できるところまである

692 名前:デフォルトの名無しさん :2006/02/07(火) 23:24:34
>690
そういう規格としか。
intとかboolとかの整数系はOKだけど、floatとか構造体とかアウト。
ポインタはどうだっけ?

693 名前:デフォルトの名無しさん :2006/02/07(火) 23:26:23
>>690
リンカに Point 型の値を処理させるのは、とても大変で、
任意のユーザー定義型まで考えるとほとんど不可能だから。

694 名前:デフォルトの名無しさん :2006/02/07(火) 23:32:07
リンカとかは後付け設定だな
そもそも 688 の意図が単にコンパイラを困らせるだけのように見える

# 後付け設定の権化が規格だったりもするが

695 名前:デフォルトの名無しさん :2006/02/07(火) 23:33:12
>>673
http://www.google.co.jp/search?q=%22open%2Dstd%22+shared%5Fptr+%2217%2E4%2E3%2E6%22

696 名前:688 :2006/02/07(火) 23:38:41
>>692,693
ありがとう。駄目なんだね。
組み込みの整数型だけは渡せるようなナゾ仕様になってしまったのかはわからんが。

便利じゃね?

Point p1, p2;
length = getLength<float, p1,p2>();

とか書けたら。



それにしてもtemplateを勉強するのに良い本はない。

697 名前:デフォルトの名無しさん :2006/02/07(火) 23:47:41
>>696
それは
template <typename T> float getLength(T t1, T t2) {
return t2 - t1;
}
こうする事で int t = getLength<int>(5,8); などと書けるので
Point型に対した処理がしたいなら特殊化したテンプレートを書けば良いと思います

698 名前:デフォルトの名無しさん :2006/02/07(火) 23:54:20
>>697
それだと実行時の関数になる。

699 名前:デフォルトの名無しさん :2006/02/07(火) 23:55:04
つーかユーザー定義型の使用を認めたらただでさえ難解なtemplateが
可読性0の埋め込み型スクリプト言語になっちまうぞ。

700 名前:デフォルトの名無しさん :2006/02/07(火) 23:55:04
template<class T, Point& n>
template<class T, Point* n>
これならいける。

701 名前:デフォルトの名無しさん :2006/02/08(水) 00:01:38
>>698
最適化されるでしょう

702 名前:デフォルトの名無しさん :2006/02/08(水) 00:08:21
>>695
サンクス

703 名前:デフォルトの名無しさん :2006/02/08(水) 00:48:14
>>701
最適化されたとしても引数が定数でないことに変わりはないから、他のテンプレートに渡したりはできないわな。
>>696が何をやろうとしているのか分からんが。

704 名前:デフォルトの名無しさん :2006/02/08(水) 01:07:16
template< typename Key, typename Value >
void foo( map<Key, Value>& in )
{
    map<Key , Value>::iterator it;
}

これをコンパイルするとエラーになるんですが、
正しくはどう書けばいいんでしょうか?

705 名前:デフォルトの名無しさん :2006/02/08(水) 01:11:43
GCC だと

typename map<Key, Value>::iterator it;

とする必要がある。
でも、コンパイラによっては typename を入れた方がエラーになる。

#if defined(__GNUC__)
#define TYPENAME typename
#else
#define TYPENAME
#endif

とかやっといて、

TYPENAME map<Key, Value>::iterator it;

とするが吉。

706 名前:デフォルトの名無しさん :2006/02/08(水) 01:20:34
>>705
まさにgccでした。ありがとうございます。

707 名前:デフォルトの名無しさん :2006/02/08(水) 01:36:31
>>705
これって、規格的には typename 入れるのと入れないのと、
どっちの方が正しいのかな?
何か時代によって変わってそうな気もするけど。

708 名前:デフォルトの名無しさん :2006/02/08(水) 02:18:09
>>707
文句なく入れるのが正しい。

709 名前:デフォルトの名無しさん :2006/02/08(水) 02:18:38
mapが特殊化されていてiteratorは定義されていなかったりする可能性があるから

710 名前:デフォルトの名無しさん :2006/02/08(水) 02:53:48
なるほど。
「typename はテンプレート仮引数にしか使えません」
とかエラー出るコンパイラは、まだ準拠できてないってことか。

711 名前:デフォルトの名無しさん :2006/02/08(水) 03:17:52
typenameって、「これは型名ですよ」とコンパイラに教える意味も
持ってるんじゃなかった?
(classの先行宣言と一緒=以前はclassで代用してたのかも)

とすれば、>>704の例だと
typename map<Key , Value>::iterator; // 先行宣言
map<Key , Value>::iterator it;
なら、どんなコンパイラでも(typenameというキーワードをサポートしていれば)
通りそうな気がするんだけど。

試してないけどね。

712 名前:デフォルトの名無しさん :2006/02/08(水) 03:20:11
あ、でも、エラーが>>710だとしたら、絶対無理か。

713 名前:デフォルトの名無しさん :2006/02/08(水) 04:07:37
>>711
それはまったくのガセネタだな。どこで仕入れてきたんだ?

714 名前:デフォルトの名無しさん :2006/02/08(水) 04:09:59
>>713
ぐぐったら
http://ja.wikipedia.org/wiki/%E4%BA%88%E7%B4%84%E8%AA%9E_(C++)
のtypenameのところにあった

715 名前:デフォルトの名無しさん :2006/02/08(水) 04:21:20
>>714
は?そこの解説には >711 のような内容は書いてないぞ。
typename が宣言を作るわけじゃない。

716 名前:デフォルトの名無しさん :2006/02/08(水) 05:57:53
711の上の部分しか読んでなかった。

typenameが
1.テンプレート引数で型を引数にとることを示すことに使う。(classで代用可能)
2.続く識別子が型名であることを示す。
だから型名であることを言うだけで宣言じゃないのは確かだな

717 名前:デフォルトの名無しさん :2006/02/08(水) 08:37:34
delete について質問です。
new hoge[n] で獲得した領域は delete[] で解放しなくてはいけないそうですが、new hoge で獲得した領域を delete[] しても大丈夫でしょうか?
それとも delete[] したいなら、new hoge[1] とかするべきでしょうか(これだとコンストラクタに引数を渡したい場合に困りそうですが)。

あと、都合により
void *p = (void*)new hoge;
と獲得した領域を delete する場合、delete (hoge*)p とやらないと hoge のデストラクタが走らないのは仕様なんですよね?
つまり、delete に渡すポインタは、new したときの型で渡さないといけないということですよね?
# できればキャストせずにうまく動いて欲しいのですが


718 名前:デフォルトの名無しさん :2006/02/08(水) 08:59:06
new-deleteとnew[]-delete[]の対応は神聖不可侵。犯すべからず。

あとvoid*ではdeleteできません。 どのデストラクタ呼んでいいのか判らんでしょう。
// 技術的な可能不可能の話で言えば、vtbl持ってるクラスのインスタンスならvoid*でもdeleteできそうだけど、
// void*ポインタからvtbl持ってるか判別はできないのでやっぱり無理。

719 名前:デフォルトの名無しさん :2006/02/08(水) 09:07:01
強制的なポインタのキャストはやらない方がいいよね、安全面から。
ってそれを言語使用として禁止してしまわないのがC++のいいところ何だが。

なんでそんなことをしたいのか分からないけど、
もしいろんな型のオブジェクトを一手に扱いたい、なんてことであれば
一つの基底クラスから全部派生させるようにして
仮想デストラクタを使うようにするのがオブジェクト指向的だと思われ。
まぁ Java でいうところの Object クラスみたいなもん。
(C# だとどうなんだったっけ?)

720 名前:717 :2006/02/08(水) 09:24:48
>>718
わかった。ありがとう。

でも、void* の delete の話を技術的に解決する話なら、new したときに獲得メモリブロックのヘッダにデストラクタのポインタか
vtblのオフセットかを記録しておけば、delete に渡されたときの型によらず適切なデストラクタを呼び出すことができそうじゃない?
いや、そういう仕様になってないんだから文句も無いけど。

>>719
char[] を獲得して void* に代入して、そのまま delete してるソースがあったから、気になって聞いてみた。
規定クラスの話は、自分で新規に作るなら多分そうします。
ありがとう。


721 名前:仕様書無しさん :2006/02/08(水) 11:25:41
全てのオブジェクト派生元となる基底クラスに ...

virtual void Suicide() { delete this; }

ってな仮想関数を用意して、

pObj->Suicide();

とでもすれば?

722 名前:デフォルトの名無しさん :2006/02/08(水) 11:29:12
>>721
それ、 virtual デストラクタ+普通の delete に比べて、何がメリットなの?

723 名前:デフォルトの名無しさん :2006/02/08(水) 11:39:48
>>721 仮想デストラクタじゃだめなの??
って書こうと思ったらすでに書かれてた。

724 名前:デフォルトの名無しさん :2006/02/08(水) 13:42:30
はじめまして
本日からC++をはじめた。初心者PGです。
さっそくお伺いしたいのですが。
javaで書く

data.java
----------------------
1|class data {
2|
3| public string data;
4| public string data2;
5|}
===================================
test.java
----------------------
1|import data;
2|
3|class test {
4|
5| MethodTest(data pData) {
6|
7| string strPara;
8| strPara = pData.data2;
9| }
10|}

はどのようにC++でどのように表現すればいいのでしょうか?

現在、C++でDLLを生成し VBで生成したDLLを使用する処理を作っているのですが。

DLLの呼び出し関数の引数と戻り値に 構造体を使用したいのです。
よろしくお願いします。

725 名前:デフォルトの名無しさん :2006/02/08(水) 13:51:11
こういうのがプロなのか
ネットを何だと思ってるのかな

726 名前:デフォルトの名無しさん :2006/02/08(水) 17:05:04
これは釣りだろ


727 名前:デフォルトの名無しさん :2006/02/08(水) 17:21:54
int i;
std::cin >> i ;
として数値を読み込んでいます。
もし入力されたモノが数値としてふさわしくない文字列だった場合、
そのことを知るにはどういう方法があるのでしょうか?

728 名前:デフォルトの名無しさん :2006/02/08(水) 17:22:58
if(!(std::cin>>i)){
    ふさわしくない時
}

729 名前:デフォルトの名無しさん :2006/02/08(水) 17:27:53
>>724
http://pc8.2ch.net/test/read.cgi/tech/1135828083/610

730 名前:デフォルトの名無しさん :2006/02/08(水) 17:41:12
>>728 ありがとうございます。
つまり、istream::fail() ということですね。

731 名前:デフォルトの名無しさん :2006/02/08(水) 19:26:34
>>720
メモリ空間を圧迫するから採用されなかったんじゃないかな。
たとえば、メンバがポインタ変数一つしかないようなクラスを考えると
デストラクタのポインタが増えることで実質倍のメモリを消費する。


732 名前:デフォルトの名無しさん :2006/02/08(水) 19:44:25
そもそも、そういうことはポリモーフィズムで解決するのが C++ 流。
そういう場合に void* を使った時点で設計ミス扱いされても文句は言えない。

733 名前:デフォルトの名無しさん :2006/02/08(水) 20:39:42
>>731
でもnewで割当てられたメモリブロックには元々メモリ管理情報が付加されてるから、ポインタ一つくらい増えても問題はないんじゃないかと思わなくも無い。
この辺は処理系依存と呼ばれる部分だろうけど。

734 名前:デフォルトの名無しさん :2006/02/08(水) 21:51:15
>>720
やろうと思えば、その通りのことがユーザコーディングでできてしまうのが C++ 。

735 名前:デフォルトの名無しさん :2006/02/08(水) 21:52:52
>>717
newして得たポインタを保持するのにboost::shared_ptr<void>を使えばよい。
boost::shared_ptrは自身のコンストラクタへの引数に与えられた型を保存しておいて、
その型でdeleteを呼んでくれるから、元の型のデストラクタが呼ばれる。

736 名前:デフォルトの名無しさん :2006/02/08(水) 22:02:47
初心者的な質問でもうしわけないですが
構造体をファイルで管理するのはどうすればいいのですか?
構造体のメンバも一つずつファイルに書きこまにと駄目なですか??
構造体名だけを保存してたんですが、いざメンバを使おうとしたら
読み込んでも使えない・・・・・・なにかヒントくださいTT

737 名前:デフォルトの名無しさん :2006/02/08(水) 22:04:34
構造体名だけを保存の意味がわからん。プログラミング言語であらわせ

738 名前:デフォルトの名無しさん :2006/02/08(水) 22:15:26
>>736
なにベースでコード書いてる?
Win32API? Cの標準関数? C++のストリーム系?

739 名前:デフォルトの名無しさん :2006/02/08(水) 22:22:43
Boost.Serializationなんて言ってみる。

740 名前:デフォルトの名無しさん :2006/02/08(水) 22:29:43
>>736
構造体を new するとき、ファイルを open
構造体からメンバを get するとき、ファイルから read
構造体にメンバを set するとき、ファイルから write
構造体を delete するとき、ファイルを close
する関数を作れば ok


741 名前:デフォルトの名無しさん :2006/02/08(水) 23:19:50
const参照についてなんですが、

class foo {
 T hoge_;
public:
 const T& hoge1; // <--(a)
 T const& hoge2; // <--(b)

 foo(): hoge1(hoge_),hoge2(hoge_) {}
};

上の(a)と(b)の書き方で何か意味の違いがあるのでしょうか?

742 名前:デフォルトの名無しさん :2006/02/08(水) 23:22:14
>> 741
ない。

743 名前:デフォルトの名無しさん :2006/02/08(水) 23:23:21
>>742
ありがとうございます。

744 名前:デフォルトの名無しさん :2006/02/08(水) 23:35:00
& const
の意味が聞きたかったんちゃうのか?

745 名前:デフォルトの名無しさん :2006/02/08(水) 23:36:40
& constなどない。

746 名前:デフォルトの名無しさん :2006/02/09(木) 00:05:57
質問です。
java では引数とメンバ変数がかぶっていても、メンバ変数の方を
"this.foo"とするようにしておけば特に問題ない。
1.C++ でも this ポインタを使えば同じことができるでしょうか?
(g++ では問題なかった)
2.(上がOKの場合のみ) C++ で this->hoge = foo; って書くと変?


747 名前:746 :2006/02/09(木) 00:09:55
> 2.(上がOKの場合のみ) C++ で this->hoge = foo; って書くと変?

2.(上がOKの場合のみ) C++ で this->foo = foo; って書くと変?

の間違いでした…

748 名前:デフォルトの名無しさん :2006/02/09(木) 00:15:12
>>746
普通に出来るし変でもない。

749 名前:デフォルトの名無しさん :2006/02/09(木) 01:18:44
>>746
1.できるお
2.変じゃないお

750 名前:デフォルトの名無しさん :2006/02/09(木) 01:20:23
でも、そんなことをするのは馬鹿しかいない。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.