C++相談室 part66
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/02/12(木) 15:34:43ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part65
http://pc11.2ch.net/test/read.cgi/tech/1230341243/
0002デフォルトの名無しさん
2009/02/12(木) 15:43:49環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0003デフォルトの名無しさん
2009/02/12(木) 21:58:530004デフォルトの名無しさん
2009/02/13(金) 00:19:34DLL のクラスの変数をほかのアプリケーションから利用したいのですが、アプリケーションのビルドでリンカーエラーになってしまいます。
---DLL のクラスのヘッダーの一部---
class __declspec(dllexport) Sample1
{
public:
Sample1(void);
~Sample1(void);
public:
static const char *str_data;
};
---DLLのクラスのCPPの一部---
const char *Sample1::str_data = "Hoge";
---アプリケーションのCPPの一部---
_TCHAR buf[255];
_swprintf(buf, _T("str_data = %s\r\n"), Sample1::str_data);
::OutputDebugString(buf);
DLLはビルドできますが、アプリケーションでは
error LNK2001: 外部シンボル ""public: static char const * const Sample1::str_data" (?str_data@Sample1@@2PBDB)" は未解決です。
とでてしまいます。
よろしくお願いします。
0005デフォルトの名無しさん
2009/02/13(金) 00:21:5500064
2009/02/13(金) 00:24:20していません。 __declspec(dllexport) はしているのですが。
dllimport については使ったことがなかったので調べて見ます。ありがとうございます。
00074
2009/02/13(金) 00:54:46以下のように アプリケーションのヘッダーに dllimport を追加しましたが、同じリンカーエラーになりました。
---アプリケーションのヘッダー---
#include "resource.h"
#include "..\\Test_class\\Sample1.h"
#pragma comment(lib, "Test_class.lib")
__declspec(dllimport) Sample1;
リンカーエラー
Test_classApp.obj : error LNK2001: 外部シンボル ""public: static char const * const Sample1::str_data" (?str_data@Sample1@@2PBDB)" は未解決です。
ちなみに、VC++ 2008 Express を使っています。
static const のメンバ変数の書き方は、
ttp://frog.raindrop.jp/knowledge/archives/000281.html
などを参考にさせていただいたのですが、問題ないように思えます。
はっきりいって、原因がさっぱりわかりません。
強いていえば、やはり dllimport のような DLL をつかった場合の設定を間違えているのかと思っています。
今日はもうレスができないかもしれませんが、よろしくおねがいします。
0008デフォルトの名無しさん
2009/02/13(金) 00:58:13使う側はclass __declspec(dllimport) Sample1になるようにしないとだめだよ。
0009デフォルトの名無しさん
2009/02/13(金) 02:22:29ゴミクズ
0010デフォルトの名無しさん
2009/02/13(金) 08:49:08生ごみ
0011デフォルトの名無しさん
2009/02/13(金) 11:18:34クラス名 ob1;
クラス名 *ob2;
この上と下の違いはなんでしょうか?
上は新しくクラスをつくっていて
下はクラスのアドレスを渡しているということですか?
0012デフォルトの名無しさん
2009/02/13(金) 11:36:20上はオブジェクトの作成。
下はオブジェクトへのポインタの作成。
ただの宣言文なのでアドレスを渡しているわけではない。
0013デフォルトの名無しさん
2009/02/13(金) 11:55:06C++相談室 part66
http://pc11.2ch.net/test/read.cgi/tech/1231640498/l50
0014デフォルトの名無しさん
2009/02/13(金) 18:51:59使わない
0015デフォルトの名無しさん
2009/02/13(金) 22:35:570016デフォルトの名無しさん
2009/02/14(土) 15:16:580017赤西仁
2009/02/14(土) 16:31:29PSのアークザラッド�Uというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
・ttp://www.gradius2.com/index.php?UID=1174775153
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。
0018デフォルトの名無しさん
2009/02/14(土) 16:34:210019赤西仁
2009/02/14(土) 16:35:37PSのアークザラッド�Uというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
・ttp://www.gradius2.com/index.php?UID=1174775153
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。
0020デフォルトの名無しさん
2009/02/14(土) 16:37:400021デフォルトの名無しさん
2009/02/14(土) 19:48:57PSのアークザラッド�Uというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
・ttp://www.gradius2.com/index.php?UID=1174775153
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。
0022デフォルトの名無しさん
2009/02/14(土) 21:09:26// hoge.hpp
#include <色々>
namespace hogeImpl {
using namespace 色々;
class hogeClass { ... }
}
}
using hogeImpl::hogeClass;
こんな感じで押し込むのはダメ?
0023赤西仁
2009/02/14(土) 21:10:56PSのアークザラッド�Uというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
・ttp://www.gradius2.com/index.php?UID=1174775153
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。
0024デフォルトの名無しさん
2009/02/14(土) 21:19:37外部から hogeImpl::XXX として「色々」の中のものがアクセスできる、つまり「色々」の中のものは
hogeImpl の要素なんだ、と思えるのならば OK。
それでも大抵は using namespace よりは using 宣言になるだろうけど。
0025デフォルトの名無しさん
2009/02/14(土) 21:46:21説明が足りなかった。ごめん。ヘッダ利用者は hogeImpl 以下を使わない。
namespace hogeImpl {} をプライベートな名前空間だと思って
好き勝手に実装を書き、外に見せたいものだけ using hogeImpl::... しておく。
そうすれば、実装部分で using namespace std; していても、
余分な名前が漏れることは防げると思うんだけど、そういうコードを見たことがないので
何か落とし穴があるのかと不安で。
0026デフォルトの名無しさん
2009/02/15(日) 00:56:56> namespace hogeImpl {} をプライベートな名前空間だと思って
> 好き勝手に実装を書き、外に見せたいものだけ using hogeImpl::... しておく。
これ自体は boost とかでも頻出パターン(大抵は detail という名前空間)。
using directive の使用についてはライブラリ利用者としては問題ないだろうけど、
実装者側で名前の衝突が発生する危険はある。
boost だと(意図的に名前を持ち込む場合以外の) using directive は関数ブロック内に
限定した利用がほとんどのようだ。
できるだけ影響範囲を限定しよう、という意図だと思う。
0027デフォルトの名無しさん
2009/02/15(日) 13:43:13なるほど。ありがとう。
やはり using は、関数ブロック内程度に留めておくことにします。
0028デフォルトの名無しさん
2009/02/16(月) 20:40:53質問があります。
STLはヘッダにその実装が書いてあるわけですが、
ということは「翻訳単位毎にコードが生成される」のでしょうか?
a,cpp
b.cpp
両方<vector>をincludeし、両方で vector<int> が使われていた場合、vector<int>のコードは2つ作られてしまうのでしょうか?
EXEファイルの容量がガンガン増えるような気がするのですが・・・
0029デフォルトの名無しさん
2009/02/16(月) 20:50:51かしこいコンパイラなら少しは最適化してくれるけど当てにしちゃいけない
0030デフォルトの名無しさん
2009/02/16(月) 20:59:52さすがに同じものが2つも残るのは珍しいだろう。
0031デフォルトの名無しさん
2009/02/16(月) 22:16:311つにまとめなかったらstaticメンバ変数とかどうなるんだよ。
0032デフォルトの名無しさん
2009/02/16(月) 22:17:13真・スレッドリスターター(以下略)をあぼんしてたので誘導されてるのに気づかず向こうで答えちゃった。
0033デフォルトの名無しさん
2009/02/16(月) 22:23:25b.cppでインクルードしたテンプレートから作ったvector<int>が
同じである保証はどこにもないんだから、まとめようがないだろ
普通に考えれば
オレオレ<vector>が使われてないという前提なら<vector>は全部一緒だから
標準ライブラリだけ特別扱いしてでまとめてくれるとか、そういう話?
0034デフォルトの名無しさん
2009/02/16(月) 22:27:56一体この A<int>::a はどうなるんだよ。
翻訳単位事に作られたら規格違反じゃねぇか。
template <typename T> struct A {
static T a;
};
template <typename T> T A<T>::a;
0035デフォルトの名無しさん
2009/02/16(月) 22:32:57勝手にまとめられるわけないだろ
template <typename T> struct A {
static int a(T);
};
0036デフォルトの名無しさん
2009/02/16(月) 22:34:16単一定義規則 (ODR) と言って、その保証をするのはプログラマの仕事。
0037デフォルトの名無しさん
2009/02/16(月) 22:38:23リンクエラーになるに決まってるだろw
0038デフォルトの名無しさん
2009/02/16(月) 22:43:15だろ?
まとめられるわけがないんだって
0039デフォルトの名無しさん
2009/02/16(月) 22:57:290040デフォルトの名無しさん
2009/02/16(月) 23:04:040041デフォルトの名無しさん
2009/02/16(月) 23:18:51同名の複数の実体をまとめるかまとめないかはコンパイラ・リンカしだい。
>>36が言うように
いずれにせよプログラマが同一であることを保障する必要がある。
0042デフォルトの名無しさん
2009/02/16(月) 23:39:26誘導されんなボケナス
0043デフォルトの名無しさん
2009/02/17(火) 16:31:16>>28さんが実際にいくつもa.cppやb.cppらを作って全部リンクしてみて実際に実行ファイルの容量がでかくなるか試してみればいいんじゃないの?
0044デフォルトの名無しさん
2009/02/17(火) 23:47:420045デフォルトの名無しさん
2009/02/18(水) 11:11:14ボケナスとはずいぶん古風な煽り方をなさるw
0046デフォルトの名無しさん
2009/02/18(水) 11:39:340047デフォルトの名無しさん
2009/02/18(水) 18:27:430048デフォルトの名無しさん
2009/02/18(水) 19:13:350049デフォルトの名無しさん
2009/02/18(水) 23:27:330050デフォルトの名無しさん
2009/02/19(木) 13:05:44std::stringとstd::wstringの変換って出来ません?
std::ostringstreamとかを使うのも可で、とにかく標準C++の範囲で。
0051デフォルトの名無しさん
2009/02/19(木) 13:22:17std::codecvtを使うらしいが詳細はシラネ
0052デフォルトの名無しさん
2009/02/19(木) 13:42:40http://hw001.gate01.com/eggplant/tcf/cpp/strcnv.hpp
005350
2009/02/19(木) 13:58:44今から見てみるわ。
0054デフォルトの名無しさん
2009/02/19(木) 23:52:07標準だけとコンパイラによって微妙に違ったり
OSに渡すのに適してなかったり。
0055デフォルトの名無しさん
2009/02/20(金) 00:12:310056デフォルトの名無しさん
2009/02/20(金) 02:01:19というエラーが出るのですが、原因が分かりません。
0057デフォルトの名無しさん
2009/02/20(金) 02:06:28の定義が無いと言ってる
0058デフォルトの名無しさん
2009/02/20(金) 02:07:25たとえば CDun01 の継承元 CDunBase の引数を持たないコンストラクタが
宣言されているが定義されていない場合、そんなエラーが起こるでしょう。
0059デフォルトの名無しさん
2009/02/20(金) 02:07:470060デフォルトの名無しさん
2009/02/20(金) 02:08:260061デフォルトの名無しさん
2009/02/20(金) 02:22:34やっぱり理解してないものはあまり使うべきじゃありませんね。
0063デフォルトの名無しさん
2009/02/20(金) 17:28:19>>52のコードを書いた張本人だけど、ぶっちゃけ俺もロケールの動作とか関数とかはよく判っていない。
そもそもwchar_t関係は具体的な定義が仕様になかったり、VCとgccでwchar_tの大きさが違ったり、
さらにVCの各Ver.ごとに致命的なバグとか仕様の違いとかが結構あったりして、
正直C++標準のロケールは使い辛いと言わざるを得ない。
あまり本格的でない用途に使うならwchar_t/codecvtでもいいと思うけど、
ちゃんとしたいならやっぱりICUとかの外部ライブラリを使って、
さらにプリプロセッサでwin32と*nixを分岐させるとかの面倒なことをしなきゃだめだと思う。
// >>52の引数2つの関数は、たぶん予めstd::locale::global(std::locale("japanese"));しないといけなかったはず。
006450(=62)
2009/02/20(金) 20:25:21そうなんですか。wchat_tはこのままだとC++の黒歴史状態に?
そして、まさかあのコードを書いた方がここにいらっしゃるとは、2chって(てかネットって)わからない。
0065デフォルトの名無しさん
2009/02/20(金) 23:02:04hoge(int &arg)
を参照渡しだと思っているんだが、
hoge(int *arg)
int i;
hoge(&i)
これも参照渡しって言うの?
誰かこのモヤモヤを取ってくだしあうあ
0066デフォルトの名無しさん
2009/02/20(金) 23:03:04それはアドレス渡し
0067デフォルトの名無しさん
2009/02/20(金) 23:06:55hoge(int &arg)は参照の値渡しだし
hoge(int *arg)はポインタの値渡しだし
渡された値を参照にも使えるというだけ
0068デフォルトの名無しさん
2009/02/20(金) 23:19:04まさかとは思うけど、参照とアドレスを取得する時に使う&の区別は付いているよね?
int a=&b;
と
int &x=y;
とでは意味が全く違うことは知ってるよね?
006968
2009/02/20(金) 23:20:08int a=&b;
は
int* p=&b;
の間違いっす!
0070デフォルトの名無しさん
2009/02/20(金) 23:34:40じゃあ、厳密な「参照渡し」ってなんだよ。
hoge(int &arg)が正真正銘の参照渡しじゃなければ、何が違うというのだ?
0071デフォルトの名無しさん
2009/02/20(金) 23:39:46int a = &b;
これも(意味は異なるが)参照だと思ってた
ということは参照渡しって
hoge(int &arg)
だけなんだね
sanx
0072デフォルトの名無しさん
2009/02/20(金) 23:53:24参照の値渡しwww
hoge(int &arg) は正真正銘参照渡しだ。
参照は再代入できないって点をよーく考えてみるんだな。
0073デフォルトの名無しさん
2009/02/20(金) 23:59:52これってJavaの話だろう
0074デフォルトの名無しさん
2009/02/21(土) 00:05:27C++の参照はポインタのシンタックスシュガーに過ぎない
裏でやってるのはあくまでアドレスの値渡し
>>72
意味がわからない
じゃあhoge(int *const arg)は「正真正銘参照渡し」だと言いたいの?
0075デフォルトの名無しさん
2009/02/21(土) 00:11:200076デフォルトの名無しさん
2009/02/21(土) 00:12:19ポインタのシンタックスシュガーだと規格に載ってるのか?
0077デフォルトの名無しさん
2009/02/21(土) 00:17:39FORTRAN は参照渡しだけど
C から FORTRAN の関数呼ぶときゃ
引数をポインタにして扱うだろw
裏でアドレス渡していようが、それが見えなきゃ参照渡しだ。
あと、再代入ができない、というのは、お前に対してははしょりすぎたな。
参照そのものを触ることができない、というのが一番重要な点だ。
常に参照先ののものにしか触る事が出来ない。
ポインタは参照元に触る事が出来る。
const だろうがポインタのアドレスをとることもできる。
0078デフォルトの名無しさん
2009/02/21(土) 00:19:35特にC++という言語はそうだ
int&というものはint*と基本的には一緒
書き方とできる操作の範囲がちょっと違うだけ
0079デフォルトの名無しさん
2009/02/21(土) 00:23:05FORTRANの下りは当たり前じゃん
Cから呼ぶんだからCの作法で呼ぶ
それは参照に使えるアドレス値の値渡しだ
参照のアドレス値が取れるかどうかなんて大した問題じゃないね
参照はコピーできるんだから、番地は見えなくたってアドレスを扱うことはできてる
0080デフォルトの名無しさん
2009/02/21(土) 00:28:250081デフォルトの名無しさん
2009/02/21(土) 00:31:05参照ってなんなの? ってのが分かってないようだな。
0082デフォルトの名無しさん
2009/02/21(土) 00:31:39void f(int *p)は、値渡しの一種であるポインタ渡し
void f(int &p)は、参照渡し
Cには値渡ししかないがC++には参照渡しもある
>参照はコピーできる
参照しているものはコピー出来る
参照している先のアドレスもポインタを使えばコピー出来る
けど、参照の参照(参照自体のアドレスの取得)は出来ないよ
0083デフォルトの名無しさん
2009/02/21(土) 00:39:06それで問題ない。
0084デフォルトの名無しさん
2009/02/21(土) 00:39:30概念的には参照渡しだけど、Cの用語としては参照渡しではない
知らないけど
0085デフォルトの名無しさん
2009/02/21(土) 00:40:240086デフォルトの名無しさん
2009/02/21(土) 00:41:23取ることが言語で禁止されてるだけでアドレスはメモリ上のどっかにあるはずなんだが
なんでアドレス値をプログラムから見ることにこだわるの?
0087デフォルトの名無しさん
2009/02/21(土) 00:42:34そんなこといったら参照渡しなんて存在しなくなるぞw
0088デフォルトの名無しさん
2009/02/21(土) 00:45:07int n;
f(&n);
n にとっては参照渡しと言えなくもないが、
&n を入れた変数自体も触れるので完全な参照渡しとは言えない。
参照渡しを値渡しを使って無理矢理エミュレートしている、程度の代物。
無条件で「参照渡しだ!」と言っちゃうと色々困った理解をする人が現れるのを
何度も見た事があるので、口が裂けても参照渡しと言いたくはない。
0089デフォルトの名無しさん
2009/02/21(土) 00:48:26関数ローカルの参照作ってスタック覗けば多分「参照の値」が見えると思うよ
注意しないと最適化で消されちゃうだろうけど
0090デフォルトの名無しさん
2009/02/21(土) 00:51:27プログラムから触れないから意味があるんじゃないか
いい記事見つけたから、分からず屋のあんたはこれでも読みない
ttp://java-house.jp/ml/archive/j-h-b/026214.html
0091デフォルトの名無しさん
2009/02/21(土) 00:55:55C++からならC++参照使ってもできるよ。
そこでは、Fortranの参照とCのポインタとC++の参照の内部表現がたまたま共通だったから。
0092デフォルトの名無しさん
2009/02/21(土) 01:08:13俺もまぜて
0093デフォルトの名無しさん
2009/02/21(土) 01:08:13要するに内部表現は参照渡しかどうかにゃ関係ないっつー話だ。
009492
2009/02/21(土) 01:10:27「ソースコードに記述したとおりに標準C++の規格準拠に動けば
内部でアドレスを使おうが、
あるいはどのような非効率で妙な内部表現であったとしても、
そんなん全然関係ないよ」
ってことか??
0095デフォルトの名無しさん
2009/02/21(土) 01:10:33一番違いがわかりやすいのは、参照渡し⇒「仮引数に左辺値」がくる
int f(int &p)に対してf(1)って呼び出しは出来ない。1は右辺値だからな
0096デフォルトの名無しさん
2009/02/21(土) 01:12:56しかし、参照するのは右辺値そのものではなく、
それをコピーして作ったテンポラリオブジェクト(左辺値)だけどね。
0098デフォルトの名無しさん
2009/02/21(土) 01:16:05これ常識。
0099デフォルトの名無しさん
2009/02/21(土) 01:16:41書いてみるもんだな、勉強になたよ
010092
2009/02/21(土) 01:16:420101デフォルトの名無しさん
2009/02/21(土) 01:20:070102デフォルトの名無しさん
2009/02/21(土) 01:22:39気を遣って書かない限りすぐ左辺値参照に倒れるようになってるし
0103デフォルトの名無しさん
2009/02/21(土) 01:29:38の鍵括弧の中にムーブコンストラクタ・ムーブ代入演算子が増えるだけ。
(コピー不可・ムーブ可という選択肢もあるが)
あとはvectorの中とか関数戻り値でコンパイラが生成するコードとかで勝手にやってくれる。
0104デフォルトの名無しさん
2009/02/21(土) 01:34:46あんまり気にしなくていい
0105デフォルトの名無しさん
2009/02/21(土) 01:35:50C++0xに対応したらどんなごつさになるんだ?
0106デフォルトの名無しさん
2009/02/21(土) 01:56:54std空間に定義していく今のやり方はあまり良くないだろうと
0107デフォルトの名無しさん
2009/02/21(土) 02:03:14swapは自分の名前空間で定義するのが主流になりつつあるでしょ。
あとは、標準でいくらかお墨付きになるのを待つだけで。
0108デフォルトの名無しさん
2009/02/21(土) 02:04:090109デフォルトの名無しさん
2009/02/21(土) 02:30:320110デフォルトの名無しさん
2009/02/21(土) 11:05:450111デフォルトの名無しさん
2009/02/21(土) 11:08:500112デフォルトの名無しさん
2009/02/21(土) 11:16:44ちょwww待って先生!!重症なんですw
とりあえず Windows で教えてください。
EXEのヘッダにエントリがあった気もするし…
サイズじゃなくても、sp の最小値でもいいです。
取れませんか??
0113デフォルトの名無しさん
2009/02/21(土) 11:22:350114デフォルトの名無しさん
2009/02/21(土) 11:50:35よく考えたらスレチでしたorz
APIスレ行ってきます!
0115デフォルトの名無しさん
2009/02/21(土) 16:53:54例えば最初が_で始まってはならないなどです
0116デフォルトの名無しさん
2009/02/21(土) 16:56:04まあ、全部大文字はマクロに使う人が多いから使わない方がいいだろう、程度しか。
0118デフォルトの名無しさん
2009/02/21(土) 16:58:440119デフォルトの名無しさん
2009/02/21(土) 17:04:50STLとshared_ptrを使ってみるとありがたみがわかる。
0120デフォルトの名無しさん
2009/02/21(土) 17:09:05全部小文字派とアッパーキャメルケース派に大別されるのではないかな。
クラス名と被らないような、より抽象的なカテゴリ名を使ったり、
一部.netでやってるように複数形にしてお茶を濁したり。
0122デフォルトの名無しさん
2009/02/21(土) 17:16:260123デフォルトの名無しさん
2009/02/21(土) 17:19:26どういうことですか?
namespaceのNってことですか?
0124デフォルトの名無しさん
2009/02/21(土) 17:27:480125デフォルトの名無しさん
2009/02/21(土) 17:40:060126デフォルトの名無しさん
2009/02/21(土) 17:42:52変な細工はあんまりいらないと思う
0127デフォルトの名無しさん
2009/02/21(土) 17:49:000128デフォルトの名無しさん
2009/02/21(土) 17:50:44template <typename T>
class Myclass
{
public:
T mem;
//他、Tを使ったメンバ関数・メンバ変数が多数
int foo(int x){std::cout << x << std::endl;return x;}
double foo(double x){std::cout << x << std::endl;return x;};
unsigned long foo(unsigned long x){std::cout << x << std::endl;return x;};
};
のようなクラスがあって、呼び出すときは
Myclass<char> hoge;
hoge.foo((int)-1);
hoge.foo((double)3.14);
hoge.foo((unsigned long)42);
のように使っている状況。
で、この3つのfooをテンプレートにしてまとめたいんだけど、どうすりゃいいかね??
template <typename T,typename U>
class Myclass
{//〜〜};
とは意味合いが違うじゃん。。。
0129デフォルトの名無しさん
2009/02/21(土) 17:56:51U foo(U x){std::cout << x << std::endl;return x;}
をメンバにすればいいだけじゃないの
0130デフォルトの名無しさん
2009/02/21(土) 18:03:02できた。
テンプレートの中にテンプレートを入れ子にできるのか。
ありがとう。
0131128
2009/02/21(土) 18:26:11template <typename T>
class Myclass
{
public:
T mem;
//他、Tを使ったメンバ関数・メンバ変数が多数
Myclass();
template<typename T,typename U> Myclass(U x);//コンストラクタ
};
template <typename T>
Myclass<T>::Myclass(){}
template <typename T,typename U>
Myclass<T>::Myclass(U x){}
こうするとbccにて
テンプレート 'Myclass<T>' に対して宣言されたテンプレートパラメータが多すぎる
'Myclass<T>::Myclass(U)' は 'Myclass<T>' のメンバーではない
'Myclass<char>::Myclass(int)' に一致するものが見つからない(関数 main() )
って言われた。
int main()
{
Myclass<char> hoge;
Myclass<char> piyo(42);
return 0;}
です。
この場合はどうやって宣言したらいいですか??
0132デフォルトの名無しさん
2009/02/21(土) 19:16:170133128
2009/02/21(土) 19:44:41クラス内の定義はそれでいけた。
クラス外はどうすればいい?
template <typename T,typename U>
Myclass<T>::Myclass(U x){}
だとダメっぽいんだが
template <typename T>
template <typename U>
Myclass<T>::Myclass(U x){}
にしてみたら出来る。
これで、間違ってない?
0134デフォルトの名無しさん
2009/02/21(土) 20:11:23プログラムと相談内容はこちらにまとめて書きました。
ttp://www.nigauri.sakura.ne.jp/src/up8638.txt
0135デフォルトの名無しさん
2009/02/21(土) 20:14:52というかeffective c++位読んだ方が良い
0136デフォルトの名無しさん
2009/02/21(土) 20:41:12順番に考えればいい
普通のクラスのコンストラクタテンプレートならこう書くだろう
template <typename U>
NormalClass::NormalClass(U x){}
このNormalClassを具体化に置き換えてみる
template <typename U>
MyClass<int>::MyClass<int>(U x){}
テンプレートの規則からコンストラクタ名の方の<int>は省略できる
template <typename U>
MyClass<int>::MyClass(U x){}
このintをテンプレート化すると
template <typename T> template <typename U>
MyClass<T>::MyClass(U x){}
ほらできた
0137デフォルトの名無しさん
2009/02/21(土) 21:02:010138133
2009/02/21(土) 21:17:33ありがとう!!
template <typename T>template <typename U>
Myclass<T>::Myclass(U x){}
なんだけど、これをUの部分だけexplicit instantiationすることは出来る?
(まあまだ完全にインスタンス化されないからexplicit instantiationとは言わないだろうが。)
template <typename T>
class Myclass
{
public:
T mem;
//他、Tを使ったメンバ関数・メンバ変数が多数
Myclass();
template <typename U> Myclass(U x);//コンストラクタ
template <typename U> U bar(U x);//適当な関数
};
この時、一番最後の適当な関数barは
template <typename T>template <typename U>
U Myclass<T>::bar(U x){std::cout << x << std::endl;return x;}
みたいに定義出来ることは>>136に今 教わったことで分かるんだが、このU型の部分をdoubleやintなど既にある型でexplicit instantiation(っぽいこと)しておきたい。
現状は、現在はヘッダーファイルと実装のソースファイルを分けている状態で、ソースファイルの末尾で
template class Myclass<char>;
の様にexplicit instantiationしている。
この状態でコンストラクタやメンバ関数bar()をまとめてU型でテンプレートにしようとしたら困っているところ。
0139デフォルトの名無しさん
2009/02/22(日) 07:50:29explicit instantiation (みたいなことを)したい理由は何?
ライブラリを作ってるとかなら explicit instantiation する意味はあるだろうけど、
何がしたいのか良く分からない。
処理系のインスタンス化の実装方法によっては多少コンパイルが効率化されるかもしれないが、
他の処理系ではむしろ効率が悪化したりするんじゃないだろうか。
0140138
2009/02/22(日) 09:26:36>>ライブラリを作ってるとかなら explicit instantiation する意味はあるだろうけど、
ライブラリ作ってる。
いろんなところで使っている処理なんだ。。。
そして、ぜーんぶヘッダファイルに実装まで含めてinlineなんてことはしたくない。
0141デフォルトの名無しさん
2009/02/22(日) 10:58:070142138
2009/02/22(日) 10:58:50この時とりあえずTがcharな場合しか使わないなら、ライブラリのソースファイルで
//explicit instantiation<T=char版>
template class Myclass<char>;
template Myclass<char>::Myclass<int>(int x);
template Myclass<char>::Myclass<double>(double x);
template Myclass<char>::Myclass<unsigned long>(unsigned long x);
template int Myclass<char>::bar<int>(int x);
template double Myclass<char>::bar<double>(double x);
template unsigned long Myclass<char>::bar<unsigned long>(unsigned long x);
とすれば解決することまでは理解できた。
0143138
2009/02/22(日) 10:59:28//explicit instantiation<T=std::string版>
template class Myclass<std::string>;
template Myclass<std::string>::Myclass<int>(int x);
template Myclass<std::string>::Myclass<double>(double x);
template Myclass<std::string>::Myclass<unsigned long>(unsigned long x);
template int Myclass<std::string>::bar<int>(int x);
template double Myclass<std::string>::bar<double>(double x);
template unsigned long Myclass<std::string>::bar<unsigned long>(unsigned long x);
のように書かねばならないのだろうか?
そうだとすると、メンバ関数のexplicit instantiationだけで12行書くことになるよね?
(Tで4通り、Uで3通りのかけ算として。)
俺としてはTだけはおいといてU(メンバ関数テンプレート)だけでとりあえず3通りのexplicit instantiation(もどき)なことをしておいて、その後Tを4通りexplicit instantiationできればいいなぁと思っているのだが…。
たいていこういう場合ってC++だとちゃんと逃げ道あるよね?
0144デフォルトの名無しさん
2009/02/22(日) 13:58:050145138
2009/02/22(日) 14:05:35現在がその状況です。
ライブラリのヘッダーファイルが
template <typename T>
class Myclass
{
public:
T mem;
//他、Tを使ったメンバ関数・メンバ変数が多数
Myclass();
Myclass(int x);//int
int bar(int x);//int
Myclass(double x);//double
double bar(double x);//double
Myclass(unsigned long x);//unsigned long
unsigned long bar(unsigned long x);//unsigned long
};
でライブラリのソースファイルの末尾で
//explicit instantiation
template class Myclass<char>;
template class Myclass<std::string>;
template class Myclass<wchar_t>;
template class Myclass<std::wstring>;
としている。
まあ現状問題無く動くいてるんだが、なんかこれって美しくないコードじゃない?
やっぱもう一つテンプレート(Uの部分)にしたくない?
0146デフォルトの名無しさん
2009/02/22(日) 15:13:56これら以外の型では呼んで欲しくないという事なのかな
0148138
2009/02/22(日) 15:21:27Uのところをint, double, unsigned longで明示的にインスタンス化してやらないと
ヘッダファイルをインクルードしてソースファイルをリンクしたところで
リンカが「みつかりませんよ」エラーを出すと思ったんだが。
class Myclass
を
template <typename T>
class Myclass
にしたときそうだった。
0149デフォルトの名無しさん
2009/02/22(日) 16:30:46関数多重定義だと(リンク時でなく)コンパイル時に合致する関数が
あるか分かる利点があるけど。
0150デフォルトの名無しさん
2009/02/22(日) 16:53:38なるほど。ありがとう。
実は今、別のところで引っかかってる。(さっきのやつと関連しているのだが。)
class Sample_Class
{
public:
Sample_Class();//これは普通の。
template <typename intT> Sample_Class(intT n);
template <typename floatT> Sample_Class(floatT x);
};
Sample_Class::Sample_Class(){}//これは普通の。
template <typename intT>
Sample_Class::Sample_Class(intT n){if(n){std::cout << n << std::endl;}}
template <typename floatT>
Sample_Class::Sample_Class(floatT x){if(x){std::cout << x << std::endl;}};
このようにすると、
エラー E2238 Sample_Class.cpp 14: 'Sample_Class::Sample_Class(intT)' の宣言が複数見つかった
エラー E2344 Sample_Class.cpp 13: 一つ前の 'Sample_Class::Sample_Class(intT)' の定義位置
エラー E2171 Sample_Class.cpp 20: 関数 'Sample_Class::Sample_Class(intT)' の本体はすでに定義されている
と言われてしまう。
まあ当然と言われれば当然なのかもしれないが、
「整数型と浮動小数点型とで処理が別」だけど「整数型はshort,int,long,unsigned〜で処理が共通」で「浮動小数点型はfloat,double,long doubleで処理が共通」
って状況はテンプレートでどうにかならない?
0151150
2009/02/22(日) 17:02:28class Sample_Class
{
public:
Sample_Class();//これは普通の。
Sample_Class(short v);
Sample_Class(int v);
Sample_Class(long v);
Sample_Class(float v);
Sample_Class(double v);
Sample_Class(long double v);
};
Sample_Class::Sample_Class(){}//これは普通の。
Sample_Class::Sample_Class(short v){if(v){std::cout << "整数" << v << std::endl;}}
Sample_Class::Sample_Class(int v){if(v){std::cout << "整数" << v << std::endl;}}
Sample_Class::Sample_Class(long v){if(v){std::cout << "整数" << v << std::endl;}}
Sample_Class::Sample_Class(float v){if(v){std::cout << "小数" << v << std::endl;}}
Sample_Class::Sample_Class(double v){if(v){std::cout << "小数" << v << std::endl;}}
Sample_Class::Sample_Class(long double v){if(v){std::cout << "小数" << v << std::endl;}}
としておけば、
Sample_Class hoge=42;
Sample_Class piyo=3.14;
と呼び出してもちゃんと該当する物が呼び出されるじゃん。
これをテンプレートにしようとするととたんにつまずいてしまう。
0152デフォルトの名無しさん
2009/02/22(日) 18:08:230153150
2009/02/22(日) 18:17:45特殊化だと、結局
hort,int,long,float,double,long double
の全てに関して特殊化を定義しないとだめだよね?
それだったら最初から最初からテンプレートを使わない方が良いと思っている。
俺の希望としては
「整数型と浮動小数点型とで処理が別」だけど「整数型はshort,int,long,unsigned〜で処理が共通」で「浮動小数点型はfloat,double,long doubleで処理が共通」
がテンプレートで実現できれば、実装は(整数型と浮動小数点型の)2カ所で済むじゃん。
という発想なんだよねぇ。
C++のテンプレートでは無理なのだろうか。。。
0154デフォルトの名無しさん
2009/02/22(日) 18:30:090155150
2009/02/22(日) 18:45:02enable_if: 関数テンプレートオーバロードの選択的インクルード. Jaakko Jarvi, Jeremiah Willcock, and Andrew Lumsdaine. これはSFINAE(substitution-failure-is-not-an-error:置換失敗はエラーではない)原理を利用した新しい重要な技術である.
これか。
boostは好きだが、現在取り組んでいる対象はいわば自作のライブラリなのでboostが無いと使えないライブラリにするわけには行かないんだよねぇ。。。
とりあえず
本の虫: Boostのenable_ifについて
http://cpplover.blogspot.com/2008/01/boostenableif.html
こことか読んでる。
もしenable_ifの技術を流用して「boostのenable_ifライブラリのインクルードなし」で出来るようだったらこれで解決しそうだが、
まあわざわざライブラリになっているくらいだからたぶん相当めんどくさい事になるのかなぁ。
0156デフォルトの名無しさん
2009/02/22(日) 19:04:14よく使われるからライブラリになってるだけ。
boostのやつをぱくって自分用enable_ifを作ればいいじゃん。
>>151ならこんな感じでいけるっぽい:
class Hoge {
public:
template<typename U>
Hoge(U v, typename boost::enable_if< boost::is_integral<U> >::type* = 0);
template<typename U>
Hoge(U v, typename boost::enable_if< boost::is_floating_point<U> >::type* = 0);
};
template<typename U>
Hoge::Hoge(U v, typename boost::enable_if< boost::is_integral<U> >::type*) {
std::cout << "整数" << std::endl;
}
template<typename U>
Hoge::Hoge(U v, typename boost::enable_if< boost::is_floating_point<U> >::type*) {
std::cout << "小数" << std::endl;
}
template Hoge::Hoge(int, void*);
template Hoge::Hoge(long, void*);
template Hoge::Hoge(double, void*);
ちなみにis_integralやis_floating_pointは
template<typename> struct is_integral { static const bool value = false; };
template<> struct is_integral<int> { static const bool value = true; };
template<> struct is_integral<long> { static const bool value = true; };
みたいな感じで。
0157デフォルトの名無しさん
2009/02/22(日) 20:37:40サンクス
ちょっと出先なので
家に帰ったら熟読させてください。
0158デフォルトの名無しさん
2009/02/23(月) 22:43:47いうものを発見しました。まさに我が意を得たり。
> Nowadays, every C++ developer is familiar with RAII technique.
> It binds resource acquisition and release to initialization and destruction
> of a variable that holds the resource. But there are times when writing a
> special class for such variable is not worth the effort.
> This is when ScopeExit macro comes into play.
やはり必要だと思ってる人はいたんだと安心すると同時に、現行C++の範囲でも
ここまでできることに少し感動です。
自分で変なテクニックを使うのは気が進まなくても、boostが正式採用するのなら
使ってみようかという気にもなりますよね。
0159デフォルトの名無しさん
2009/02/25(水) 14:50:11しかし、俺はvolatileは使ったことないんだよねぇ。
みんな使うものなん?
0160デフォルトの名無しさん
2009/02/25(水) 15:13:27マルチスレッドなどで簡易的に使う場合もたまにあるけど。
0161デフォルトの名無しさん
2009/02/25(水) 15:25:07ほほ〜。そうなんか。
0162デフォルトの名無しさん
2009/02/25(水) 15:43:530163159(=161)
2009/02/25(水) 15:47:01だからvolatileを俺が使わないのは俺の知識不足なのか、それともみんなvolatileの出番はそんなにないものなのかが聞きたかったのだ。
0164デフォルトの名無しさん
2009/02/25(水) 16:56:44volatile int *n = HARDWARE_DEVICE_ADDR;
*n = 1;
*n = 1; // 確かに2回代入
こういうのを最適化されないためにはvolatileが要る
0165デフォルトの名無しさん
2009/02/25(水) 18:17:350166163
2009/02/25(水) 18:38:09signatureが違うからオーバーロードの時に困っているだけだが、いちいち うっとうしくない?
0167デフォルトの名無しさん
2009/02/25(水) 18:48:17マルチスレッドでも使うけど。
ハードのアクセスなしでシングルスレッドだったら使う必要は無いね。
0168デフォルトの名無しさん
2009/02/25(水) 18:50:06修飾した以上違う型なのだから仕方が無い。
0169デフォルトの名無しさん
2009/02/25(水) 19:00:09volatile で怒られるような使い方は発想が間違っている
0170デフォルトの名無しさん
2009/02/25(水) 19:02:03引数にvolatileつけたことはないな。
InterlockedIncrementみたいに、既存の関数を使うことならあるけど。
0171166
2009/02/25(水) 19:29:44やっぱり俺の不勉強がいろいろ原因クサイな。
0172デフォルトの名無しさん
2009/02/25(水) 20:35:06volatileはvolatileとして扱う必要がある。
コンパイルエラーが出てるうちが華。
0173デフォルトの名無しさん
2009/02/25(水) 20:45:52(処理の都合上明らかにどっちかのが自然に書けるという場合でなく、同じくらいだとしてです。)
0174デフォルトの名無しさん
2009/02/25(水) 20:56:35boost使わない場合、ひねくらずにtypeidで型区別して関数に渡せばいいんじゃね?
あんまり美しくないけど、コードはシンプルになるはず
template <typename T> Sample_Class(T value)
{
std::string valueTypeName = typeid(value).name();
if( valueTypeName == typeid(int).name() ||
valueTypeName == typeid(long).name() ...) // unsigned などもチェック
{
funcInteger(); // 整数用関数
}
else if( valueTypeName == typeid(float).name() ...) // double もチェック
{
funcDecimal(); // 小数用関数
}
else
{
assert(!"invalid type");
}
}
0176デフォルトの名無しさん
2009/02/25(水) 21:13:200177デフォルトの名無しさん
2009/02/25(水) 22:09:47人の名前を使わない事
誤解や差別を意識させるような単語は使わない事
唯一無二の名詞形であり、スペルミスを引き起こすような単語は避ける事
自分の子供に名前をつけるときと同じくらい悩んで命名する事
0178デフォルトの名無しさん
2009/02/25(水) 22:14:150179デフォルトの名無しさん
2009/02/25(水) 22:16:50HogeManagerとかHogeRAIIとかHogeAutoとかHogeUserとかHogeScopeとかHogeSafeとかHogeFinalとかHoge_とか
いろいろ試したがどれも気持ち悪い
今はとりあえずHogeHolderに落ち着いてるが、やっぱりしっくり来ない
0180デフォルトの名無しさん
2009/02/25(水) 22:23:18うちはメンバ変数は variableMember_ みたいにしてるけどほかはどうなんだろう
0181デフォルトの名無しさん
2009/02/25(水) 22:31:30マルチスレッドではvolatileにしないで排他をかけるべき
たとえread、writeの関係であっても
排他をかけることでほとんどの処理系では
その辺の最適化の抑制をしてくれる
つーわけで普通のアプリでvolatileを使うことはまずない
0182デフォルトの名無しさん
2009/02/25(水) 22:37:11・ volatile コピーコンストラクタ、volatile 代入演算子は暗黙に作成されない
クラスオブジェクトを volatile にする際の注意点な。
まああんまクラスオブジェクト自体を volatile にすることはないが、
構造体くらいならあるかもしれないな。たまには。
0183デフォルトの名無しさん
2009/02/25(水) 22:40:14って一瞬ギョッとするよな
見慣れないから
0184デフォルトの名無しさん
2009/02/25(水) 23:04:24public:
Foo() : m_n(0) { }
explicit Foo(int n) : m_n(n) { }
Foo(const volatile Foo& foo) : m_n(foo.m_n) { }
void operator=(const volatile Foo& foo) volatile { m_n = foo.m_n; }
volatile int* Get() volatile { return &m_n; }
const volatile int* Get() const volatile { return &m_n; }
private:
int m_n;
};
ああ面倒くせえ。
operator= の戻り値の型を volatile Foo& にしたら、
foo2 = foo1; と書いただけで volatile Foo& を誰も参照してねーよと警告出しやがるし。
0185デフォルトの名無しさん
2009/02/26(木) 01:53:25type_info::nameは、クラスの比較用としては使い物にならないので止めたほうが良いよ。
0186デフォルトの名無しさん
2009/02/26(木) 02:02:33std::string str;
long num=std::string::npos;
if(num>0){str="num>0";}//�@
if(num<0){str="num<0";}//�A
if(num==0){str="num==0";}//�B
こうすると確かに�Aが実行されるんだが、numをlong型からlong long型へ変更して
std::string str;
long long num=std::string::npos;
if(num>0){str="num>0";}//�@
if(num<0){str="num<0";}//�A
if(num==0){str="num==0";}//�B
とするとなんと�Aが実行されてしまう。
どうにかならない??
0187デフォルトの名無しさん
2009/02/26(木) 04:01:030188デフォルトの名無しさん
2009/02/26(木) 04:30:390189デフォルトの名無しさん
2009/02/26(木) 04:49:40通常は、do-whileの方が初回の比較がない分だけ無駄の少ないコードになることが多い。
しかし、iccのようにforの最適化を重視しているコンパイラの場合、forで書く方がいいかも知れない。
詳しくは最適化スレで。
0190デフォルトの名無しさん
2009/02/26(木) 05:06:47要約
「(charがsignedな環境で) charに代入した0xFFは0より小さいのに
intに代入した0xFFが0より大きいと判定されるんだけどどうにかならない?」
と言ってるのと同等。
どうなって欲しいのかは不明。
0191デフォルトの名無しさん
2009/02/26(木) 06:37:450192191
2009/02/26(木) 06:43:25スレ移動します
0193186
2009/02/26(木) 12:21:36書き間違えた・・・。
g++にて
std::string str;
long num=std::string::npos;
if(num>0){str="num>0";}//�@
if(num<0){str="num<0";}//�A
if(num==0){str="num==0";}//�B
こうすると確かに�Aが実行されるんだが、numをlong型からlong long型へ変更して
std::string str;
long long num=std::string::npos;
if(num>0){str="num>0";}//
if(num<0){str="num<0";}//�A
if(num==0){str="num==0";}//�B
とすると�@が実行されてしまう。
どうにかならない??
だった。
0194186
2009/02/26(木) 12:30:48short型→num<0
int型→num<0
long型→num<0
longlong型→num>0
となるんだか、どうして??
0195デフォルトの名無しさん
2009/02/26(木) 12:38:090196デフォルトの名無しさん
2009/02/26(木) 12:40:58>>190 を100回嫁。
0197デフォルトの名無しさん
2009/02/26(木) 12:41:19ぬんぽすは -1 とは限らない
0198デフォルトの名無しさん
2009/02/26(木) 12:42:55読んでくる。
0199デフォルトの名無しさん
2009/02/26(木) 12:50:21で、size_typeはsize_tだからunsigned(long)だと。
0200デフォルトの名無しさん
2009/02/26(木) 12:54:30--
// Data Members (public):
// NB: This is an unsigned type, and thus represents the maximum
// size that the allocator can hold.
/// @var
/// Value returned by various member functions when they fail.
static const size_type npos = static_cast<size_type>(-1);
0201=186(=198)
2009/02/26(木) 13:45:28std::size_tがunsigned longでありunsigned long longでないことから
ビット表現の都合上std::string::nposをlong longにキャストしても-1にはならなかったということか。
もしもstd::size_tが(というかnposが)unsigned long longで定義されていたらlong longにキャストすると-1に等しくなったであろうと考えて正しい?
0202デフォルトの名無しさん
2009/02/26(木) 13:49:07正しいかどうかに関わらず、nposを汎整数型に代入しちゃダメだろ。
0203デフォルトの名無しさん
2009/02/26(木) 13:57:210204デフォルトの名無しさん
2009/02/26(木) 14:42:3720.1.6でAllocatorのsize_typeはunsigned integral typeとある。
0205デフォルトの名無しさん
2009/02/26(木) 15:21:48勝手にキャストしちゃらめぇ。
0206デフォルトの名無しさん
2009/02/26(木) 15:38:48妙な話だ
0207201
2009/02/26(木) 15:41:03関数foo()の戻り値の型が、諸処の周辺の事情によりどうしても
long long
にせざるを得ない状況でstd::string::nposをreturnしたい場合は戻値側でどうすりゃ良いと思う?
単に-1をリターンするか。。。
0208デフォルトの名無しさん
2009/02/26(木) 15:43:50戻値側って何だw
まあとにかく-1が返る状況がそれしかないならそれでいんじゃね?
0209デフォルトの名無しさん
2009/02/26(木) 15:46:19っていうか、標準を無視するなら何をやっても一緒。
関数の仕様のところに明示しておいて
後は呼び出し側の責任ってことで。
ま、そのうちそんな関数は無視されて
個々の開発者が独自の関数を書くようになる。
0210デフォルトの名無しさん
2009/02/26(木) 17:51:36unsignedがsignedで表現できない場合, 変換は処理系に依存するらしい
0211デフォルトの名無しさん
2009/02/26(木) 18:08:02同じ変数名を使ってるcppファイルが他にもあるので、そちらも影響してしまいますよね?変数名を変えてexternしかないですか?
0212デフォルトの名無しさん
2009/02/26(木) 18:42:080213デフォルトの名無しさん
2009/02/26(木) 18:44:20グローバルか?グローバルなのか?
0214デフォルトの名無しさん
2009/02/26(木) 18:45:06ポインタか参照を返す関数を作ったら?
0215デフォルトの名無しさん
2009/02/26(木) 18:48:50というかexternの使い方もよくわかっていません
内容はmain.cpp do.cpp main.h do.hとあり、
do で処理をしている変数でbool型、これをmain.cppでifの条件にしたいのですが、さっきからやっているのですがうまく動きません
externはどのファイルで宣言、初期化するべきなのでしょうか?
0216デフォルトの名無しさん
2009/02/26(木) 19:11:21>>あるcppファイルから別のcppファイルの変数を使いたいんですけどexternしかありませんか?
初心者がグローバル変数を使う状況って、大抵は設計からおかしいろくでもない状況になっている事が多いけど大丈夫?
>>同じ変数名を使ってるcppファイルが他にもあるので…変数名を変えてexternしかないですか?
>>namespace・・・難しそうですね
いや、名前空間ぐらいは知らないとC++はまともに使えない
ロベールのC++教室 - 第50章 異姓同名 -
http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02050.html
0217デフォルトの名無しさん
2009/02/26(木) 19:35:000218デフォルトの名無しさん
2009/02/26(木) 19:38:09名前空間
という名称を見てさぞかし難しいんだろうなと思っていた時があった。
…今思うとテンプレートの方が圧倒的に難しい。
0219デフォルトの名無しさん
2009/02/26(木) 19:54:52型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
'Name1' : 関数定義のようですが、パラメータ リストがありません。外見上の本体をスキップします。
'Name1' : この名前を指定された名前空間は存在しません。
なんで?
0220デフォルトの名無しさん
2009/02/26(木) 19:57:50それが再現するソースを見せろ
話はそれからだ
0221デフォルトの名無しさん
2009/02/26(木) 20:03:55いっぱいエラーが出るときは大体1行目がその本体。
そして「 ; が識別子の前に」というエラーが出るときは
どこかでステートメント末尾の ; を付け忘れている。
一番多いのがクラス定義の末尾の ; 。
class hoge { }; を class hoge { } と書くとそんなエラー。
C++ のエラーはわかりにくい。
0222デフォルトの名無しさん
2009/02/26(木) 20:07:02文字コードが混ざったりしてるんじゃね?
0223デフォルトの名無しさん
2009/02/26(木) 20:07:05条件をfalseにしたら動く
その変数はdo.cppのクラスのプロテクト関数のifの中でtrueが入るようになってるし、そのtrueを使って動くdo.cpp内の箇所も正常に動く
その箇所が動いたらfalseが入るようになってる
なにかおかしい?
0224デフォルトの名無しさん
2009/02/26(木) 20:10:17{
void Func()
{
}
}
普通にこんな感じで囲っただけだが
ヘッダファイルでやったらエラーが100個ぐらい出た
ちなみにmainではNamea::でなくて::変数にしてた
0225デフォルトの名無しさん
2009/02/26(木) 20:18:52それ逆。
signed→unsignedは定義されている。
その定義で、-1を符号無し型に変換すると、変換先の符号無し型の最大値になる。
0227デフォルトの名無しさん
2009/02/26(木) 20:31:53>namesapce Name1
馬鹿?
0228デフォルトの名無しさん
2009/02/26(木) 20:33:23なんで?
0229デフォルトの名無しさん
2009/02/26(木) 20:36:410230デフォルトの名無しさん
2009/02/26(木) 20:41:14つーか、なんでこの戯けは初心者スレに行かないんだ?
0231デフォルトの名無しさん
2009/02/26(木) 20:42:230232デフォルトの名無しさん
2009/02/26(木) 20:43:02>なにかおかしい?
頭。
0233デフォルトの名無しさん
2009/02/26(木) 20:44:24'Name1' : この名前を指定された名前空間は存在しません
シンボルは名前空間 'Name1' 内で定義できません
は残った、何も使ってないけど
0234デフォルトの名無しさん
2009/02/26(木) 20:47:15>なんで?
エラーメッセージすらはらずに何で?って聞くなヴォケ
人に聞く場合は、問題が再現する最低限のソースをはって
エラーメッセージも添えて出す物だ。
0235デフォルトの名無しさん
2009/02/26(木) 20:52:45externで呼び出すことはできてるんだが同じことじゃないの?
0236デフォルトの名無しさん
2009/02/26(木) 21:08:03予想では呼び出すのが多すぎたり同時なので一方で使えなかった
どう?
0237デフォルトの名無しさん
2009/02/26(木) 22:49:34もうみんな呆れてレスが付かねぇなw
>予想では呼び出すのが多すぎたり同時なので一方で使えなかった
君はマルチスレッドで処理しているとでも言うんですかな?
>>234
が言ってるように、再現するソースを見せろ。
0238デフォルトの名無しさん
2009/02/26(木) 23:33:06もっと一般的に、トークンに文字数制限はありますか?
0239デフォルトの名無しさん
2009/02/26(木) 23:43:450240デフォルトの名無しさん
2009/02/26(木) 23:46:56ありがとう。
長い。心配要らなかったな。
0241デフォルトの名無しさん
2009/02/26(木) 23:52:430242デフォルトの名無しさん
2009/02/27(金) 00:01:450243デフォルトの名無しさん
2009/02/27(金) 00:06:440244デフォルトの名無しさん
2009/02/27(金) 00:22:260245デフォルトの名無しさん
2009/02/27(金) 00:26:15C++はともかく、C89においては、
内部リンケージで32文字
外部リンケージは8文字
しか保証されてなかった記憶があるけど。
0246デフォルトの名無しさん
2009/02/27(金) 00:27:15テンプレートの場合は、コンパイラの再帰の段数制限がボトルネック
0247デフォルトの名無しさん
2009/02/27(金) 00:31:01>>コンパイラの再帰の段数制限がボトルネック
そんなんあるの?初耳です。
0249デフォルトの名無しさん
2009/02/27(金) 00:34:26#pragma inline_depth(255)
#pragma inline_recursion(on)
g++なら
-ftemplate-depth
BOOSTだと、使うライブラリによっては必須
0250247
2009/02/27(金) 00:40:55探してみました。
GNU コンパイラ集(GCC) の使い方と移植について
http://www.sra.co.jp/wingnut/gcc/gcc-j.html
-ftemplate-depth-n
テンプレートクラスの実体化の最大の深さを n にする。テンプレート実体化の深さは、テンプレートクラス実体化の際に無限に再帰が起こるのを検出するのに必要である。ANSI/ISO C++ に適合するプログラムは、17 より大きい最大の深さに頼ってはならない。
17って…なんでまたそういう現実的に問題になりそうなところで手を打っちゃうんですかねぇ。
0251デフォルトの名無しさん
2009/02/27(金) 01:05:57なにが「C++に限った」だ。
てめーが「標準C/C++」と書いてるから、
(ここがC++のスレにもかかわらず)「Cでは云々」って突っ込みが入ってるんじゃねーか。
てめーでどんな質問を書いたか、もう一遍読み直せボケ。
0252デフォルトの名無しさん
2009/02/27(金) 04:25:04signed->unsignedは書くまでもないことだし
0253デフォルトの名無しさん
2009/02/27(金) 04:59:16質問文を修正したうえで、質問者の意図する内容を正しく回答してください。
0254デフォルトの名無しさん
2009/02/27(金) 10:14:060255デフォルトの名無しさん
2009/02/27(金) 10:34:24相談はフリースタイルで問題ないけど
0256デフォルトの名無しさん
2009/02/27(金) 13:05:05public:
virtual int getPointX(unsigned int index) = 0;
virtual int getPointY(unsigned int index) = 0;
virtual unsigned int pointsNum() = 0;
};
この構造体に仮想デストラクタは必要ですか?
0257デフォルトの名無しさん
2009/02/27(金) 13:23:170258デフォルトの名無しさん
2009/02/27(金) 13:38:28void hoge(){
struct local:public PointContainer{
double *x,*y;
};
}
0259デフォルトの名無しさん
2009/02/27(金) 13:41:12使い方
void hoge(){
struct local:public PointContainer{
double *x,*y;
local(double *x,double *y):x(x),y(y){}
関数をオーバーライド
};
vector<double> x,y;
piyo(local(&x[0],&y[0]));
}
void piyo(PointContainer& pc){
点情報を読み取る
}
こんな感じです
0260デフォルトの名無しさん
2009/02/27(金) 18:01:440261デフォルトの名無しさん
2009/02/27(金) 18:32:07ところで、何故必要なのでしょう?
0262デフォルトの名無しさん
2009/02/27(金) 19:45:43あと一時オブジェクトは非const参照引数に渡せないと思った。
VCでは渡せちゃうけど。
0263デフォルトの名無しさん
2009/02/27(金) 20:40:550264デフォルトの名無しさん
2009/02/27(金) 20:50:53ちなみにBCCで一時オブジェクト渡せました。そういえば、いつもならエラーになるはずなんだけど、何でだろ・・?
0265デフォルトの名無しさん
2009/02/27(金) 21:05:31理解があやふやならちゃんと調べた方がいい。
0266デフォルトの名無しさん
2009/02/27(金) 21:16:43継承させるつもりがある: publicで仮想かprotectedで非仮想
継承させるつもりがない: 非仮想、公開は好きにしろ
0267デフォルトの名無しさん
2009/02/27(金) 21:59:34されていたような気がする。…気がするだけ。
>>264
この機会にデストラクタを学んでおくといいかも。いつか役に立つ時が来る。
0268デフォルトの名無しさん
2009/02/28(土) 00:28:37基底でvirtualにしてないと、仮想関数テーブルが派生クラスの関数に上書きされちゃって
実行時にテーブルを辿れない。実行できない
だから、デストラクタでやること無いなら(メンバもPODなら)仮想デストラクタにする必要無いかなと
思ったけどこれで合ってます?
0269デフォルトの名無しさん
2009/02/28(土) 00:42:47仮想関数が必要なのは仮想の振る舞いが必要なクラスの場合。
local を PointContainer のポインタを介して削除する可能性がないなら
「仮想の」デストラクタはいらない。protected 非仮想で十分。
そうでないなら public 仮想にする必要がある。
問題は、デストラクタの中身。
PointContainer が後処理を必要としないクラスの場合、
動作内容はデフォルトのデストラクタと同じ「空」で十分だが、
デフォルトのデストラクタは public 非仮想なので
基底クラスのポインタを介した削除を許しながら、
動作は未定義というすばらしいことに。
結論:基本クラスのデストラクタは「必ず」記述しましょう。
(ハブサタ本の50項)
0270デフォルトの名無しさん
2009/02/28(土) 01:07:31間違ってます。
0271デフォルトの名無しさん
2009/02/28(土) 01:15:28> 基底クラスのポインタを介した削除を許しながら、
矛盾してるやん
0272デフォルトの名無しさん
2009/02/28(土) 01:19:42デフォルトデストラクタを使うと矛盾するから「必ず」記述しましょうって話になるわけで。
詳しくはハブサタ本50項。
0273デフォルトの名無しさん
2009/02/28(土) 01:25:11つーか、ここまで言わないとわかんねえ?
0274デフォルトの名無しさん
2009/02/28(土) 01:25:580275デフォルトの名無しさん
2009/02/28(土) 01:30:06だから、だめなんだって。
だめな理由はハブサタ本、C++ Coding Standards の 第50項にびっしり書いてあるよ。
っていうか、読んだこと無いのか?
Effective C++にも書いてあるだろ・・・
0276デフォルトの名無しさん
2009/02/28(土) 01:30:57基底クラスのポインタを介して削除しないで下さいというお願いしているに過ぎない。
しかも、無視される可能性はある。
安全性という観点から言えば厳密には問題があるが、
実際問題それで大丈夫な場合もあるし、
パフォーマンス上致し方ない場合もある。
0277デフォルトの名無しさん
2009/02/28(土) 01:35:16そういう例外についてもハブサタ本の50項にびっしり・・・
だから何度も「ハブサタ本」と書いたんだが、
この程度の本も読んでない人いるのか?w
0278デフォルトの名無しさん
2009/02/28(土) 01:36:300279デフォルトの名無しさん
2009/02/28(土) 01:40:36説明になってねえぞ
自分の言葉では表現できないと見なしていいんだな?
0280デフォルトの名無しさん
2009/02/28(土) 01:40:530281デフォルトの名無しさん
2009/02/28(土) 01:41:39いいよそれでもうw
ともかくC++ Coding Standardsの50項読んでくれw
つか、その程度も読んでなくてここで回答している奴いないよな?w
0282デフォルトの名無しさん
2009/02/28(土) 01:42:060283デフォルトの名無しさん
2009/02/28(土) 01:42:270284デフォルトの名無しさん
2009/02/28(土) 01:43:380285デフォルトの名無しさん
2009/02/28(土) 01:44:09説明になってねえぞ
自分の言葉では表現できないと見なしていいんだな?
0286デフォルトの名無しさん
2009/02/28(土) 01:44:230287デフォルトの名無しさん
2009/02/28(土) 01:45:38不可能ではないと言ってるだけだ
privateデストラクタのポインタを外から合法的に取るトリックがあるだろ
0288デフォルトの名無しさん
2009/02/28(土) 01:46:17説明になってねえぞ
自分の言葉では表現できないと見なしていいんだな?
0289デフォルトの名無しさん
2009/02/28(土) 01:47:43あっそう
いるんだよねー、これからって時に議論を放棄する奴って
相手するの馬鹿らしいから死んで欲しいぜ
0290デフォルトの名無しさん
2009/02/28(土) 01:47:49Coding Standardsを代表作のように言われるのはちょっと…
0291デフォルトの名無しさん
2009/02/28(土) 01:49:220292デフォルトの名無しさん
2009/02/28(土) 01:51:48信用なら無い場所に出入りしていると
信用ならない人に出くわすと書いてるけど
まったくそのとおりだな。
こんなところの書き込みを信じるより
ちゃんと本読んで解決したほうがいい。
0293デフォルトの名無しさん
2009/02/28(土) 01:53:37非仮想デストラクタをもちつつ派生する必要があったりするんだよ。
かなりな例外的な状況だが、MFC の CPoint とかまさにそういう例だな。
0294デフォルトの名無しさん
2009/02/28(土) 01:53:470295デフォルトの名無しさん
2009/02/28(土) 01:57:10あんまり今の話とは関係ない
0296デフォルトの名無しさん
2009/02/28(土) 01:58:350297デフォルトの名無しさん
2009/02/28(土) 02:00:180298デフォルトの名無しさん
2009/02/28(土) 02:01:54彼らも間違えることはあるし、正しいとしてもあらゆる場面で当てはまるとは限らないし
0299デフォルトの名無しさん
2009/02/28(土) 02:02:39POD だから大丈夫とか、頭大丈夫か?
0300デフォルトの名無しさん
2009/02/28(土) 02:02:570301デフォルトの名無しさん
2009/02/28(土) 02:06:24でもまぁほとんど正しい ケースバイケースだが例外はやはり例外だ
0302デフォルトの名無しさん
2009/02/28(土) 02:08:020303デフォルトの名無しさん
2009/02/28(土) 02:08:36PODなら自分と全基底クラスのデストラクタがデフォルトなんだから
どれが呼ばれてもどうせ何もしないので問題ない
そしてPODだからsizeof(tagPOINT)とsizeof(CPoint)さえ同じなら平気
なんか間違ってるか?
非PODなら後の方の条件は成り立たないだろ
0304デフォルトの名無しさん
2009/02/28(土) 02:09:52ぱっとみ内容がつまらなかったよ
Exceptionalやらを読んだ方がよほどためになると思うが
0305デフォルトの名無しさん
2009/02/28(土) 02:15:290306デフォルトの名無しさん
2009/02/28(土) 02:18:16必要ない本ではある>Coding Standards
ほぼ全部この5冊のどっかに書いてることだから
0307デフォルトの名無しさん
2009/02/28(土) 02:18:54「Coding Standardsは読んでないが xx は読んだ」というと
「その本の nn ページを読め」と返されるぞ? 恐ろしい武器だ。
0308デフォルトの名無しさん
2009/02/28(土) 02:19:580309デフォルトの名無しさん
2009/02/28(土) 02:21:020310デフォルトの名無しさん
2009/02/28(土) 02:21:280311デフォルトの名無しさん
2009/02/28(土) 02:22:49自殺志願者でもなけりゃ
0312デフォルトの名無しさん
2009/02/28(土) 02:24:080313デフォルトの名無しさん
2009/02/28(土) 02:25:05…2版持ってるから3版買いづらいよ。目次見る限り常識的なことしかなさそうだし
周りの誰かに借りようと思っていたが、周りの人間もそう思っているのか誰も買っていない
皆で牽制しあっている
0314デフォルトの名無しさん
2009/02/28(土) 02:26:19(第3版)
0315デフォルトの名無しさん
2009/02/28(土) 02:30:02これを"墨守"する奴は馬鹿だろ
0316デフォルトの名無しさん
2009/02/28(土) 02:41:14仮想デストラクタにすべきでないケースについても書いてるけど
2版持ってないけど、ひょっとして書いてないの?
0317デフォルトの名無しさん
2009/02/28(土) 03:59:390318デフォルトの名無しさん
2009/02/28(土) 04:17:130319デフォルトの名無しさん
2009/02/28(土) 04:22:45書いてあるよ。
0320デフォルトの名無しさん
2009/02/28(土) 04:32:170321デフォルトの名無しさん
2009/02/28(土) 05:45:160322デフォルトの名無しさん
2009/02/28(土) 05:50:470323デフォルトの名無しさん
2009/02/28(土) 08:38:56tagPOINT は POD だが CPoint は POD じゃないから、
デストラクタは空っぽだけど、規格上動作は未定義じゃね。
0324デフォルトの名無しさん
2009/02/28(土) 10:42:560325デフォルトの名無しさん
2009/02/28(土) 10:50:510326デフォルトの名無しさん
2009/02/28(土) 11:49:32Effective C++の改訂第2版には
C++ Coding Standardsにあるような例外の記述はないよ。
もう10年も前の本だからね。
いくつかの項目は役に立たなくなってる。
アンドリューハントの達人プログラマーじゃないけど
第2版の内容しか知らない人は時代遅れのカスプログラマと見ていい。
0327デフォルトの名無しさん
2009/02/28(土) 13:41:550328デフォルトの名無しさん
2009/02/28(土) 13:59:530329デフォルトの名無しさん
2009/02/28(土) 15:30:21そんなのありません。
あるとしたら、何をcatchをするんですか?
ないものをどうやってcatchするんですか?
0330デフォルトの名無しさん
2009/02/28(土) 15:34:360331デフォルトの名無しさん
2009/02/28(土) 15:52:31{
throw;
}
catch(/* ここなんて書くの? */)
{
std::cout << "catch";
}
このプログラムは落ちます。
0332デフォルトの名無しさん
2009/02/28(土) 15:56:400333デフォルトの名無しさん
2009/02/28(土) 16:01:410334デフォルトの名無しさん
2009/02/28(土) 16:04:23アクティブな例外がないところで呼んだらそりゃ落ちるわな
0335デフォルトの名無しさん
2009/02/28(土) 16:19:08それが、再スローでないのにthrow;使っているコードを見てorz
それを何事もなく処理するVCが恨めしい。
0336デフォルトの名無しさん
2009/02/28(土) 16:35:10terminated()が呼ばれる事になっているし
なぜVCのせいにするのか訳わからん
0337デフォルトの名無しさん
2009/02/28(土) 16:35:23これは言語仕様の不備なのかgccのバグなのか
いずれにしても素のまま実装しているgccは、よろしくないと思われるが
0338デフォルトの名無しさん
2009/02/28(土) 16:35:510339337
2009/02/28(土) 16:42:100340名無しさん
2009/02/28(土) 17:02:40SQLFetchをwhilede一度回して行数を確認して、もう一度Fetchしなおすならnewで
エリアを確保できるでしょうが、このエリアは関数内しかスコープがないので
クラス化して、メンバー関数としたい場合は、vectorを使うしか方法は無いんでしょうか?
0341デフォルトの名無しさん
2009/02/28(土) 18:16:530342デフォルトの名無しさん
2009/02/28(土) 18:37:20・ただし濃度はある程度低いコストで既知にすることができる
そういう要件ならvectorでいいだろうね
0343デフォルトの名無しさん
2009/03/01(日) 01:15:14「L−R」みたいに左右の音の位相を打ち消すソフトってC++で作れませんでしょうか。
0344デフォルトの名無しさん
2009/03/01(日) 01:16:55作れますよ
0345デフォルトの名無しさん
2009/03/01(日) 01:18:15ハードレベルが対応できるかは知らん
0346デフォルトの名無しさん
2009/03/01(日) 01:25:36リニアPCMに直してサンプリング単位にL-Rするだけだろ?
0347デフォルトの名無しさん
2009/03/01(日) 07:30:57作れないのはプログラマ(俺含め)の方であって。
…強いて言うなら早さを極限まで追求するタイプのソフトくらいか。
0348デフォルトの名無しさん
2009/03/01(日) 09:00:080349デフォルトの名無しさん
2009/03/01(日) 10:07:31http://pc11.2ch.net/test/read.cgi/unix/1127388574/389-
0350デフォルトの名無しさん
2009/03/01(日) 10:44:08ディフォルト・コンストラクタの呼び出しの表記上の問題:
H h(); // ← H h = H(); のつもりなのに関数の宣言だとみなされてしまう
は、C++0x的には
H h{};
と書けば解決するのかな。
0351デフォルトの名無しさん
2009/03/01(日) 10:54:05defaultをいつも「ディフォルト」と言ってるが
desktopも「ディスクトップ」と呼ぶのか?
0352デフォルトの名無しさん
2009/03/01(日) 11:02:460353デフォルトの名無しさん
2009/03/01(日) 11:04:40Pronunciation: \ˈdesk\
ttp://www.merriam-webster.com/cgi-bin/audio.pl?desk0001.wav=desk
Pronunciation: \di-ˈfȯlt, dē-; ˈdē-ˌfȯlt\
ttp://www.merriam-webster.com/cgi-bin/audio.pl?defaul01.wav=default
0354デフォルトの名無しさん
2009/03/01(日) 11:05:05H h;
0355デフォルトの名無しさん
2009/03/01(日) 11:09:160356デフォルトの名無しさん
2009/03/01(日) 11:18:03そんなに頻繁にディフォルトディフォルトディフォルトと繰り返してるんですか?
まずこの板の名無しから変えるよう努力したほうが
コミュニケーション能力を磨くより有用かもしれませんよ。
0357デフォルトの名無しさん
2009/03/01(日) 11:19:540358デフォルトの名無しさん
2009/03/01(日) 11:22:27descriptionは?
0359デフォルトの名無しさん
2009/03/01(日) 11:33:22論点なんかずらしてないよ。
日本語では「デフォルト」を使うべき、という主張は全然変わらないから。
普通の日本人はcameraをキャメラなんて言わないし。
心の中でそう思っていても、他人とコミュニケーションを取るために必要だから。
そういう「共通用語として使えることの重要性」が認識されているから
デザインパターンなんてものが生まれたわけだけど、聞いたこと無かったら調べてみるといいよ。
0360デフォルトの名無しさん
2009/03/01(日) 11:37:170361デフォルトの名無しさん
2009/03/01(日) 11:38:10要約すると、デザインパターンなのかディザインパターンなのかが問題ってこと?
0362デフォルトの名無しさん
2009/03/01(日) 11:41:510363デフォルトの名無しさん
2009/03/01(日) 12:10:17desktopはディスクトップとは読まないからね。
そもそもディという発音自体、無いからね。
これ覚えておこうね。恥かかずに済むから。
「desktopも「ディスクトップ」と呼ぶのか?」とか、あり得ないからね、質問として。
0364デフォルトの名無しさん
2009/03/01(日) 12:22:501) >>351は最初、defaultをディフォルトと読むのは、desktopをディスクトップと読むのと同様の
「間違い」だと指摘していたが、そうではないことが>>353のレスで理解できたので、
慌てて路線変更して「共通性から離れて本格的な発音にこだわることの問題点」を指摘していることにし始めた。
2) >>351は、初めから「共通性から離れて本格的な発音にこだわることの問題点」を指摘していたのだけど、
desktopをディスクトップと読むのもその仲間(「本格的な発音」を追求した書き方)だと勘違いしていたので、
そういう意図で発言しているとは誰にも思って貰えなかった。
3) >>351は初めから「共通性から離れて本格的な発音にこだわることの問題点」を指摘していたし、
desktopをディスクトップと言うのは、それとは次元の異なる「単なる間違い」であることもわかっていたが、
どういうわけか、まったく関係の無いタイミングでdesktopを引き合いに出すという電波質問をしてしまった。
どれなんだろう。
0365デフォルトの名無しさん
2009/03/01(日) 12:23:08ディフォルトもだめなん?
0366デフォルトの名無しさん
2009/03/01(日) 12:24:48desktopという単語の中に、そんな音は無いという意味だろ。
0367デフォルトの名無しさん
2009/03/01(日) 12:30:07defaultはデフォート
deskはデャースクって聞こえる
0368デフォルトの名無しさん
2009/03/01(日) 12:32:270369デフォルトの名無しさん
2009/03/01(日) 12:34:490370デフォルトの名無しさん
2009/03/01(日) 12:38:390371デフォルトの名無しさん
2009/03/01(日) 12:43:02たまたま手についちゃった書き癖じゃないの?
>>356が興奮気味に書いてるキャラ設定みたいな理由は無いだろう、たぶん。
そういえば、C++3rdの翻訳、detailをディティールって書いてて、違和感あったな。
そうは発音しないと思うんだけど・・・俺が知らないだけ?
でも、あれだって少なくとも「標準的な日本語(外来語)とするために」活動してるわけではないだろうw
0372デフォルトの名無しさん
2009/03/01(日) 12:45:23コミュニケーション大事だがら状況に合わせるけどね
0373デフォルトの名無しさん
2009/03/01(日) 12:47:57覚える為にはスペルと対応が取れてるディ(de)テイル(tail)って読みが都合が良いんだけどさ
0374デフォルトの名無しさん
2009/03/01(日) 12:49:11さては道産子だな?(いや、道産子言葉俺は知らんけど)
0375デフォルトの名無しさん
2009/03/01(日) 12:55:38辞書引いて発音記号見たら
2種類の発音があることがわかった。
ただし共にtailの部分はテイルだった。
0376デフォルトの名無しさん
2009/03/01(日) 12:59:51class Myclass
{
public:
template<char ch> T foo() const;
};
template<typename T>template<char ch>
T Myclass<T>::foo() const
{std::cout << "T and char " << std::endl;return 'c';}
として、
int main()
{
Myclass<char> hoge;
hoge.foo<5>();//27行目
return 0;
}
としてみました。
すると
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
エラー E2235 〜.cpp 27: メンバー関数は呼び出すかそのアドレスをとらなければならない(関数 main() )
エラー E2188 〜.cpp 27: 式の構文エラー(関数 main() )
*** 2 errors in Compile ***
と言われてしまいます。しかしg++でコンパイルすると問題無くコンパイルできました。
私のどのあたりの記述が悪いのでしょうか?
0377デフォルトの名無しさん
2009/03/01(日) 13:03:56敢えて書くなら「ディテイル」か「ディーテイル」ってことになりそうだ。
# 前者はテイにアクセント、後者はディーにアクセント。
でもまぁ、「ディテール」は許容でいいんじゃない?
「ディティール」は許容したくないけど。
0378デフォルトの名無しさん
2009/03/01(日) 13:06:58コピーライトを見ると2000年だから、bccは腐ってるんじゃないの? もっと新しいバージョンはないのかな?
0379デフォルトの名無しさん
2009/03/01(日) 13:10:53その時期のBCCはマジ糞だからC++ならVC2008とか使った方がいいよ
0380デフォルトの名無しさん
2009/03/01(日) 13:16:52ありがとうございます。
私は職業プログラマではないので単なる趣味のレベルなのですが、初めてコンパイラのバグに出会ってちょっとうれしいです。
0381デフォルトの名無しさん
2009/03/01(日) 13:24:09void setStr(char *test){
str = test;
}
みたいなことってできないんでしょうか?
20文字以内の文字列をstrに突っ込みたいと思ったんですが・・・。
0382デフォルトの名無しさん
2009/03/01(日) 13:26:37アドレスとポインタを理解してから考えてみれば分かると思うが、それはできない。
C言語レベルで相当理解が足りないので、何か本を一冊買って通読したほうがいい。
0383デフォルトの名無しさん
2009/03/01(日) 13:28:02何故できないのか説明してみろよ?
偉そうに嫁とかいってるなら。
0384デフォルトの名無しさん
2009/03/01(日) 13:29:03お前はアドレスにアドレスが代入できると思うのか?
0385デフォルトの名無しさん
2009/03/01(日) 13:30:040386デフォルトの名無しさん
2009/03/01(日) 13:32:07それよりお前が説明してみれば?
教えて欲しければそう言え
0387デフォルトの名無しさん
2009/03/01(日) 13:32:48>>381は俺だけど>>383はしらんがな・・・
0388デフォルトの名無しさん
2009/03/01(日) 13:34:36そうか。悪い。人違いだ。
そして俺もちょっと言い方がきつかったな。すまない
0389380
2009/03/01(日) 13:36:49bccの最新版をDLしてきました。
…が、古い版と全くおなじでした。バイナリレベルで同じ物が手に入りました(笑)
bccは諦めてg++を使います。
VC2008も挑戦してみます。
0390デフォルトの名無しさん
2009/03/01(日) 13:37:42strcpyとかなんて関数ありませんよねー・・・C++なので素直にstring型使ってきます
0391388
2009/03/01(日) 13:43:30配列の名前はその先頭アドレスを指す。
よってstrはアドレスであり、それを左辺に持ってきて代入しようとしても
極論すれば100=〜としているようなものだから不可。
てなところか。
まあstd::stringが使えるならそれでいいな。
0392デフォルトの名無しさん
2009/03/01(日) 13:44:410393392
2009/03/01(日) 13:45:500394デフォルトの名無しさん
2009/03/01(日) 13:51:02入ってないよ。
C/C++はそういう余計な遅延になりそうなことはデフォルトでしたがらないからね。
char str[20];
void setStr(char *test){
std::cout << reinterpret_cast<unsigned long>(test) << std::endl;
}
としてみるとわかる。
0395デフォルトの名無しさん
2009/03/01(日) 13:54:12void *test;
*をvoid側につけようかtest側につけようか・・・
0396デフォルトの名無しさん
2009/03/01(日) 14:01:09あるあるw
人によって好き嫌いあるよね。
voidの場合はともかくintだとすれば
int *a,b,c;
の様に宣言するとaだけがポインタだとわかりやすい。
しかし型という観点からはint *型なんだから、int*とくっつけるべきと言う考えもあるよね。
折衷案の
int * hoge;
はやだな。
0397デフォルトの名無しさん
2009/03/01(日) 14:04:11char str[20];
void setStr(char *test){
for(int i = 0; i < sizeof(str); i++)
str[i] = test[i];
}
0398デフォルトの名無しさん
2009/03/01(日) 14:07:15std::string str;
void setStr(const std::string& test){
str = test;
}
0399デフォルトの名無しさん
2009/03/01(日) 14:11:00恐ろしいバグ持ちコードだな・・・
testのサイズがstrのサイズ未満だったらどうなるよ?
0400デフォルトの名無しさん
2009/03/01(日) 14:15:11char str[20];
void setnStr(char *test, int n){
int size = sizeof(str) < n ? sizeof(str) : n;
for(int i = 0; i < size; i++)
str[i] = test[i];
}
0401394
2009/03/01(日) 14:15:22俺もそう思った。
…が、
「20文字以内の文字列をstrに突っ込みたいと思ったんですが・・・。」
という仮定があるようだ。ちゃんと文字数チェックしていればバグでも脆弱性でもない。
0402デフォルトの名無しさん
2009/03/01(日) 14:17:59char str[20];
void setStr(char *test){
for(int i = 0; i < sizeof(str) && test[i]; i++)
str[i] = test[i];
str[i-1] = '\0';
}
0403デフォルトの名無しさん
2009/03/01(日) 14:26:39char *pStr = str;
void setStr(char *test){
std::size_t size = 0;
static const std::size_t limitSize = 18; // ラストのヌル文字考慮
while( *pStr++ = *test++ ){
if( size++ >= limitSize )
break;
}
}
0404デフォルトの名無しさん
2009/03/01(日) 14:27:10ありがとう
0405デフォルトの名無しさん
2009/03/01(日) 14:28:00void setStr(char *test){
if(test == NULL) return;
for(int i = 0; i < strlen(str); i++)
str[i] = test[i];
test[i]='\0';
}
0406デフォルトの名無しさん
2009/03/01(日) 14:29:460407デフォルトの名無しさん
2009/03/01(日) 14:32:31char str[20];
void setStr(const char *test){
strncpy(str, test, sizeof(str));
}
0408デフォルトの名無しさん
2009/03/01(日) 14:34:29>>405のように最初のチェックでtest==NULLの時、str[20]はゴミだらけなんだぜ?
char str[20] = { '\0' };
このたったわずかな宣言だけで、安全性を高める事が出来る
まぁC++じゃ配列なんて使う方が間違っている 普通はコンテナ。
0409デフォルトの名無しさん
2009/03/01(日) 14:37:24速さを求めないなら配列よりコンテナだよなやっぱ。
0410デフォルトの名無しさん
2009/03/01(日) 14:38:280411デフォルトの名無しさん
2009/03/01(日) 14:40:49まてまてw
「20文字以内の文字列を〜」は、*testの事を言ってるんだろう?
渡された*testがtest[3]だとしたら
for(int i = 0; i < sizeof(str); i++)
str[i] = test[i];
このコードでiが2以上の場合どうなるかはわかるよな?
0412デフォルトの名無しさん
2009/03/01(日) 14:42:170414デフォルトの名無しさん
2009/03/01(日) 14:44:150415デフォルトの名無しさん
2009/03/01(日) 14:46:560416デフォルトの名無しさん
2009/03/01(日) 14:54:490417デフォルトの名無しさん
2009/03/01(日) 15:05:12される
0418デフォルトの名無しさん
2009/03/01(日) 15:05:37されるよ
0419デフォルトの名無しさん
2009/03/01(日) 15:24:49void setStr(char *test){
str = test;
}
関数外っぽいから= { '\0' };いらなくね?
0420デフォルトの名無しさん
2009/03/01(日) 15:28:020421デフォルトの名無しさん
2009/03/01(日) 15:40:070422デフォルトの名無しさん
2009/03/01(日) 19:31:06\0とか書くと、逆に紛らわしい
0423デフォルトの名無しさん
2009/03/01(日) 19:32:320424デフォルトの名無しさん
2009/03/01(日) 19:35:290425デフォルトの名無しさん
2009/03/01(日) 19:59:34それわかる
0426デフォルトの名無しさん
2009/03/01(日) 21:26:110427デフォルトの名無しさん
2009/03/01(日) 21:30:42>>1も読めない自称中学生は大人になるまでロムっててね
0428デフォルトの名無しさん
2009/03/01(日) 21:35:16man 2 mount
もしくは
man 2 system
あとスレ違い
0429デフォルトの名無しさん
2009/03/01(日) 21:36:26dtorでいいじゃない。
0430デフォルトの名無しさん
2009/03/01(日) 21:36:360431デフォルトの名無しさん
2009/03/01(日) 21:53:41Manpage of EXEC
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/exec.3.html
0432デフォルトの名無しさん
2009/03/01(日) 22:22:21VC6++なら破棄されないんだろうけど。
0433デフォルトの名無しさん
2009/03/01(日) 22:46:370434デフォルトの名無しさん
2009/03/01(日) 23:13:33VC6だとしても>>402はtestが空の場合やばそうだし、
>>405はstr[20]に代入するような気がするんだが
0435デフォルトの名無しさん
2009/03/01(日) 23:30:07なんか検索してもいまいち引っかからん。
誰かinline展開できるための条件(ないしそれが分かるいいサイト)教えてくれない?
0436デフォルトの名無しさん
2009/03/01(日) 23:34:140437デフォルトの名無しさん
2009/03/01(日) 23:50:57そうなんか。
そして俺みたいにinlineについて詳しくない人は
無駄にinlineとか書かずにコンパイラの最適化能力に任せる様にした方がいいの?
0438デフォルトの名無しさん
2009/03/01(日) 23:52:11ってやるのってどう思う?
俺は意地でも名前空間、stdは全部std::って付けてusingは一度も使わない様にしているんだが。
0439デフォルトの名無しさん
2009/03/01(日) 23:59:18あとswapする時とか、隠蔽されたメンバ関数を引っ張り出す時とか、
boostとtr1のshared_ptrを楽に切り替えたい時とか
0440デフォルトの名無しさん
2009/03/02(月) 00:02:47なるほど!
using嫌いだったのだが、ちょっとusing見直した。
サンクス。
0441デフォルトの名無しさん
2009/03/02(月) 00:04:182行目はusingであって、using namespaceの出番ではないな。
0443デフォルトの名無しさん
2009/03/02(月) 00:30:33ハーブサッターの・・・
と思ったけど、またキモい人が噛み付いてくるかもしれないからヤメた。
0444デフォルトの名無しさん
2009/03/02(月) 00:32:260447デフォルトの名無しさん
2009/03/02(月) 00:44:150448デフォルトの名無しさん
2009/03/02(月) 01:00:390449デフォルトの名無しさん
2009/03/02(月) 01:06:450450デフォルトの名無しさん
2009/03/02(月) 01:09:400451デフォルトの名無しさん
2009/03/02(月) 01:28:500452デフォルトの名無しさん
2009/03/02(月) 03:50:420453デフォルトの名無しさん
2009/03/02(月) 20:46:56error: `wcout' is not a member of `std';
と言われてしまいます。
#include <iostream>
#include <string>
#include <fstream>
#include <locale>
#include <conio.h>
で
std::wcout.imbue(std::locale(""));
と
std::wcout << 〜〜;
のところで言われます。
ヘッダのインクルードが足りないとかでしょうか?
0454デフォルトの名無しさん
2009/03/02(月) 20:51:52多分 Cygwin 上の gcc じゃないかと推察するが、Cygwin (少なくとも 1.5) は locale 実装が腐っていることもあり wchar_t 関連は使えない。
0455デフォルトの名無しさん
2009/03/02(月) 20:52:48ワイド文字対応が駄目すぎる環境では、wcoutなどはそもそも用意されないようになっている。
例えばCygwinとか。
0456デフォルトの名無しさん
2009/03/02(月) 20:54:550457453
2009/03/02(月) 21:29:050458453
2009/03/02(月) 21:46:46g++ (GCC) 3.4.5 (mingw special)
でした。
最新版にして来ます。
あと>>457はかわいそうな人です。
0459デフォルトの名無しさん
2009/03/02(月) 21:52:40>>453は最初から環境すら書けないかわいそうな脳の持ち主ですね
人のことをかわいそうと言う前に自分のかわいそうな脳をなんとかしたら
0460デフォルトの名無しさん
2009/03/02(月) 22:16:22あなたにオススメ。
http://www.amazon.co.jp/%E8%B2%A0%E3%81%91%E7%8A%AC%E3%81%AE%E9%81%A0%E5%90%A0%E3%81%88-%E9%85%92%E4%BA%95-%E9%A0%86%E5%AD%90/dp/4062121182
0461デフォルトの名無しさん
2009/03/02(月) 22:34:41gcc_g++4.3.2
すみません、教えてください。
今、listをreturnすることはできるのでしょうか?
(func()がlistを継承せずに)
下のようなイメージです。
list<int> func() {
return list<int>
}
int main () {
list<int> is;
is = func();
}
0462デフォルトの名無しさん
2009/03/02(月) 22:36:490463デフォルトの名無しさん
2009/03/02(月) 22:37:160464デフォルトの名無しさん
2009/03/02(月) 22:47:34すみません、もう少し教えてください。
私は今、mainから、func1()を呼んでいます。func1では、答えを多数発生(場合の数、すべての
組み合わせを発生させるようなもの。例えばclass Xのリスト、list<X> Xsを作る)します。
この多数発生させたXsをreturnさせたい。
さらに言えば、さらにそのlistを作成したい。(Xss.push_back(func1())のようなことをしたいのです。)
プロはどうしているのですか?このまま単にコードを書くだけでしょうか?
それとも何か別の方法があるのですか?
私としては、mainの見通しが悪くなるので、mainにはあまり2重ループを作りたくないためにこのような
設計を考えています。
0465デフォルトの名無しさん
2009/03/02(月) 22:58:22実体をreturnするのはあり得ないと思う
0466461=464
2009/03/02(月) 23:01:14とりあえず、ポインタ渡ししてフツーに書くしかないみたいですね。
0467デフォルトの名無しさん
2009/03/02(月) 23:04:000468デフォルトの名無しさん
2009/03/02(月) 23:17:370469デフォルトの名無しさん
2009/03/02(月) 23:34:13じゃだめなの?
0470デフォルトの名無しさん
2009/03/02(月) 23:35:53ムーブ可の時はムーブされんの? >STL
0471デフォルトの名無しさん
2009/03/02(月) 23:40:52そうなるみたい。少々無理のあるやり方と考える向きもあるようで。
まず、mainは代入ではなく初期化にした方が良い。
int main(){
list<int> is = func();
}
そして、このコードがどうコンパイルされるかを確認する。
場合によっては効率の良いコードが生成されているかもよ。
0473デフォルトの名無しさん
2009/03/03(火) 11:30:550474デフォルトの名無しさん
2009/03/03(火) 13:48:160475デフォルトの名無しさん
2009/03/03(火) 13:49:050476デフォルトの名無しさん
2009/03/03(火) 14:02:49口ではそういっていてもカラダはfor(int i = 0; i < N; ++i)とか書いちゃうんだろう?
0477デフォルトの名無しさん
2009/03/03(火) 14:13:58いーや、書かない
0478デフォルトの名無しさん
2009/03/03(火) 14:18:440479デフォルトの名無しさん
2009/03/03(火) 14:30:520480デフォルトの名無しさん
2009/03/03(火) 14:45:070481デフォルトの名無しさん
2009/03/03(火) 16:25:15>。よもかるいてれさ成生がドーコい良の率効はてっよに合場
先生!読みにくいし、意味わかんないです!
>>478 >>480
>>474 は多分、>>472 の例で
コンストラクタと代入演算子が呼び出されると思ってる。
0482デフォルトの名無しさん
2009/03/03(火) 16:48:40explicitが付けられるとコンパイルが通らないよ、という意味では?
0483デフォルトの名無しさん
2009/03/03(火) 16:50:440484デフォルトの名無しさん
2009/03/03(火) 17:16:03( ゚д゚)ポカーン
いや、いくらなんでもそんなアホは居ないだろう
474先生の詳しい解説まだー?
0485デフォルトの名無しさん
2009/03/03(火) 17:27:15間違った方向に交通整理しようとして提唱された中括弧書式優先の書法を
信奉し愛しちゃってるのが >>474 先生
0486デフォルトの名無しさん
2009/03/03(火) 17:46:280488デフォルトの名無しさん
2009/03/03(火) 17:50:14そしてhoge a();で悩むんだな。
0489デフォルトの名無しさん
2009/03/03(火) 17:54:070490デフォルトの名無しさん
2009/03/03(火) 18:29:54c[ 0] = 'T';
0491デフォルトの名無しさん
2009/03/03(火) 19:21:57一旦余計な一時オブジェクトの生成が起こるから、非効率だと考えていたのではないかと思う。
けど、それはfunc()がlist<int>型(またはその派生クラス型)以外の場合だけ。
461のfuncはlist<int>を返すから、=で初期化しても、l
ist<int> is(func());と同じように直接初期化される。
(8.5 14節 2)にそういう規定があった)
0492デフォルトの名無しさん
2009/03/03(火) 20:44:500493デフォルトの名無しさん
2009/03/04(水) 04:05:310494デフォルトの名無しさん
2009/03/04(水) 04:14:38バカ
0495デフォルトの名無しさん
2009/03/05(木) 08:47:150496デフォルトの名無しさん
2009/03/05(木) 11:33:24std::size_tは必ず何らかの非負整数型(それがunsignedなんなのかは不問として)のtypedefであることは保証されてる?
それとも独立した組み込み型であるようなことがありえる?
0497デフォルトの名無しさん
2009/03/05(木) 11:39:32サフィックス_tはtypedefの証
0498デフォルトの名無しさん
2009/03/05(木) 11:40:52そーなんか。
typeだと思ったんだぜ。
どうも。
0499デフォルトの名無しさん
2009/03/05(木) 14:29:18って英語でなんて言う?
additional substitution operator
こんな風にC++でいろいろと名前を付けるときに英語が分からなくて困る事がしばしばあるんだが、みんなそんな時どうしてる?
0501デフォルトの名無しさん
2009/03/05(木) 14:34:37まず JIS を見て、それに対応する位置を ISO で見る
0503デフォルトの名無しさん
2009/03/05(木) 14:50:58だな
0505デフォルトの名無しさん
2009/03/05(木) 15:11:26人の言うことを鵜呑みにしない様に。
0506デフォルトの名無しさん
2009/03/05(木) 15:30:100507デフォルトの名無しさん
2009/03/05(木) 15:33:380508デフォルトの名無しさん
2009/03/05(木) 16:17:040509デフォルトの名無しさん
2009/03/05(木) 16:28:11class Base
{
public:
Base& foo(Derived x);
};
class Derived : public Base
{
public:
Derived(){};
};
という状況で、
Base& Base::foo(Derived x)
{
this->foo(static_cast<Derived>(x));//�@
return *this;//�A
}
と定義した。
・・・この最後の�@�Aを1行にまとめることはできない?
0510デフォルトの名無しさん
2009/03/05(木) 16:31:340511デフォルトの名無しさん
2009/03/05(木) 16:36:58それもそうだな。
なんか問題の部分を抽出したらこうなってしまった。
しかもfooがfooを呼び出す定義になってるし。
てことで修正。
class Base
{
public:
Base& foo(Base x);
Base& bar(Base& x){/*適当な処理*/return x;}
};
Base& Base::foo(Base x)
{
this->bar(static_cast<Base>(x));//�@
return *this;//�A
}
と定義した。
・・・この最後の�@�Aを1行にまとめることはできない?
0512デフォルトの名無しさん
2009/03/05(木) 16:58:380513デフォルトの名無しさん
2009/03/05(木) 17:00:550515デフォルトの名無しさん
2009/03/05(木) 17:18:050516デフォルトの名無しさん
2009/03/05(木) 18:06:18this->bar(static_cast<Base>(x));
は単に
bar( dynamic_cast< Base >( x ) );
じゃだめなんかいのぅ?
this-> をつけないと競合する名前があるってこと?
0517デフォルトの名無しさん
2009/03/05(木) 18:08:10wstr=L"sample";
std::cout << "test1\t" << ((std::wstring(L"sample")==wstr)?"true":"false") << std::endl;
std::cout << "test2\t" << ((std::wstring(L"sample")!=wstr)?"true":"false") << std::endl;
wstr=L"あいうえお";
std::cout << "test3\t" << ((std::wstring(L"あいうえお")==wstr)?"true":"false") << std::endl;
std::cout << "test4\t" << ((std::wstring(L"あいうえお")!=wstr)?"true":"false") << std::endl;
こうするとVC2008では
test1 true
test2 false
test3 true
test4 false
となる。これは正しい。しかしこれをbccでやると
test1 true
test2 false
test3 false
test4 true
となる。
…これはbccがクソなせいか?
g++に至ってはコンパイルすらできないが。
0518514
2009/03/05(木) 18:10:46ああ、単にそれでおk。
ただ俺の取り組んでいる本家のソースの方(2ch投稿用に切り出した物ではなく)はテンプレートの関係でthis->をしないわけには行かなかったんで付けてたら、
つい間違って2ch投稿用に切り出した物にまで付けちゃったんだ。
惑わしてすまん。
0519デフォルトの名無しさん
2009/03/05(木) 18:15:51なんでキャストしてるの?
0520デフォルトの名無しさん
2009/03/05(木) 18:20:59g++通ったけどなぁ
バージョンは4.3.3
文字コードがsjisだったりする?
0521514
2009/03/05(木) 18:21:20それも無駄キャスト。
本家のソースの方(2ch投稿用に切り出した物ではなく)は他のクラスの引数も受け取れる仕様になってたから
キャストしてた。
…要するに消し忘れ。
0522デフォルトの名無しさん
2009/03/05(木) 18:24:15>文字コードがsjisだったりする?
文字コード…g++についてはその辺がhitかも。
とりあえずbccがクソであることは確定して良い?
0523520
2009/03/05(木) 18:27:28test1 true
test2 false
test3 true
test4 false
でした
0525デフォルトの名無しさん
2009/03/05(木) 18:54:26なるほど。わざわざサンクスです。
0526517
2009/03/05(木) 20:03:21g++を現在の最新の
g++ (GCC) 4.3.3
にして
std::wstring wstr;
wstr=L"sample";
std::cout << "test1\t" << ((std::wstring(L"sample")==wstr)?"true":"false") << std::endl;
std::cout << "test2\t" << ((std::wstring(L"sample")!=wstr)?"true":"false") << std::endl;
wstr=L"あいうえお";//17行目
std::cout << "test3\t" << ((std::wstring(L"あいうえお")==wstr)?"true":"false") << std::endl;//18行目
std::cout << "test4\t" << ((std::wstring(L"あいうえお")!=wstr)?"true":"false") << std::endl;//19行目
をコンパイルするも
〜.cpp:17: error: converting to execution character set: Illegal byte sequence
〜.cpp:18: error: converting to execution character set: Illegal byte sequence
〜.cpp:19: error: converting to execution character set: Illegal byte sequence
というエラーになる。
>>520さんの言う文字コードってのはソースファイルの文字コードのこと?
それなら[Shift-JIS]で [CR+LF]になってる。
0527デフォルトの名無しさん
2009/03/05(木) 20:04:36--input-charset指定していないだろ。
0528デフォルトの名無しさん
2009/03/05(木) 20:10:27コンパイラオプション?
やってみる。
0529デフォルトの名無しさん
2009/03/05(木) 20:41:36wchar_t は組み込み型だから typedef の証ではない
0530デフォルトの名無しさん
2009/03/05(木) 20:42:07wchar_tだけは_tだけど特別なんだろ。
C言語との兼ね合いで。
0531デフォルトの名無しさん
2009/03/05(木) 20:42:290532デフォルトの名無しさん
2009/03/05(木) 20:43:58何が?
0533デフォルトの名無しさん
2009/03/05(木) 20:55:56BCC6.10(最新版)を使うと
true
false
true
false
となった。
0534デフォルトの名無しさん
2009/03/05(木) 20:57:20所詮は強制力のない口約束
0536デフォルトの名無しさん
2009/03/05(木) 22:03:31wchar_t is a keyword in this International Standard (2.11).
It does not appear as a type name defined in any of <cstddef>, <cstdlib>, or <cwchar> (21.4).
0537517
2009/03/05(木) 22:05:59久々にボーランドに行ったら
Download a Trial for C++Builder
https://downloads.embarcadero.com/free/c_builder
ここからだと
C++ Compiler 5.5
しかDLできねぇ。
どこから6.10をゲットした?
0538デフォルトの名無しさん
2009/03/05(木) 22:06:50そういう話をしている場合でないくらいわかるだろ。
0539デフォルトの名無しさん
2009/03/05(木) 22:07:29売り物のBCBの最新版では?
0540デフォルトの名無しさん
2009/03/05(木) 22:10:55売り物かぁ。
売り物はもってないんだよねぇ。
0541デフォルトの名無しさん
2009/03/06(金) 01:28:47ゴメンね
0542517
2009/03/06(金) 01:39:15俺は最終的には
#if defined(__BORLANDC__)
〜
#endif
という(最低のw)手段で乗り切る予定。
この辺で寝ないと明日死ぬから寝るけど。
0543デフォルトの名無しさん
2009/03/06(金) 01:51:32template<typename IterT, typename DistT>
void doAdvancd(IterT& iter, DistT d, std::random_access_iterator_tag){ ... }
ってあるけど、この第3パラメータって何なの?C++て型情報をパラメータに取れるの?
これの呼び出しが
doAdvance(iter, d, typename std::iterator_traits<IterT>::iterator_category());
になってて、この第3パラメータは何なの?typenameをつけると型情報が出力されるの?
0544デフォルトの名無しさん
2009/03/06(金) 01:53:28ロケールを適切に設定してるか?
0545デフォルトの名無しさん
2009/03/06(金) 02:19:32オーバーロードの仕組みを使って適切な関数が呼び出されるようにしているだけ
std::random_access_iterator_tag はただの型で、引数名を省略している
呼び出しの方も一時変数を作って渡しているだけで特に変なことをしているわけではない
IterT がテンプレート引数じゃなくて実際の型だったら、そこにある typename は要らない
例えば、以下はOK
doAdvance(iter, d, std::iterator_traits<std::vector<int>::iterator>::iterator_category());
IterT がテンプレート引数なせいでそこに typename をつける必要が出てくるわけだが
そこはC++の仕様だから適当に調べてくれ
説明はめんどい
0546デフォルトの名無しさん
2009/03/06(金) 02:25:48それ、イテレータタグといってイテレータの種類がわかる
iterator_category()によってそのイテレータの種類を表す空の構造体を返してる
その空構造体で関数をオーバーロードしてる
たとえばdistanceとかでランダムアクセス可能なのにいちいち辿っていくのは効率悪いでしょ
0547デフォルトの名無しさん
2009/03/06(金) 02:45:310548デフォルトの名無しさん
2009/03/06(金) 03:01:26ぐぐってもドキュメント見てもわからなかったんで
助言頂けると非常に助かります。
VC++2008ExpressEditionを使用しているので、どこかを変更しなければいけないのか…
質問の内容は…
猫でもわかるプログラミングSDK第123章
ttp://www.kumei.ne.jp/c_lang/sdk2/sdk_123.htm
これと同じプログラムを組んでも、WndProc内でcase IDM_READの
hMapFile2 = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "Kumei's Object");
のOpenFileMappingがNULLを返してくるんだけど
原因がまったくわかりませんorz
0549デフォルトの名無しさん
2009/03/06(金) 03:07:050550デフォルトの名無しさん
2009/03/06(金) 03:09:18教えてくれてサンクス
VCスレで聞いてくることにします
0551543
2009/03/06(金) 08:18:57それってC++の仕様?Cでも可能?
0552デフォルトの名無しさん
2009/03/06(金) 08:43:55そうですC++Builder2009の付属品です
boostのかなりの部分にも対応しましたし昔に比べればだいぶ
良くなったと思います(昔に比べればね。VCに比べれば糞だけど)
0553デフォルトの名無しさん
2009/03/06(金) 11:43:25釣りか本気なのかわからんが…
distance(Iter, Iter)を例であげると実装は、distance内部で
return _distance2_(iter1, iter2, iterator_tag)
みたいなのが呼び出されて最適な関数がオーバーロードで呼び出されてる
使っている分にはiterator_tagを意識する必要はなく、distance(Iter1, Iter2)で呼び出せば良い
省略可能か、と言われると省略可能だな
本来iterator_tagはいらないんだろうけど、オーバーロードに失敗するコンパイラとかもあるから
こういう仕様になっている
0554517
2009/03/06(金) 14:35:08wstr=L"sample";
std::cout << "test1\t" << ((std::wstring(L"sample")==wstr)?"true":"false") << std::endl;
std::cout << "test2\t" << ((std::wstring(L"sample")!=wstr)?"true":"false") << std::endl;
wstr=L"あいうえお";
std::cout << "test3\t" << ((std::wstring(L"あいうえお")==wstr)?"true":"false") << std::endl;
std::cout << "test4\t" << ((std::wstring(L"あいうえお")!=wstr)?"true":"false") << std::endl;
これで正しくは
test1 true
test2 false
test3 true
test4 false
となるはずがBCC 5.5.1では
test1 true
test2 false
test3 false
test4 true
となってしまうことについて聞いた者だけど、
その後いろいろいじってみたら次のことが分かった。
0555517
2009/03/06(金) 14:36:12�@〜が半角文字なら
std::wstring(L"〜")==wstr
も
wstr==std::wstring(L"〜")
も正しく動作する。
�A〜が全角文字なら
std::wstring(L"〜")==wstr
は誤判定するが
wstr==std::wstring(L"〜")
は正しく動作する。
�Bcompareメンバ関数は
std::wstring(L"〜").compare(wstr)
wstr.compare(std::wstring(L"〜"))
共に正しく動作する(等しい時に0を返す)。
…………………………
そこで、前に
bool operator==(const std::basic_string<wchar_t> &left_str,const std::basic_string<wchar_t> &right_str)
{return left_str.compare(right_str)?false:true;}
bool operator!=(const std::basic_string<wchar_t> &left_str,const std::basic_string<wchar_t> &right_str)
{return left_str.compare(right_str)?true:false;}
と記述してみたのだけれど、相変わらず
test1 true
test2 false
test3 false
test4 true
のままなのだ。これじゃだめなのだろうか?
0556デフォルトの名無しさん
2009/03/06(金) 14:40:15釣りではない。
質問は単純で
void func(int){printf("int\n")};
void func(float){printf("float\n");}
というのがC++では可能なのか?ということ。
また関数名を変えて多態でなくすればCでも可能なのか?と尋ねてる。
引数を受け取る変数は必ず必要だと思い込んでいたので。
(iterator_tagに関してはあまり興味はない。)
0557デフォルトの名無しさん
2009/03/06(金) 14:56:16大人しくBCB2009買え
0558デフォルトの名無しさん
2009/03/06(金) 14:59:09Effective C++読むより先に入門書読め
0559デフォルトの名無しさん
2009/03/06(金) 15:00:23BCC は全然知らないけど、UTF-8で書くと幸せになれるかもしれない
0560デフォルトの名無しさん
2009/03/06(金) 15:01:38関数のオーバーロードって知ってる?
0561デフォルトの名無しさん
2009/03/06(金) 15:10:19やってみればわかるだろw
0562517
2009/03/06(金) 15:20:18UTF-8に文字コード変換してみたけど
幸せになりきれなかった。
いろいろとコンパイルエラーになる。
〜.cpp 32: 文字列または文字定数が閉じていない(関数 main() )
〜.cpp 33: ステートメントにセミコロン(;)がない(関数 main() )
〜.cpp 33: 文字列または文字定数が閉じていない(関数 main() )
〜.cpp 34: 文字列または文字定数が閉じていない(関数 main() )
*** 4 errors in Compile ***
う〜む。
�Aのstd::wstring(L"〜")==wstrが誤判定でwstr==std::wstring(L"〜")は正しく動作する
のが不可解でならないんだよねぇ。
bcc5.5.1のこの不具合に対して誰か手を打った例を示した人(やソース)はどっかに公開されてないのだろうか?
0563デフォルトの名無しさん
2009/03/06(金) 15:48:16とかけるんだから
int hoge ( int ){ /**/ }
のようなものも可能だな。
引数を受け取って単に捨てる。
0564デフォルトの名無しさん
2009/03/06(金) 15:59:030566デフォルトの名無しさん
2009/03/06(金) 17:50:59個々のコンパイラでできるかどうかではなく、C++あるいはCの規格にあるのかを知りたい。
0567デフォルトの名無しさん
2009/03/06(金) 17:54:36入門書では
引数をとる関数の定義には必ず引数を受ける変数が書かれているよ。
関数の引数を受け取る受ける変数を省略している例が書いてある入門書ってある?
あるなら教えて。
0568デフォルトの名無しさん
2009/03/06(金) 17:56:00なぜ入門書すら読まずにここで聞くのか
0569デフォルトの名無しさん
2009/03/06(金) 17:57:58HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
) {}
でやってる時、「nCmdShowは使用されていません」みたいな警告が出て、
そこで変数名を消すと、警告が消える、みたいなことを味わうWin開発者。
0570デフォルトの名無しさん
2009/03/06(金) 17:58:25なぜ?理由を具体的に。
0571デフォルトの名無しさん
2009/03/06(金) 18:02:33C++プライマー
0572デフォルトの名無しさん
2009/03/06(金) 18:02:59あ、君の疑問がわかったよね。
>>556はfuncが2つあることを疑問に思っているのではないよ。確かにそれならC++の入門書に書いてある。
でも疑問はそうじゃなくて
funcの引数が型だけで変数が無いことを疑問に思っているのだよ。
0573デフォルトの名無しさん
2009/03/06(金) 18:34:12だったら規格票くらい買えよ
仮にここで「保証されてる」と答えても嘘かも知れないだろ
0574517
2009/03/06(金) 18:43:14BCC 5.5.1で
bool operator==(const std::basic_string<wchar_t> &left_str,const std::basic_string<wchar_t> &right_str)
{std::wcout << left_str << L"\t" << right_str << L"\t";return left_str.compare(right_str)?false:true;}
と定義してみた。
std::wstring wstr=L"piyoあいうえお";
この時
std::wstring(L"piyoあいうえお")==wstr
とすると左オペランドleft_strが「piyo」に、右オペランドright_strが「piyoあいうえお」になっている事が分かる。これが誤動作の原因だ。
wstr==std::wstring(L"piyoあいうえお")
としたときは正しく左オペランド、右オペランド共に「piyoあいうえお」になる。
…さーて、BCC 5.5.1は見限るしか しようがないのかな。
どうにかして(つぎはぎ的にで良いから)動作させたかったのだが。
0575デフォルトの名無しさん
2009/03/06(金) 18:48:440576デフォルトの名無しさん
2009/03/06(金) 19:11:58それよりもhPrevInstanceを省略するほうが先だろう。
0577デフォルトの名無しさん
2009/03/06(金) 19:12:55よくわからんが<string>のバグ?を自分で修正すれば良いだけじゃね?
0578デフォルトの名無しさん
2009/03/06(金) 19:17:09いや、他人の環境でも通用させたいライブラリ的な用途のつもりだから、
手元の修正じゃだめなんだ。
…ライブラリって言っても本気で公開したりとか言うつもりことはないんだけど、
経験のためにたまたま出会ったbcc5.5.1の不具合に対する対処を考えているところなのだ。
0579デフォルトの名無しさん
2009/03/06(金) 19:17:150580デフォルトの名無しさん
2009/03/06(金) 19:18:12トム・デマルコがグルは口が悪いし意地悪だから
辛抱強く質問しろといってたじゃないかw
で、結論から言うと、それはできる。
無名のオブジェクトで所有権の移譲が行われなければ
それは単に捨てられる。パラメータに変数がない場合、
値渡しにせよ、参照にせよ、ポインタにせよ、
メモリのどこかにそれらが作られた後、単純に捨て去られる。
もちろん、オーバーロードは正常に機能する。
0581517
2009/03/06(金) 19:32:10やっぱそうだよねー
このスレの>>376もテンプレート周りがクソな事を示しているし。
一応bccの時のみコンパイル時に警告を表示させたいと思っているのだが
「bccの時のみ」は
#if defined(__BORLANDC__)
〜
#endif
で出来るがbccの
# pragma
で警告だせる?指定したメッセージの。
0582デフォルトの名無しさん
2009/03/06(金) 19:53:27Turbo C++ Explorer 使っとけ。
この辺はまともになっている。
0584デフォルトの名無しさん
2009/03/06(金) 21:09:23プロになるわけでもなく(別の職業があるので)単に趣味なのですが、
そろそろまた勉強になるC++の本を買いたいと思って探しております。
何か良い本はありませんか?
Effective C++という本が人気が高そうだと思っているのですがどうでしょうか。
0585デフォルトの名無しさん
2009/03/06(金) 21:10:28ナイスチョイスです
0586584
2009/03/06(金) 21:20:31Amazon的には
Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES): スコット・メイヤーズ, 小林 健一郎: 本
http://www.amazon.co.jp/Effective-%E5%8E%9F%E8%91%97%E7%AC%AC3%E7%89%88-ADDISON-WESLEY-PROFESSIONAL-COMPUTING/dp/4894714515/ref=sr_1_1?ie=UTF8&s=books&qid=1236341768&sr=1-1
ここで多少 日本語訳に文句が付いているのですが、それでもやっぱりオススメでしょうか?
0587デフォルトの名無しさん
2009/03/06(金) 21:27:310588デフォルトの名無しさん
2009/03/06(金) 21:28:10名著だが邦訳は糞。
原著で読めるならそれの方がいい。
0589デフォルトの名無しさん
2009/03/06(金) 21:32:29C99+TC3では6.9.1でidentifierがなくてはいけないとなってます
0590デフォルトの名無しさん
2009/03/06(金) 21:49:43・それを全否定しうる誤訳・悪訳を挙げられる人(正誤表が作れる)
・洋書を自慢したいだけなナンチャッテおじさん(ソースが2ch)
0591デフォルトの名無しさん
2009/03/06(金) 21:51:32別にキレてないよ。どうしてそう思ったの?
それはともかくありがとう。
省略可能なのね。
0592デフォルトの名無しさん
2009/03/06(金) 21:53:47それを言ったらこのスレの存在意義がないでしょ。
0593デフォルトの名無しさん
2009/03/06(金) 21:58:55存在意義?
少なくとも「確認」に使う価値なんざねえぜ
所詮、便所の落書きだ
0594584
2009/03/06(金) 22:01:20>>588
私は英語にそこまで問題はないつもりですが、肝心のC++の知識の程度を加味しますと
結局「私のC++の知識で脳内で翻訳する原著」と、「C++の知識がある方が翻訳した訳本」とでは果たしてどちらがいいものでしょうか。
…と言ったことも加味して考えてみます。
ありがとうございました。
0596デフォルトの名無しさん
2009/03/06(金) 22:04:00まあ、そうだね。
0597(!=566)
2009/03/06(金) 22:05:13関数定義ではそうなのか。
プロトタイプ宣言ではどう?
定義では
void foo(int hoge){〜〜
になっていてもヘッダーで
void foo(int);
って書く人もいるじゃん。これはどう?
0598デフォルトの名無しさん
2009/03/06(金) 22:05:42>それを全否定しうる誤訳・悪訳を挙げられる人(正誤表が作れる)
つまり、原書を読み、日本語訳も読んだってことだよな
原書を読んでいるのに、何でわざわざ日本語訳を購入して読むんだ
0599デフォルトの名無しさん
2009/03/06(金) 22:11:41少なそうだね
0600デフォルトの名無しさん
2009/03/06(金) 22:13:04読み飛ばしてた。ゴメン。
つまり、C99では関数定義の引数の変数(識別子?)を省略出来ないってこと?
0601デフォルトの名無しさん
2009/03/06(金) 22:19:02str.swap(string())のような開放しないといけませんか?
0602デフォルトの名無しさん
2009/03/06(金) 22:25:59list<string> L;
string tmp(5*1024*1024,'a');
for(int n=0;n<1000;n++){ L.push_back(tmp);L.pop_back(); }
0603デフォルトの名無しさん
2009/03/06(金) 22:27:27そんなバカな
それじゃvoid foo(void)は定義できないじゃないか
0604デフォルトの名無しさん
2009/03/06(金) 22:42:32voidのときは例外。
0605デフォルトの名無しさん
2009/03/06(金) 22:44:37void a;
って宣言できないよね。
0606デフォルトの名無しさん
2009/03/06(金) 22:52:420607デフォルトの名無しさん
2009/03/06(金) 22:59:34void a();
なら宣言できるけど、
型でなければ何だと思っていたわけ?
0608デフォルトの名無しさん
2009/03/06(金) 23:05:46自分の場合は
・検索がしやすい
・読むときに辞書がいらない(移動中でも読める)
・他人と話をあわせやすい
なんかの理由で買ってる
効率考えたら日本語の方が良いしね
More Effective C++のようなゴミだとそうもいかないが
0609デフォルトの名無しさん
2009/03/06(金) 23:10:56vectorのvectorを作れば良いのかな?
0610デフォルトの名無しさん
2009/03/06(金) 23:11:45全くもってお勧めしないけどな
0611デフォルトの名無しさん
2009/03/06(金) 23:12:02え??
0612デフォルトの名無しさん
2009/03/06(金) 23:29:18C99 では(プロトタイプ)宣言では識別子は省略可能、関数定義では識別子が必要(void の場合を除く)。
> 9899:1999
> 6.7.5.3/6
> A parameter type list specifies the types of, and may declare identifiers for,
> the parameters of the function.
>
> 6.9.1/5
> If the declarator includes a parameter type list, the declaration of
> each parameter shall include an identifier, except for the special case
> of a parameter list consisting of a single parameter of type void,
> in which case there shall not be an identifier. No declaration list
> shall follow.
C++ では識別子は省略可能。
> 14882:2003 8.3.5/8
> An identifier can optionally be provided as a parameter name; if present
> in a function definition (8.4), it names a parameter (sometimes called
> “formal argument”). [Note: in particular, parameter names are also
> optional in function definitions and names used for a parameter in
> different declarations and the definition of a function need not be
> the same. If a parameter name is present in a function declaration that
> is not a definition, it cannot be used outside of the
> parameter-declaration-clause since it goes out of scope at the end of
> the function declarator (3.3). ]
0613デフォルトの名無しさん
2009/03/07(土) 00:02:08たぶん「他人と話を合わせやすい」と似たような理由なんじゃないかな
日本語での表現を知りたいって理由もあるしね
もっとも、そこにそう書いてあるからってそれが一般的な表現とも限らないけどね
例えばJISの「返却値」とか
0614デフォルトの名無しさん
2009/03/07(土) 00:10:150616デフォルトの名無しさん
2009/03/07(土) 00:56:08>>612の外国語が何を言っているのか分るのか。すごいな。
0617551
2009/03/07(土) 01:05:05別に難しいこと書いてないけど。
0618デフォルトの名無しさん
2009/03/07(土) 01:25:24そうなんですか。
変数の個数のメンバーがあってそれに対応するvectorを作ろうとすると
vectorの配列が必要となるのですが、お勧めしないのであれば
どのような実装にすればいいか教えて下さい。
0619デフォルトの名無しさん
2009/03/07(土) 01:27:17そういう時は、要求されるデータ構造を提示してしまうのがいいと思うよ。
vectorのvectorでよさそうな気がするけど。
0620デフォルトの名無しさん
2009/03/07(土) 01:29:440621デフォルトの名無しさん
2009/03/07(土) 07:43:050622デフォルトの名無しさん
2009/03/07(土) 07:48:29void foo(int n)
よりも
void foo(const int &n)
のが望ましいよね?後者は前者の完全上位互換だと思って良いかな?
0623デフォルトの名無しさん
2009/03/07(土) 07:52:02いや、効率は悪化する可能性がある
すくなくとも前者より後者がよなる可能性はない
参照はポインタによって実装されているから後者は遅くなる可能性がある
0624デフォルトの名無しさん
2009/03/07(土) 07:53:01初めて知りました。
クラスだったら話は別かな?
0625デフォルトの名無しさん
2009/03/07(土) 08:24:15クラスでも、メンバ変数がint一個だったりしたら効率を落とす可能性はある。
0626デフォルトの名無しさん
2009/03/07(土) 08:27:21なるほど。
std::stringぐらいだとどうかな?さすがに処理が重いか。
0627デフォルトの名無しさん
2009/03/07(土) 08:40:48vectorのコピーが発生しまくりになるんじゃないかな
std::list<std::vector<?>>とかstd::vector<boost::shared_ptr<std::vector<?>>>のほうが軽くなるんじゃないかな
0628デフォルトの名無しさん
2009/03/07(土) 10:47:21コンパイラ的には
void foo(int n)
よりも
void foo(const int n)
のが最適化しやすいから望ましいよね?
今度は後者は前者の完全上位互換だと思って良いかな?
0629デフォルトの名無しさん
2009/03/07(土) 10:50:56定義部分にだけconstつけるんならべつにいいんじゃね、ってなんかの本に書いてたで
0630デフォルトの名無しさん
2009/03/07(土) 11:01:22最適化にも全く関係しないような
0631デフォルトの名無しさん
2009/03/07(土) 11:05:100632デフォルトの名無しさん
2009/03/07(土) 11:21:27そっか。
そんなもんなのか。
どうも。
0633デフォルトの名無しさん
2009/03/07(土) 14:04:08その代わりといってはなんだが、エラーチェックだけはしてくれるようになるぞ。
例えばそのfoo()で++nとするとエラーになるわけだ。
0635デフォルトの名無しさん
2009/03/07(土) 15:32:27std::string test
void setTest(char *str);
void setTest2(std::string str);
};
便宜上setTestとsetTest2と名前を変えましたがオーバーロードとして残しておくか悩んでいるんですが
どちらかを削るか残しておくかどちらのほうがいいんでしょうか?
0636デフォルトの名無しさん
2009/03/07(土) 15:37:14って大変なことになるんじゃね?
stringのインスタンスって、48バイトくらいあったような。
詳しい人説明よろしく。
0637デフォルトの名無しさん
2009/03/07(土) 15:52:234.8Mバイトなら、ちょっとだけ気になるがな
0638デフォルトの名無しさん
2009/03/07(土) 15:53:01void setTest(const char *str);
void setTest2(const std::string& str);
setTestを削れば、setTest2は一時オブジェクトを作ってsetTestの代わりをすることも可能だね
0639デフォルトの名無しさん
2009/03/07(土) 15:58:35ま、それにしてもstringの方はconst string& strにした方が良いよ
0640デフォルトの名無しさん
2009/03/07(土) 16:19:38寝言。
0642デフォルトの名無しさん
2009/03/07(土) 17:14:09おそらく640は、int も int一個のクラスもコストは同じといいたいんだろう。実際VC++2005は同じコードが出ているね。
intやint一個のクラスで参照渡しだと間接参照になるのでオブジェクトをアクセスするときに余計なコストがかかるようになる。
0643デフォルトの名無しさん
2009/03/07(土) 17:14:56だいたいは、オブジェクトサイズが16バイトをこえたりする辺りが境界になるようだ
ソースは俺の寝言
0644デフォルトの名無しさん
2009/03/07(土) 17:57:480645デフォルトの名無しさん
2009/03/07(土) 18:07:15void chkStr(char *hoge);
void chkStr(char &hoge);
って何が違うんでしょう?
0646デフォルトの名無しさん
2009/03/07(土) 18:12:45指している物は一緒
0647デフォルトの名無しさん
2009/03/07(土) 18:13:38&の場合は.でいいってことですね、ありがとうございました
0648デフォルトの名無しさん
2009/03/07(土) 18:15:420649デフォルトの名無しさん
2009/03/07(土) 18:15:460650デフォルトの名無しさん
2009/03/07(土) 18:27:580651デフォルトの名無しさん
2009/03/07(土) 18:29:06そしてクラスの場合[ ]の意味も変わってしまう。
0652デフォルトの名無しさん
2009/03/07(土) 18:30:190653デフォルトの名無しさん
2009/03/07(土) 18:32:040654デフォルトの名無しさん
2009/03/07(土) 18:32:34危険だ
0655デフォルトの名無しさん
2009/03/07(土) 18:33:57filestream使えばいけるのかな?というわけで試してきます
0656デフォルトの名無しさん
2009/03/07(土) 18:35:210657デフォルトの名無しさん
2009/03/07(土) 18:53:450658デフォルトの名無しさん
2009/03/07(土) 22:02:460659デフォルトの名無しさん
2009/03/09(月) 04:27:23遅レスだが、暗黙にコンストラクタが呼ばれる可能性があるので、そのコストにもよる。
0661デフォルトの名無しさん
2009/03/09(月) 21:08:30double d;
この時
d=i;//�@
d=static_cast<double>(i);//�A
この�@の方は単純に代入しているだけで、�Aはわざわざキャストであることをはっきり書いてるわけだが、その程度の認識しか俺はしていない。
�Aで書く意義はあるの?
0662デフォルトの名無しさん
2009/03/09(月) 21:31:48そういう安全なキャストをいちいち明示するのは可読性を下げるだけ。
0663デフォルトの名無しさん
2009/03/09(月) 21:48:23俺もそう思っているのだが、みんなはどう考えているのか是非聞きたい。
0664デフォルトの名無しさん
2009/03/09(月) 21:52:350665デフォルトの名無しさん
2009/03/09(月) 22:03:50>>662同意だな。
boost::numeric_castという便利なものもあるぞ
0666デフォルトの名無しさん
2009/03/09(月) 22:18:52boost::numeric_castは便利そうだな。
どうやって実装してるんだろうね。
0667デフォルトの名無しさん
2009/03/09(月) 22:58:550668デフォルトの名無しさん
2009/03/09(月) 23:27:12ああ そういうことか。
0669661
2009/03/09(月) 23:59:21d=i;//�@
d=static_cast<double>(i);//�A
この2つで実行時のコードの速さは理論的には差はないんだよね?
例えクラスAとB(Aを継承)で
A a;
B b;
a=b;//�@
a=static_cast<A>(b);//�A
だったとしても、同じだよねぇ?
0670デフォルトの名無しさん
2009/03/10(火) 00:03:03同じ
0671デフォルトの名無しさん
2009/03/10(火) 00:03:54ありがと!
0672デフォルトの名無しさん
2009/03/10(火) 00:04:51std::cout << hoge+"test" << std::endl;
std::cout << hoge+="test" << std::endl;//問題の行
こうすると、
問題の行: このコンテキストではオーバーロード 'endl' が曖昧(関数 main() )
0674デフォルトの名無しさん
2009/03/10(火) 00:08:54(hoge+="test")としてみるとか
0675デフォルトの名無しさん
2009/03/10(火) 00:09:50std::cout << ( hoge+="test" ) << std::endl;//問題の行
あと、cout の中で演算をしてはいけない。
0676デフォルトの名無しさん
2009/03/10(火) 00:10:360677672
2009/03/10(火) 00:16:48()付ければいけるな。
あとcoutの中で演算しない方が良いのは何で?
0678デフォルトの名無しさん
2009/03/10(火) 00:19:22int i = 0;
cout << ++i << ++i << ++i << ++i << ++i << endl;
予想される結果は「12345」だけど、実際にはめちゃくちゃになる。
<< の評価順は規定されていない。どこから評価されるか不明。
ステートメントの終わりに i が 5 になるのは確かだけど。
0679672
2009/03/10(火) 00:24:37俺の環境では54321になった。
なるほど、そんなんあったなぁ。
foo()==bar()
でどっちが先に評価されるか未定義なのと同じかい?
0680デフォルトの名無しさん
2009/03/10(火) 00:25:090681デフォルトの名無しさん
2009/03/10(火) 00:33:55×未定義
○不定
0682デフォルトの名無しさん
2009/03/10(火) 00:37:45それは未定義。隣接する副作用完了点の間で、同じオブジェクトを二度以上変化させてはならない。
0683672
2009/03/10(火) 00:39:08だとどうなる?
これは未定義の動作になる?それとも不定?
0684デフォルトの名無しさん
2009/03/10(火) 00:44:46評価される順序は:
(1) cout, ++i, endl
(2) 左側の<<
(3) 右側の<<
(1)の3式の順序は不定。
>>675も同様。
0685682
2009/03/10(火) 00:46:310686672
2009/03/10(火) 00:52:01んんん???
なんかクソ難しいな。
int i=-1;
で
if(++i){〜}
は良いんだよね?
(++i)+(++i)
はダメなの?
++iが意味不明に思えてきた。
俺のドタマで理解できる日は来るのだろうか?
0687デフォルトの名無しさん
2009/03/10(火) 00:56:06a += (++i)++;
とか
0688デフォルトの名無しさん
2009/03/10(火) 00:58:43ごく簡単に言うと、一文の中で変数を書き換えられるのは高々一回。
int i;
j = i++; // OK
j = i++ + i++; // NG
0689687
2009/03/10(火) 01:11:42いや俺 分かってない
>>688
>ごく簡単に言うと、一文の中で変数を書き換えられるのは高々一回。
むっちゃくちゃ分かりやすいな。
みんなから習ったことを俺なりの言葉で述べてみると、
int i=-1;において、
�@if(++i){〜}は良い。
動作は、iがインクリメントされてその値が式の値となりifでの評価に使われる。
�A(++i)+(++i)はダメ。
なぜなら、+の前後のどちらが先に評価されるかは不定であり、また(++i)という副作用が生じる式が一つの式の中で2回行われているというところは未定義の動作になる。
�Bstd::cout << ++i << ++i << ++i << ++i << ++i << std::endl;もダメ。
なぜなら、<<の前後のどちらが先に評価されるかは不定であり、また++iという副作用が生じる式が一つの式の中で5回行われているというところは未定義の動作になる。
�Cstd::cout << ++i << std::endl;は良い。
動作は、まずstd::coutと++iとstd::endlの3者が順不同で評価される(順番に関しては不定な動作)。
しかし副作用が生じる式が++iの1つしか含まれていないため未定義にはならない。その後std::cout << ++iが評価され、「std::cout << ++iの戻値」と << std::endl;とで評価が行われる。
0690デフォルトの名無しさん
2009/03/10(火) 01:15:570691687
2009/03/10(火) 01:19:05ある式を評価したら何らかの変数やオブジェクトの値が変わる場合、その式は副作用を生じると称する。
…んだと思っているんだが、間違い?
0692デフォルトの名無しさん
2009/03/10(火) 01:39:330693687
2009/03/10(火) 01:48:06ええと、違う変数なら良いんだよね?
つまりn=(++i)*(++j)は正しいんでしょ?
一方 n=(++i)*(i)はダメだよね?*の前後の評価順序に関して不定。さらに++iとiがある点が未定義になるんだよね?
…なんとなくつかめてきた感がある。
要は、
「++iってインクリメントしたらその文中でiを他に参照しているところがあってはならない」
って言う風にまとめられるのかな。
0694デフォルトの名無しさん
2009/03/10(火) 01:50:020695デフォルトの名無しさん
2009/03/10(火) 01:51:550696デフォルトの名無しさん
2009/03/10(火) 01:57:42>つまりn=(++i)*(++j)は正しいんでしょ?
そのとおり。かまわない。
>一方 n=(++i)*(i)はダメだよね?
そのとおり。
0698デフォルトの名無しさん
2009/03/10(火) 02:43:04http://www.cppll.jp/cppreference/cppstring_details.html
ここ見て思ったのだが、メンバ関数の引数としてイテレータを受け入れられる用に用意されているのと用意されていないのがあるね。
どういったコンセプトでイテレータOKにするとかダメにするとか決めているか分かる人いません?
0699デフォルトの名無しさん
2009/03/10(火) 17:40:20std::stringに限って言えばぶっちゃけインデックスだけで十分だと俺は思うんだが。
findがインデックスを返すし、それをイテレータに足すなんてやりたくない。
…コンテナとしてはイテレータが役立つけど。
0700デフォルトの名無しさん
2009/03/10(火) 17:46:07一見するとconstでないメンバ関数(コンストラクタ含む)の時のみイテレータが実装されているみたいじゃね?
…何でだろうね。
0701デフォルトの名無しさん
2009/03/10(火) 18:24:28それの関係じゃないの。
0702デフォルトの名無しさん
2009/03/10(火) 18:55:130703デフォルトの名無しさん
2009/03/10(火) 18:55:430704デフォルトの名無しさん
2009/03/10(火) 19:10:530705デフォルトの名無しさん
2009/03/10(火) 19:12:390706デフォルトの名無しさん
2009/03/10(火) 23:30:34このLC_ALLって正式な標準C++仕様ですか?
0707デフォルトの名無しさん
2009/03/10(火) 23:45:06そうだけど、"ja"はC++標準ではない。""ですむならそのほうがいいはず。
さらに言えば、C++ならstd::locale::global(std::locale(""))使うべき。
0708デフォルトの名無しさん
2009/03/10(火) 23:47:540709706
2009/03/10(火) 23:50:12>>708
ありがとうございます。
std::locale::global(std::locale(""));
std::wcout.imbue(std::locale(""));
これが正解ですか?
0710デフォルトの名無しさん
2009/03/10(火) 23:55:49あってるんじゃね。
0711デフォルトの名無しさん
2009/03/11(水) 08:25:45その例としてSTLのコンテナが挙げられていました。
しかし例えば
class MyStringClass : public std::string
{〜}
とし、MyStringClassのデストラクタとして特にすることが「全くない」場合、MyStringClassを今後継承することはないものとして、それでもなお危険なのでしょうか?
std::string * p =new MyStringClass;
delete p;
とした場合はMyStringClassのデストラクタは呼ばれませんが、std::stringのデストラクタは絶対呼ばれますよね?
0712デフォルトの名無しさん
2009/03/11(水) 08:34:02いや、未定義動作になるのでそうとは限らない。
0713デフォルトの名無しさん
2009/03/11(水) 08:49:54包含、非メンバ関数で処理するのは駄目なのかい?
0714デフォルトの名無しさん
2009/03/11(水) 08:52:50ポインタの型に合わせて呼ばれるだけなのかと思ってた
0715デフォルトの名無しさん
2009/03/11(水) 09:16:550716デフォルトの名無しさん
2009/03/11(水) 09:30:14どっちだよw
0717デフォルトの名無しさん
2009/03/11(水) 11:15:45MyStringClassのデストラクタが呼ばれず未定義の結果を生じる。
0718デフォルトの名無しさん
2009/03/11(水) 11:28:080719711
2009/03/11(水) 12:52:55std::string * p =new MyStringClass;
delete p;//1
この1では未定義の動作になるのですね。
では
MyStringClass * q =new MyStringClass;
delete q;//2
や
MyStringClass x;//3
はどうでしょうか。1の使い方をしないで必ず2ないし3の使い方をするならばその限りにおいては未定義にはなりませんよね?
…もっとも、他者に1の使い方を明確に禁じる方法はありませんけど。
0720711
2009/03/11(水) 12:55:06私の状況に限れば大丈夫なんですけれど、まあ言語仕様上の疑問でして。。。
0721デフォルトの名無しさん
2009/03/11(水) 13:01:591も2も3も何れも動作は定義されている。全て安全。
未定義とか言ってる奴はど素人だから信じなくていい。
0722デフォルトの名無しさん
2009/03/11(水) 13:10:39いや1は未定義だろ。
std::string(=基底クラス)のデストラクタだけが呼ばれることが[多い]ってだけで、仕様上は未定義だろ?
0723デフォルトの名無しさん
2009/03/11(水) 13:17:230724デフォルトの名無しさん
2009/03/11(水) 13:17:28沈黙のエラー、メモリリーク、メモリ破壊、ポーティングになる
コンパイラもアロケータもエラーにしないだけ
0725デフォルトの名無しさん
2009/03/11(水) 13:20:48virtualにしてても呼ばれない可能性があるってことか?
0726724
2009/03/11(水) 13:25:58ポインタ、参照を使用してない三番は未定義じゃないわ
0727デフォルトの名無しさん
2009/03/11(水) 13:35:242は?
0728デフォルトの名無しさん
2009/03/11(水) 13:35:33規定されているよ
0729デフォルトの名無しさん
2009/03/11(水) 13:40:20未定義だよ
5.3.5
if the static type of the operand is different from its dynamic type, the static type
shall be a base class of the operand’s dynamic type and the static type shall have a virtual destructor or the behavior is undefined.
0730デフォルトの名無しさん
2009/03/11(水) 13:49:21でもコンテナとか継承を想定してないクラスを規定クラスにすんなハゲ が結論
0731デフォルトの名無しさん
2009/03/11(水) 13:52:59deleteは静的な型を元にデストラクタを呼ぶ。
>>719の1の例だと
実際の型はMyStringClassだけどdeleteに渡されるのはstd::string型なので
std::stringのデストラクタが呼ばれる。
しかしstd::stringのデストラクタは非仮想なので、>>729の通り未定義動作。
仮にstd::stringのデストラクタが仮想なら、実際の型MyStringClassのデストラクタが呼ばれ
正常に解体できる。
0732デフォルトの名無しさん
2009/03/11(水) 18:23:36大した考えなしに非virtualデストラクタを作るのはテポドンをでたらめに撃ちまくるのと同じだ
0733デフォルトの名無しさん
2009/03/11(水) 20:09:59キャストは必要ないですか?
たとえば
Hoge *foo = new Hoge(); //1行目
Hoge &bar1 = *foo; //2
Hoge &bar2 = foo; //3
bar1.func(); //4
bar2.func(); //5
は正しい?
0734デフォルトの名無しさん
2009/03/11(水) 20:12:41正しくありません。
0735733
2009/03/11(水) 20:15:230736デフォルトの名無しさん
2009/03/11(水) 20:16:330737733
2009/03/11(水) 20:30:18最初の質問の「キャストは必要ないですか?」の部分は削除します
その場合どうでしょうか?
0738デフォルトの名無しさん
2009/03/11(水) 20:41:23どちらも正しくない
0739デフォルトの名無しさん
2009/03/11(水) 20:45:05コンパイル通るかどうかくらい実験しているんだろうな?
2行目は代入していないし、ポインタでもない
代入と初期化の意味が大きく異なる典型例
0740デフォルトの名無しさん
2009/03/11(水) 22:52:412行目は1行目の結果で初期化するだけだから何も問題ないだろ。
寧ろあんたこそ実験してみたら?
>>733
そういうわけで、2行目は大丈夫。必然的に、4行目も大丈夫。
但し、参照先の寿命に要注意。余りお勧めはできない。
0741711
2009/03/11(水) 22:55:055.3.5のくだり
if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual destructor or the behavior is undefined.
を訳すと
もしオペランド(演算対象)の静的な型と動的な型が異なる場合、静的な型は「オペランドの動的な型の基底クラス」になる。
そしてその静的な型は仮想デストラクタを持つべきであり、さもなければ挙動は未定義である。
となります。
そして
std::string * p =new MyStringClass;
delete p;//1
この場合、
pの静的な型はstd::string*
pの動的な型はMyStringClass*
よって5.3.5のくだりにより未定義の動作になるのですね。ここは理解しました。
そして
MyStringClass x;//3
が未定義でない事も明らかです。Non-copyable Mixinとかのイディオムがあるくらいですし。ここも理解しました。
では
MyStringClass * q =new MyStringClass;
delete q;//2
はどちらでしょうか?
qの静的な型はMyStringClass*
qの動的な型はMyStringClass*
だとしますと問題無く動作することが仕様上保証されているのではないかと思うのですが。
0742739
2009/03/11(水) 23:00:08俺に振ってる理由がさっぱりわからん
気でも狂ったか?
0743デフォルトの名無しさん
2009/03/11(水) 23:02:02何ら問題ない。
そうじゃないと非仮想デストラクタのクラスはnewできない事になってしまう。
0744デフォルトの名無しさん
2009/03/11(水) 23:06:01参照に入れる意味が分からん
0747デフォルトの名無しさん
2009/03/11(水) 23:11:51俺の勝手な予想だが、「元々ポインタで扱ってる変数」を「引数として参照を取る関数」に渡す時とかじゃないか?
独立参照にする意味は分からんけどさ。
0748デフォルトの名無しさん
2009/03/11(水) 23:19:470749デフォルトの名無しさん
2009/03/12(木) 00:15:240750デフォルトの名無しさん
2009/03/12(木) 00:16:56どんなときに名前の付け替えをするの?
0751デフォルトの名無しさん
2009/03/12(木) 00:21:07初期化はできたけど代入は無理だった。
ロベールにも参照先の変更は�_って書いてあるから�_ってことでF/A?
0752デフォルトの名無しさん
2009/03/12(木) 00:31:31みやすくする
0753デフォルトの名無しさん
2009/03/12(木) 00:41:29typedef int(*neko)(int)
neko tama = &nyao;
neko pochi = &wan;
neko giko = &shine;
0754デフォルトの名無しさん
2009/03/12(木) 07:03:46みたいなことは普通にやるけど、
>>733
の3が合法なのか。
そりゃ内部表現は同じだろうけど、2しか使ったことがないよ。
驚いたと言うより、気持ち悪いな。
0755デフォルトの名無しさん
2009/03/12(木) 07:22:15リファレンスぜんぜん関係ないじゃん
0756デフォルトの名無しさん
2009/03/12(木) 10:38:05そんなわけない。もちろん3番はコンパイルエラーだよ。
0757デフォルトの名無しさん
2009/03/12(木) 14:10:19まてまてまて
>>733の3が合法
なわけないでしょ。もちつけ。
0758デフォルトの名無しさん
2009/03/12(木) 14:12:220759デフォルトの名無しさん
2009/03/12(木) 14:23:10JIS検索から「X3014」を検索すれば規格書を閲覧できる
0761デフォルトの名無しさん
2009/03/12(木) 14:41:390762デフォルトの名無しさん
2009/03/12(木) 14:41:540763762
2009/03/12(木) 14:43:54保護されてるのか
すまんかった
0764デフォルトの名無しさん
2009/03/12(木) 14:58:46昔は761のような方法でダウンロードできた代わりに全ページ画像だった。
今でもそれを持っているけど、やっぱり手元に保持できるのは便利だと思う。
0765デフォルトの名無しさん
2009/03/12(木) 14:59:57C++相談室 part63 まで置いてあったテンプレから。
規格の話で英語可なら [JTC1/SC22/WG21 - C++] からダウンロードできるドラフトがおすすめ。
http://pc11.2ch.net/test/read.cgi/tech/1217008269/2
> 2 名前:デフォルトの名無しさん[sage] 投稿日:2008/07/26(土) 02:51:39
> ■基本■
> [C++ FAQ]
> http://www.parashift.com/c++-faq-lite/
> http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
> Cとその仕様を比較しながらの解説なので分かりやすい。
> ***** 質問の前に必ずこの二つに目を通してください *****
> [C/C++ リファレンス]
> http://www.cppreference.com/ (英語)
> http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
> [禿 Stroustrup]
> http://public.research.att.com/~bs/
> [C++ International Standard]
> http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
> [JTC1/SC22/WG21 - C++]
> http://www.open-std.org/jtc1/sc22/wg21/
> ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
> [JIS X3014]
> http://www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014
> ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
・・・やっぱりテンプレ要るよな。次スレで復活させたい。
0767デフォルトの名無しさん
2009/03/12(木) 15:29:42そのX3014はリンク切れだった。
ググってみたら、今はこれで通じるみたい。
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
0768デフォルトの名無しさん
2009/03/12(木) 16:44:39おお、いけるね。
ありがとう!
0769デフォルトの名無しさん
2009/03/12(木) 22:27:51"4 * (3 + 2) / 2"
"1 + (1 <= -1 ? 100 : 200) * 2"
のような文字列を数値にしたいのですが。
0770デフォルトの名無しさん
2009/03/12(木) 22:29:15それぐらいの言語プロセッサ自分で設計しろ
0771デフォルトの名無しさん
2009/03/12(木) 22:34:14その規模ならboost::spiritで割と簡単にできる。
0772デフォルトの名無しさん
2009/03/12(木) 23:21:25この時、hogeのインデックス3で表される部分から3文字分の文字を削除した文字列を出力したい時は
hoge.erase(2,3);
std::cout << hoge << std::endl;
とすればよい。だがコレではhogeの内容が改変されてしまうし、何よりhogeがconstだったら通用しない。
そこで
std::cout << std::string(hoge).erase(2,3) << std::endl;
std::cout << hoge << std::endl;
という代案を考えて見たのだが、このように
「テンポラリオブジェクトに対する破壊的なメンバ関数の呼び出し」
は問題無く動作することが仕様上保証されている?
0773772
2009/03/12(木) 23:22:14>hogeのインデックス3で表される部分から3文字分
じゃなくてhogeのインデックス2で表される部分から3文字分だったか。まあ主旨には関係ないけど。
0774デフォルトの名無しさん
2009/03/12(木) 23:40:16大丈夫だったはず。
でなけりゃ std::vector<T>(v).swap(v); ができなくなってしまう。
0775デフォルトの名無しさん
2009/03/12(木) 23:47:35/V\ |
/◎;;;,;,,,,ヽ, |
_ ム::::(,,゚д゚):| J
ヽツ.(ノ:::::::::.:::::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
0776デフォルトの名無しさん
2009/03/12(木) 23:53:35その式の動作はわかるが目的がわからない
0777デフォルトの名無しさん
2009/03/13(金) 00:04:53capacity()とsize()を一致させる為の常套手段
0778デフォルトの名無しさん
2009/03/13(金) 00:06:210779デフォルトの名無しさん
2009/03/13(金) 00:10:510780デフォルトの名無しさん
2009/03/13(金) 00:14:080781デフォルトの名無しさん
2009/03/13(金) 00:21:41>>774を応用して std::vector<T>().swap(v)
0782772
2009/03/13(金) 00:26:09どうも!
0783デフォルトの名無しさん
2009/03/13(金) 01:35:470784デフォルトの名無しさん
2009/03/13(金) 09:33:090785デフォルトの名無しさん
2009/03/13(金) 09:47:55改行文字までの1行を取り出す関数なんかってありますかね?
0786デフォルトの名無しさん
2009/03/13(金) 10:06:030787デフォルトの名無しさん
2009/03/13(金) 10:11:26すいません改行文字も取り込みたいのですがどうしたら可能ですか?
0788デフォルトの名無しさん
2009/03/13(金) 10:12:41できました、ありがとうございます。
>>787は>>785の私ではありません
0789デフォルトの名無しさん
2009/03/13(金) 10:15:53なんのために?
どうしてもと言うなら std::getline() の後に結果の string の
末尾に '\n' を付け足せば同じことだと思うんだけど。
0790デフォルトの名無しさん
2009/03/13(金) 10:40:46>>789
ファイルを読み込むとき末尾が改行で終わってるのか、改行なしで終わってるのか分からなくなるんです。
0791デフォルトの名無しさん
2009/03/13(金) 12:31:10ttp://www.stat.phys.kyushu-u.ac.jp/~ryokawa/cbegin2_3/html4/cbegin_c1_s5.html#ss_triangle
ここ見てHalloWorldとか作りながらなんとなく理解してるつもりで進んできたんだ・・・
だけど、三角形の面積を求めるプログラムを作るところでエラーが出てデバッグできないんだ。
とりあえず、エラー
0792デフォルトの名無しさん
2009/03/13(金) 12:32:58コンパイルしています...
null.cpp
c:\program files\microsoft visual studio 9.0\vc\include\math.h(29) : error C2059: 構文エラー : 'extern '
c:\program files\microsoft visual studio 9.0\vc\include\math.h(29) : error C2143: 構文エラー : ';' が '{' の前にありません。
c:\program files\microsoft visual studio 9.0\vc\include\math.h(29) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
c:\program files\microsoft visual studio 9.0\vc\include\math.h(488) : error C3861: 'fabs': 識別子が見つかりませんでした
同じようなC3861エラーいっぱいだから省略
c:\documents and settings\dareka\my documents\visual studio 2008\projects\null\null\null.cpp(206) : error C2668: 'sin' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
c:\program files\microsoft visual studio 9.0\vc\include\math.h(577): 'long double sin(long double)' の可能性があります。
c:\program files\microsoft visual studio 9.0\vc\include\math.h(529): または 'float sin(float)'
引数リスト '(double)' を一致させようとしているとき
c:\documents and settings\dareka\my documents\visual studio 2008\projects\null\null\null.cpp(209) : error C2065: 'cout' : 定義されていない識別子です。
c:\documents and settings\dareka\my documents\visual studio 2008\projects\null\null\null.cpp(214) : error C2065: 'endl' : 定義されていない識別子です。
場所が違うだけの同じエラーいっぱいだから省略
null - エラー 58、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
そういえば上に書いたHP見ながら作ったHelloworldもusing namespaceがなくて困ったな・・・
もしかして情報ふるいのか?
0793デフォルトの名無しさん
2009/03/13(金) 12:45:53VC2008だよね?
C++以外の言語がどのくらいの経験者か分からないけど、コンパイルエラーは最初のものを見るのが基本。
構文エラー : 'extern '
これが最初だから最も怪しい。
どうせ
'extern 〜で;が抜けてるとか?
0794デフォルトの名無しさん
2009/03/13(金) 12:55:46#inclue <math.h>
の前の行に何か変な文字が入ってるとかないか?
あるいは直前のヘッダにエラーがある(最後のセミコロンが抜けてる)とか
0795デフォルトの名無しさん
2009/03/13(金) 13:21:26よくわからんが、ファイル名変えてみたら?
0796デフォルトの名無しさん
2009/03/13(金) 13:23:270797791 + 792
2009/03/13(金) 13:28:02VC++2008をつかってて、ソースはいちおう写し書き
#include "stdafx.h"
#include <iostream>
using namespace
#include <math.h>
void main()
{
double deg,a, b;
// a, bは三角形の2辺の長さ(m)。degはその間の角度(度)
a = 1.6, b = 1.6, deg = 90;
double rad;
rad = deg * 3.1415927 / 180;
// sin()の引数の単位はラジアンなので180度で割ってπを掛ける
double s;
s = a * b * sin(deg * 3.1415927 / 180;) / 2;
// ここで面積を計算している。
cout << "2辺の長さが";
cout << a << "(m)と";
cout << b << "(m)で、" << endl;
cout << "その間の角度が" << deg
<< "(度)の三角形の面積は";
cout << s << "(平方m)" << endl;
}
VC++入れなおせば直ったりするのかな・・・
0798デフォルトの名無しさん
2009/03/13(金) 13:30:460799デフォルトの名無しさん
2009/03/13(金) 13:31:180800デフォルトの名無しさん
2009/03/13(金) 13:32:48にして
s = a * b * sin(deg * 3.1415927 / 180;) / 2
この行180の後にセミコロンになってる
名前空間指定してるんだけどどの名前空間使うか指定してないっていう;
0801791 + 792
2009/03/13(金) 13:58:42エラーログだけじゃなくて、ソースも出さないと駄目なんだな・・・
みんなありがとう、嬉しくてニヤニヤしたよ。
これからバイトだけど、帰ってきたらusing namespaceについて調べてみる。
ちなみに、引数と関数ってどういう意味なんだろうか。
>引数(ひきすう)とは関数に与える値のことです。当然ですが引数の数は関数によって違います。関数は実行されると値を返します。この値を戻り値といい、関数が示す値になります。例えば
>
> double y;
> y = log(1.0);
>
>と書いた場合、1.0が引数で、yに戻り値(多分0だろう。)が代入されます。
791のアドレスに上の説明がされてるけどさっぱり・・・
引数と関数はどういう奴なのか詳しく解説してるところはない?
0802デフォルトの名無しさん
2009/03/13(金) 14:10:47つーか、初心者スレを覗いてみたらどうだ? もっとましな入門サイトを教えてくれるかもしれないぞ。
0803デフォルトの名無しさん
2009/03/13(金) 14:12:21中学の数学の教科書に書いてある。
0804793
2009/03/13(金) 14:20:39>ちなみに、引数と関数ってどういう意味なんだろうか。
>#include <math.h>
この質問から察するに、C++以外の言語の経験もあまり無いのか?
サイトを見るより書籍を買う方がオススメだよ。
安い書籍でも中古でもいいから入門書を買って来て通読した方が良いかと。
0805793
2009/03/13(金) 14:22:58>引数と関数はどういう奴なのか詳しく解説してるところはない?
引数には仮引数と実引数がある。
引数 - Wikipedia
http://ja.wikipedia.org/wiki/%E5%BC%95%E6%95%B0
ここで良いんじゃん。分かりやすい。
関数は…まあC言語の入門書買っておいで。
0806793
2009/03/13(金) 14:30:08数学の関数とプログラミングの関数は、似ている様で全く意味が違うだろ。
数学では変数の値は絶対に変わることはない。
x=1な世界でしばらくしてx=2になっていることはない。
同様に関数は写像であり、それ以上でもそれ以下でもない。
0807デフォルトの名無しさん
2009/03/13(金) 14:39:080808デフォルトの名無しさん
2009/03/13(金) 15:12:240809デフォルトの名無しさん
2009/03/13(金) 15:17:420810デフォルトの名無しさん
2009/03/13(金) 16:17:13全く別のものに同じ名前はつけないからね。
同じ名前である以上なんらかの共通点がある。
0811デフォルトの名無しさん
2009/03/13(金) 16:17:130812デフォルトの名無しさん
2009/03/13(金) 16:23:01つ定積分
0813デフォルトの名無しさん
2009/03/13(金) 17:20:03定積分でもxの値は変わってないよ。
高校数学でx=aからbまで変わっている「かのように」思えるのは、仕方なしにそう説明しているだけで。
(歴史的経緯もあるし、変わっているように考えた方が分かりやすいんだろうがね。)
リーマン積分でもルベーグ積分でもそれ以外の気持ち悪い積分でも変わっているわけではない。
0814デフォルトの名無しさん
2009/03/13(金) 17:48:020815デフォルトの名無しさん
2009/03/13(金) 17:51:150816813
2009/03/13(金) 18:04:05数学に実装なんて用語はない(定義や公理のことかい?)。
変数種類 x なんて用語は数学にもプログラミングにもない。
…まあいいよ、知りたきゃルベーグ積分でググれ。それか数学スレいって質問すればよか。
俺は単に引数と関数が中学の数学の教科書に書いてあるって言った>>803に反対したまでで、これ以上汚す気になれない。
0817791 + 792
2009/03/13(金) 21:13:12初心者スレって★初心者にVisual C++を教えるスレ★ Part33で合ってるかな?
そこを覗いたら猫でも分かるプログラミングってサイトが紹介されてた。
ちょっくら漁ってみるよ。ありがとう。
>>806
親切にどうもありがとう。
Wikipediaの奴は、引数を見る前に関数を見たら少し分かった気がするよ。
『引数 意味』で調べたときに仮引数と実引数が出てきて困ったけど
ちょっと理解できたから良かった。
書籍はもう少ししてから買ってみるよ。
黒い画面とにらめっこしなくなるくらいまでは、その辺のサイトで覚えたいと思ってる。
とりあえず、みんなありがとう。
0818デフォルトの名無しさん
2009/03/13(金) 22:46:58変数の値が変わらないなんてマヌケなこと言ってるのは、関数型言語を最近触りだけ覚えたど素人だろ?
数学的にもプログラミング的にも頭悪すぎる。
知ったかぶる前にちゃんと勉強しろ。
0819デフォルトの名無しさん
2009/03/13(金) 22:53:281+1は1+1であるっていう定義とともに+は足し算である。って実装があるって考え方も・・・定義ともいえるが
0820デフォルトの名無しさん
2009/03/13(金) 23:01:120821デフォルトの名無しさん
2009/03/13(金) 23:40:22数学の(自由)変数というのは定義域内のどの値でもよいという存在
特定の値を持っていてそれが動くというより、ある範囲そのものというイメージの方が合ってる
0822デフォルトの名無しさん
2009/03/13(金) 23:44:03変数が範囲そのものというイメージは捨てた方がいい。明らかに間違い。
0823デフォルトの名無しさん
2009/03/13(金) 23:48:14変数は元だけど、変数である限りはどの元でもいいんだから、
変数を使って何かを表現したときはその定義域全体に対しての表現になるわけだろ
その意味では範囲と思って間違いじゃないと思うんだけど
0824813
2009/03/14(土) 00:08:58>>変数の値が変わらないなんてマヌケなこと言ってるのは、関数型言語を最近触りだけ覚えたど素人だろ?
なんか激しい誤解をしている様だが、とりあえず、この話題を頭から一語一句もう一度読んでくれ。
C/C+の変数は確かに内容が変わりうる。俺の書き込みの中でそれに反対した場所は1箇所もないよ。
>>819
>>1+1は1+1であるっていう定義とともに+は足し算である。って実装があるって考え方も・・・定義ともいえるが
「公理系」の事を言いたいのかな?。
例えば、かの選択公理を容認する公理系(ZFC)と認めない公理系とか、有名どころではユークリッドの平行線の公理を認める公理系と認めない公理系とか。
その意味では確かにプログラミングの実装に似ているとも言えるな。
>>820
方程式2x=aでもxが変数でaが定数という言い方をするとおり、x=a/2が同値。決まる。
要は変数xとは「着目している」数ないし数に類する集合の元ってことだな。
0825デフォルトの名無しさん
2009/03/14(土) 00:15:450826デフォルトの名無しさん
2009/03/14(土) 00:53:59帰れ。ど素人。
>>806がお前の書き込みかどうかは知らんが、>>806は
「数学では変数の値は絶対に変わることはない。」
と言ってる大バカ者。この下らん議論はそこから始まってる。
少なくとも>>806はバカ。以上。
0827デフォルトの名無しさん
2009/03/14(土) 01:14:32だからスレ違いは子ねってつってんだろ!
顔を真っ赤にしてそんなに書きこんでんじゃねぇよ
0828デフォルトの名無しさん
2009/03/14(土) 01:45:04eof() 見ればいいんじゃないの?
0829デフォルトの名無しさん
2009/03/14(土) 01:47:560830デフォルトの名無しさん
2009/03/14(土) 01:50:440831デフォルトの名無しさん
2009/03/14(土) 03:12:410832デフォルトの名無しさん
2009/03/14(土) 10:26:56教えてください。
0833デフォルトの名無しさん
2009/03/14(土) 10:31:540834デフォルトの名無しさん
2009/03/14(土) 10:47:34取り調べで「俺はデストラクタになりたかった」って言えばいいよ。
0835デフォルトの名無しさん
2009/03/14(土) 11:37:190836デフォルトの名無しさん
2009/03/14(土) 15:23:040837デフォルトの名無しさん
2009/03/14(土) 15:26:450838デフォルトの名無しさん
2009/03/14(土) 15:33:04クソフイタw
つい…かっとなって…gotoしてしまった。
…気がついたら… 怖くなって逃げました。
0839デフォルトの名無しさん
2009/03/14(土) 16:00:400840デフォルトの名無しさん
2009/03/15(日) 10:07:40Javaでいうjava.util.Scanner.useDelimiter(**)みたいな使い方ってできない?
0841デフォルトの名無しさん
2009/03/15(日) 19:10:200842デフォルトの名無しさん
2009/03/15(日) 19:13:550843デフォルトの名無しさん
2009/03/15(日) 19:20:040844デフォルトの名無しさん
2009/03/15(日) 19:23:110845デフォルトの名無しさん
2009/03/15(日) 19:27:550846デフォルトの名無しさん
2009/03/15(日) 19:30:250847デフォルトの名無しさん
2009/03/15(日) 19:34:10Foo() : _bar(bar) {}
こうしてしまう。
0848デフォルトの名無しさん
2009/03/15(日) 19:50:02メンバ変数はグローバルスコープではないけど、
あるバージョンの処理系から急にキーワードとして使われた場合に問題になる
0849デフォルトの名無しさん
2009/03/15(日) 19:55:56先頭アンダースコアのメンバ変数ならその心配は無いよ。
まぎらわしいから使うべきじゃないのは確かなんだけどね。
0850デフォルトの名無しさん
2009/03/15(日) 19:56:26俺は
public constなデータメンバは先頭大文字、
privateなデータメンバは末尾にアンダースコア、
引数とかは先頭小文字で末尾アンダースコアなし
って決めてるからかぶることはないけどね
0851デフォルトの名無しさん
2009/03/15(日) 19:57:26だから _bar というキーワードが追加された時に
コンパイルが通らなくなると言っとるに
0852デフォルトの名無しさん
2009/03/15(日) 19:58:51問題ないよ
0853デフォルトの名無しさん
2009/03/15(日) 20:05:50> 別にbar(bar)でも問題ない
試してみた、うわあああ!!!!
俺はこの数年間なにをしていたんだ!!!
ずーっともやもやしながらアンダースコアつけてたw
0854デフォルトの名無しさん
2009/03/15(日) 20:07:44_bar は処理系独自のキーワードには使えないよ。 __bar ならアリだけど。
0855デフォルトの名無しさん
2009/03/15(日) 20:17:17拡張ありだと_hoge/__hoge(下線1つと2つ)の両方を認識するが、
拡張なしだと下線2つの__hogeのしか認識しないようにきちんとなっている。
0856デフォルトの名無しさん
2009/03/15(日) 20:18:05HP-Unixじゃ受け付けないから禁止
0857デフォルトの名無しさん
2009/03/15(日) 20:38:40- 頭にアンダースコアは一律禁止
- 2個連続したアンダースコアは一律禁止
としてしまうのが安直で簡単だとおもう
0858デフォルトの名無しさん
2009/03/15(日) 20:55:47んなかたわの環境なんかどうでもいいよ。あれもこれも中途半端な実装なんだから。
0859デフォルトの名無しさん
2009/03/15(日) 21:04:08接頭辞ってオムニ補完使うときに便利なんだよね
0860デフォルトの名無しさん
2009/03/15(日) 22:59:18g_
何も悪くない。
0861デフォルトの名無しさん
2009/03/15(日) 23:01:19MyClass_pp_
0862デフォルトの名無しさん
2009/03/15(日) 23:02:50拡張ありでダメならダメだってことだろう・・・
0863デフォルトの名無しさん
2009/03/15(日) 23:05:45メンバ変数に印付いてないと
どれがメンバ変数なのか分かり辛いし
ローカル変数名とうっかり被ったりすることもあるので
結局メンバ変数には何らかの印を付けた方がいい。
メンバ変数に何の印も無いソース読んだ事あるけど、かなり悲惨だった。
一人で管理するなら何が何なのか把握してるんだろうけどさぁ・・・。
bar(bar) を利用するのは簡単な構造体のみにしてくれ。
0864デフォルトの名無しさん
2009/03/15(日) 23:23:04規格を逸脱したコンパイラベンダの独自拡張なんか気にしてたら何も安心して書けないぜ。
極端な話、 MS が将来の言語拡張で a を独自のキーワードにしない保証はあるのかい?
0865デフォルトの名無しさん
2009/03/15(日) 23:49:49するはずないだろ。具体例が極端すぎる
0866デフォルトの名無しさん
2009/03/15(日) 23:52:28_bar なら心配だけど bar なら安心だと思うんでしょ?根拠もなしに。
0867デフォルトの名無しさん
2009/03/15(日) 23:52:360868デフォルトの名無しさん
2009/03/15(日) 23:53:14保証はあるのかという問いへの答えになってないぞ
0869デフォルトの名無しさん
2009/03/15(日) 23:55:34アンダースコアに続いて英大文字なら規格の許す範囲内。
0870デフォルトの名無しさん
2009/03/16(月) 00:05:18古いソースは use namespace で逃げるようにしようや
0871デフォルトの名無しさん
2009/03/16(月) 00:21:54という式は、ヒープに確保しきれなかった場合など、問題が生じればstd::bad_alloc例外が投げられるんだよね?
mallocならNULLが返される。
…では、そうではなくて
VeryLargeClass vlc[BIGNUM];
の様に宣言した結果、コールスタックに確保しきれなかった場合などは何が起こるの?
0872デフォルトの名無しさん
2009/03/16(月) 00:22:03わざと混合させてみた。
0873デフォルトの名無しさん
2009/03/16(月) 00:25:13まあ現実的には、シグナルが飛んだり (Unix系) とか独自の例外が投げられたり (Win)とか。
基本的に、そうなることはC++例外が投げられるより想定外の事態だね。
0874871
2009/03/16(月) 00:31:18ほほう、すなわちそんな事は滅多に起こらないと考えて良いの?
…それとも起こらないように過度にでかい領域はnewでヒープに確保するように気を配るべき?
0875デフォルトの名無しさん
2009/03/16(月) 00:38:21プログラム時に考慮するのは当然
0876デフォルトの名無しさん
2009/03/16(月) 00:39:17#include <stdio.h>
class Test
{
private:
int value;
public:
Test(void);
void getValue(int*);
};
Test::Test(void)
{
value = 10;
}
void Test::getValue(int* value)
{
value = &(this->value);
}
int main(void)
{
Test test;
int* value;
test.getValue(value);
printf("%d\n", *value);
}
0877デフォルトの名無しさん
2009/03/16(月) 00:47:05「_+小文字」は使用が許されているが 「_+大文字」は不可なことを示す良い例だね
ためになる
「_+小文字」でメンバ変数名を定義するぞ!
0878デフォルトの名無しさん
2009/03/16(月) 00:50:56やめといたほうがいいぞ。
それやってると >848,851 みたいな人と無用な議論をする破目になる。
0879デフォルトの名無しさん
2009/03/16(月) 00:52:17説明するのも面倒だから、こうすりゃ動くってのだけ書いておく。
void Test::getValue(int* value)
{
*value = this->value;
}
int main(void)
{
Test test;
int value;
test.getValue(&value);
printf("%d\n", value);
}
0880デフォルトの名無しさん
2009/03/16(月) 01:00:20C++は、一人で完結する実験や趣味プログラムでしか使わないからOK
0881デフォルトの名無しさん
2009/03/16(月) 01:24:56なんで>>876のプログラムじゃダメなんすか。Cの考え方では問題ないですよね。C++特有の問題なんでしょうか。
0882デフォルトの名無しさん
2009/03/16(月) 01:27:060883デフォルトの名無しさん
2009/03/16(月) 01:47:10{
*value = &(this->value);
}
int main(void)
{
Test test;
int* value;
test.getValue(&value);
printf("%d\n", *value);
}
0884デフォルトの名無しさん
2009/03/16(月) 01:57:440885デフォルトの名無しさん
2009/03/16(月) 02:08:35class Base
{
public:
virtual void foo()=0;
}
class Derived1 : public Base
{
int x;
public:
void foo();
}
class Derived2 : public Base
{
int x;
int y;
public:
void bar():
}
//関数の実装やらは省略します
int main()
{
Base *pBase = new Derived2;
pBase->bar();//としたい
}
Baseにbarの純粋仮想関数を追加しても当然ながらDerived1に影響がでます。
この場合どうすればよいのでしょうか?そもそも純粋仮想関数を使うべきではないのでしょうか?
ご教示下さい。
0886885
2009/03/16(月) 02:13:11void foo();
が抜けてました。
0887デフォルトの名無しさん
2009/03/16(月) 02:22:49そうだとしたら、BaseとDerived2の間に純粋仮想関数barを持つ抽象クラスを挟むとか、継承関係を見直した方がいいんじゃない。
0888885
2009/03/16(月) 02:32:16大変参考になりました。ありがとうございました。
0889デフォルトの名無しさん
2009/03/16(月) 02:33:380890デフォルトの名無しさん
2009/03/16(月) 02:36:030891デフォルトの名無しさん
2009/03/16(月) 02:40:430892デフォルトの名無しさん
2009/03/16(月) 02:45:140894デフォルトの名無しさん
2009/03/16(月) 04:57:44あるHPに掲載されていたものなのですが動かないので疑問に思いました
【多分間違い】
#include <stdio.h>
int main(void)
{
printf("Hello, world");
return 0;
}
【たぶん正解】
#include <stdio.h>
int main (void)
{
printf("Hello World\n");
return 0;
}
0895デフォルトの名無しさん
2009/03/16(月) 05:00:510896デフォルトの名無しさん
2009/03/16(月) 05:42:27"\n"の有無の問題ではない事は確か。
エラーの内容を書いてみたら良いと思うよ。
0897デフォルトの名無しさん
2009/03/16(月) 05:46:51分岐直後にポインタキャストすればいいんじゃないかな
0898デフォルトの名無しさん
2009/03/16(月) 12:01:15折角C++なんだからポインタ使わず参照にしろよ。
# って書くとポインタ原理主義者が怒りそうな気はするw
0899デフォルトの名無しさん
2009/03/16(月) 13:47:48>なんで>>876のプログラムじゃダメなんすか。Cの考え方では問題ないですよね。C++特有の問題なんでしょうか。
C言語で書かれているようにしか見えないが、まあともかくどっちでもダメだよ。
試してみれば分かる。そもそもコンパイラでコンパイル時に変数が未使用だとのwarningが出るのでは?
もう解決しているみたいだけど一応言っておくと、
void Test::getValue(int* value)
{
value = &(this->value);
}
これは「int型へのポインタ」型の変数valueがコピー渡しされている。
コピー渡しである以上、ローカル(=getValue内でスコープ限定)なポインタvalueの値がどれだけ変わろうと、
呼び出し元(main関数)から見れば何も起こっていないも同然。
…まあミスを誘発した原因の1つとして、仮引数と実引数で同じ名前を使っていることじゃない?
0901デフォルトの名無しさん
2009/03/16(月) 15:05:260902デフォルトの名無しさん
2009/03/16(月) 15:23:17勝手に型変換されるのが嫌な場合じゃない?
例えば
int型を受け取るMyClassのコンストラクタMyClass::MyClass(int num)があったとして、
void foo(MyClass hoge);
という関数に間違ってfoo(42)と記述しちゃった場合にも暗黙に
foo(MyClass(42))
とキャストされるからコンパイルエラーにならない。
0903デフォルトの名無しさん
2009/03/16(月) 15:37:30それが出来ることがどうしてダメなのか、もっともらしい理由が知りたいんです。
ただ、そういう書き方も出来るというだけじゃ、全然問題にならないじゃないですか
0904デフォルトの名無しさん
2009/03/16(月) 15:39:000905デフォルトの名無しさん
2009/03/16(月) 15:51:53std::vector<std::string> v = 5; //vは5個の要素を持つと指定
まずいことが起こる可能性を少しでも排除するためとか。
void f(std::auto_ptr<int> const& p, int x);
int g();
f(new int, g());
引数並びの評価順序は決まっていないので、
例えばnew int→gの呼出→auto_ptr<int>の構築→fの呼出という順番だったとき、
gの中で例外を投げられるとnewした分が漏れてしまう。
これを少しでも防ぐためにも、explicitが使われている。スマートポインタは変数で構築しろと。
まあ、それでもf(std::auto_ptr<int>(new int), g());と書けばコンパイラは通してしまうのだけど。
0906902
2009/03/16(月) 16:03:16>それが出来ることがどうしてダメなのか
>問題に感じられない
別にダメじゃないよ。むしろそっちの方が分かりやすいこともある。std::string(const char *)とかはexplicitじゃないしね。
ただ前後関係というか文脈上(見た目上)コンストラクタで勝手にキャストされるととても気持ち悪い事がありえるので、
その気持ち悪い状況の時にexplicitをつける。
具体的には…
…と思ったが>>905が書いてくれているらしいな。
0907デフォルトの名無しさん
2009/03/16(月) 19:58:38float4つのベクトルを表すD3DXVECTOR4という型があるんだが、
これはfloat*を返すoperator float*()という関数と、
float*を引数に取るexplicitでないコンストラクタがある。 機能は推して知るべし。
んで、この型では、次のような式がエラーにならない。
D3DXVECTOR4 v;
v = v + 1; // ベクトルにスカラーを足しているのにエラーにならない!
何でこんなことになったかというと、まずD3DXVECTOR4には、当然intとのoperator+()は定義されていないから、
コンパイラは暗黙の型変換を探す。 そこで見つかるのがoperator float*()。
ポインタと整数の加算は合法だから、右辺はfloat*型のポインタになる。
んで、次に代入の部分が評価される。
D3DXVECTOR4にはfloat*を引数に取るoperator=()はないから、やっぱり別の暗黙変換を探しに行くんだけど、
ここでたまたまfloat*を引数に取るexplicitでないコンストラクタがあるもんだから、
右辺がD3DXVECTOR4に変換されてしまう。
結果的に上記の式は、メモリのアクセスエラーを発生させてしまうことになる(しかも検知しにくいたちの悪いエラー)。
要するに、explicitなしのコンストラクタと暗黙の型変換を行うoperatorは、併用すると思わぬところで危険な動作を引き起こすってことだ。
0908デフォルトの名無しさん
2009/03/16(月) 21:52:30うわー。ネタかと思って試してみたら、ホントだった。
警告レベルを最高(W4)にしても、VC++2008で警告出さずにコンパイルできちゃう。
DirectXの設計ミスじゃないのか。これ。
せめて、DXD3DXVECTOR4(const float *begin, const float *end)くらいに
できなかったのかなあ。標準ライブラリとも整合性ないし。
0909デフォルトの名無しさん
2009/03/16(月) 23:34:490910デフォルトの名無しさん
2009/03/16(月) 23:58:590911デフォルトの名無しさん
2009/03/17(火) 00:54:27どうするのが効率良いでしょうか?
template<typename A0, typename A1, typename A2> void f( A0& a0, A1& a1, A2& a2);
template<typename A0, typename A1, typename A2> void f(const A0& a0, A1& a1, A2& a2);
template<typename A0, typename A1, typename A2> void f( A0& a0, const A1& a1, A2& a2);
template<typename A0, typename A1, typename A2> void f(const A0& a0, const A1& a1, A2& a2);
……
とかboost::preprocessorでやっていたら組合せ爆発で死にました……
引数の総当たりなんてやるもんじゃないなぁ。
0912デフォルトの名無しさん
2009/03/17(火) 01:06:550913911
2009/03/17(火) 01:39:11ライブラリ(Visitor)なのでconst & と & の両方構える必要があります。
決め打ちだと簡単だけど、利便性が格段に落ちるからなぁ……
0914デフォルトの名無しさん
2009/03/17(火) 02:05:350915デフォルトの名無しさん
2009/03/17(火) 02:26:33template<A,~A[1]>f(A a0~ , A [1]);
template<A,~>f(A a0,~){typeof(a0) xx[1] x; f(a0,a1,a2,x)}
0916911
2009/03/17(火) 02:51:31boostぐらいしか使用しないポータブルなライブラリを作っているので、
まずはboost::preprocessorでチャレンジしました。
>915
それは何でしょう?コンパイル失敗しましたが……
0917デフォルトの名無しさん
2009/03/17(火) 07:08:160918デフォルトの名無しさん
2009/03/17(火) 07:29:350919デフォルトの名無しさん
2009/03/17(火) 09:19:58&&って何?
&&hogeみたいに使う新しい演算子が出るの?
0920デフォルトの名無しさん
2009/03/17(火) 09:27:45rvalue referenceでぐぐれ
0921911
2009/03/17(火) 20:41:14いや、ダメですね。委譲する関数次第では左辺値参照で扱う必要があるので、
右辺値参照決め打ちにすることは出来ません。
const&と&を自動で切り替えるテンプレートがあればいいのですが……
0922デフォルトの名無しさん
2009/03/17(火) 22:05:43やりたいことはbindとかfunctionのようにほかへ引数を渡すような感じだよね?
それなら、perfect fowarding問題として知られていて、
右辺値参照で解決を期待されている事柄の1つ。
詳しくはstd::forwardでググるといいと思う。
0923911
2009/03/17(火) 22:52:05とりあえず8変数までは何とか回っているので、しばらくはこれで凌ぐことにします。
それ以上の変数が必要になったらテンプレートクラス使って明示指定することにしよう……
0924デフォルトの名無しさん
2009/03/18(水) 00:05:02×テンプレート関数
○関数テンプレート
×テンプレートクラス
○クラステンプレート
0925デフォルトの名無しさん
2009/03/18(水) 00:10:55関数テンプレートを具体的に指定して出来た関数がテンプレート関数で、
クラステンプレートを具体的に指定して出来たクラスがテンプレートクラスだっけ?
0926911
2009/03/18(水) 00:59:42あれ?そうだったっけ……ということで標準を見てみたけど、確かにtemplate function / classという
用例はほとんど無いね。 non-template〜〜ばっかだった。
0927デフォルトの名無しさん
2009/03/18(水) 01:03:15単に関数、クラスでいいと思う。
型を与えたテンプレートは、型を明記した同様の関数/クラスと同じ振る舞いをするから、区別する必要は無い。
テンプレートを具体化(instantiate)した事を強調したければ、具体化関数/具体化クラスと呼べるのかな。あんまりしっくりこないけど。
0928911
2009/03/18(水) 01:03:30ちなみに標準だと
Template instantiation
instantiated function
instantiated class
ね。
0929デフォルトの名無しさん
2009/03/18(水) 01:05:230930927
2009/03/18(水) 01:05:520931デフォルトの名無しさん
2009/03/18(水) 01:16:26instantiatedは「具体化」ではなく「実体化」が素直だろ。
0932デフォルトの名無しさん
2009/03/18(水) 01:21:04テンプレートに対してパラメータを与えることとは意味が違わない?
0933デフォルトの名無しさん
2009/03/18(水) 01:25:030934デフォルトの名無しさん
2009/03/18(水) 17:00:33という関数があった時に、
foo("hoge");
と呼び出したらどうなりますか?
コンパイル時に何の警告もでないのですが、
「std::stringのconst char*が受け取れるコンストラクタ」でキャストされているのですか?
0935934
2009/03/18(水) 17:02:20void foo(std::string str){}
の場合はキャストされますよね?
void foo(std::string &str){}
としたら未定義の動作になっちゃったりとかしますか?
0936デフォルトの名無しさん
2009/03/18(水) 17:13:50やってみればわかる
0937デフォルトの名無しさん
2009/03/18(水) 17:16:110938デフォルトの名無しさん
2009/03/18(水) 17:35:323コードとも試してあります。
bccはvoid foo(std::string &str){}で勝手に一時変数を作りました。
g++はコンパイルエラーになりました。
その他の2コードは特に何も問題無いようです。
>>937
暗黙の型変換ですか。
明示的な型変換はキャストと同義ですか?
0939デフォルトの名無しさん
2009/03/18(水) 18:07:27下手にinlineとか付けないでもうコンパイラの最適化まかせにしちゃっても大差ないと
聞いた。
みんなはどう考える?ぜひ意見を聞きたい。
0940デフォルトの名無しさん
2009/03/18(水) 18:19:330941デフォルトの名無しさん
2009/03/18(水) 18:26:07ヘッダに書いたメンバ関数(クラス定義の外)は、inlineが必要なんだよね?
0942デフォルトの名無しさん
2009/03/18(水) 18:28:12自分は、最適化なんて意識せず、
returnだけの1行とかmin/max並に単純なものなど、
ヘッダに書きたければinlineを付けるという基準でやっている。
0943デフォルトの名無しさん
2009/03/18(水) 18:33:242) ヘッダには一切、余計なincludeをしない
な奴は俺と友達。
0944デフォルトの名無しさん
2009/03/18(水) 18:39:42必要なんて何処に書いてあるんだ?
0945デフォルトの名無しさん
2009/03/18(水) 18:40:36http://pc11.2ch.net/test/read.cgi/tech/1231640498/
0946デフォルトの名無しさん
2009/03/18(水) 18:45:57リンケージ的になにもなしじゃまずいだろう
0947デフォルトの名無しさん
2009/03/18(水) 19:38:360948デフォルトの名無しさん
2009/03/18(水) 20:42:44>ヘッダに書いたメンバ関数(クラス定義の外)
そんなことしたら、他のファイルでそのヘッダをインクルードしたら定義が重複してるぜっていうエラーがでないか?
0949デフォルトの名無しさん
2009/03/18(水) 20:44:49なるほど、あのふざけた重複スレをPart67に仕立て上げたのか。
0950デフォルトの名無しさん
2009/03/18(水) 21:00:030951デフォルトの名無しさん
2009/03/18(水) 21:08:26ああinlineすれば大丈夫になるのか。意味不明なレスしてすまんかった。
0952デフォルトの名無しさん
2009/03/19(木) 00:56:02NULLと比較するとコンパイルエラーになります。
どうすればよいのでしょうか?
0953デフォルトの名無しさん
2009/03/19(木) 01:00:420954デフォルトの名無しさん
2009/03/19(木) 01:01:05参照は有効な物の参照しかとらないようにコーディングすべき。
無効なポインタと同じで、無効な参照は検出不可能。
ちなみにNULLはポインタだからコンパイルエラーになる。
0955デフォルトの名無しさん
2009/03/19(木) 01:03:570956デフォルトの名無しさん
2009/03/19(木) 01:17:290958デフォルトの名無しさん
2009/03/19(木) 01:22:300959デフォルトの名無しさん
2009/03/19(木) 01:25:31classでも構造体でも、intでも何でも良いのでキーにしたmapコンテナを作り
そのclassなり構造体の参照を返すコードを、キー指定のmapコンテナを記述です。
0961デフォルトの名無しさん
2009/03/19(木) 01:34:00反復子を返したいのかね
0962953,958
2009/03/19(木) 01:45:03うん。
エスパーするとmapを包含したクラスがあって、map::findの結果を参照で返すメソッドがあるのかな。
そうだとしたら、参照は無効な状態を表すことができないので、無効である(見つからなかった)ことを表現するなら例外を投げるしか無い。
戻り値がポインタならNULLを返すという手はある。
map::findで得られた反復子の有効性を判断したいのであれば、map::end()と比較して、同じなら無効。
0963デフォルトの名無しさん
2009/03/19(木) 01:54:44struct AB {
int a;
int b;
};
std::map< int, AB > global;
void SetVal( int key, int a, int b )
{
global[ key ].a = a;
global[ key ].b = b;
}
AB& GetVal( int key )
{
return global[ key ];
}
こんなソースの場合です。
0964デフォルトの名無しさん
2009/03/19(木) 02:03:40global[key] と書くと、
- key に等しいキーを持つエントリがない場合はそのエントリを作成した上で、
- そのエントリの値への参照を返す
という動作をする。
したがって、そのコードは無効な参照を返さない。
0965デフォルトの名無しさん
2009/03/19(木) 02:07:35と言うと、つまりエラーチェックは出来ない訳ですね?
未初期化の実体が返ってくると、、
訳あって、その処理コードは使うだけで手を入れる事が不可なんです…
あー、コード直したい
0966デフォルトの名無しさん
2009/03/19(木) 02:13:35それはうざいコードだ。
0967デフォルトの名無しさん
2009/03/19(木) 02:16:43globalが本当にglobalならexternで無理矢理参照してしまうとか(冗談です)
0968デフォルトの名無しさん
2009/03/19(木) 02:21:18登録関数をラッパーして、キーをベクターコンテナに登録
取得関数をラッパーして、キーを検索、見つかったら本当の取得関数コール
で行きます…
諸兄の皆様方は、何か良い案は有りますでしょうか?
条件は、ヘッダーインクルードだけで使うのみ、です。
0969デフォルトの名無しさん
2009/03/19(木) 02:22:18operator[]は値が無い場合はデフォルトコンストラクタで初期化する。
無いことを確認したいのならばmap::findを使うべきですな。
>訳あって、その処理コードは使うだけで手を入れる事が不可なんです…
グローバル変数使っているようなコードに依存するのもなんだけど、自分のところだけは
アダプタ使ってアクセスするようにしたら?
やっつけコード
template<typename AB>
struct Adapter {
static std::map<int, AB> global() { return global; };
void value(int key, int a, int b) {
std::map<int, AB>& m(global());
m[key].a = a;
m[key].b = b;
};
AB& value(int key) {
std::map<int, AB>& m(global());
std::map<int, AB>::iterator i(m.find(key));
if (i == m.end()) throw "Error";
return *i;
};
};
0970デフォルトの名無しさん
2009/03/19(木) 02:23:36(だからチェック機能が欲しいのです)
0971デフォルトの名無しさん
2009/03/19(木) 02:26:38ありがとうございます。
ただ、globalとは、例に出すのに私が付けた変数名なだけでして…
ようは、ソースは見れるのですがヘッダーと***.aなのです。
0972デフォルトの名無しさん
2009/03/19(木) 02:26:54>968 をするなら std::setの方が良いよ。
0973デフォルトの名無しさん
2009/03/19(木) 02:34:11こちらも、ありがとうございます。
重複キーの場合どうするか皆と話して、かつ実際の使用されるキーの個数も視野にいれ
検討対象とさせて頂きます。
0974デフォルトの名無しさん
2009/03/19(木) 02:42:080975デフォルトの名無しさん
2009/03/19(木) 03:02:29最初は中できとんと処理されてると思ったのですが、共同が変になる場合があり
ソースもらって見た瞬間に理解したんですが…
作った側曰く、少しでも速度を稼ぐため、エラーチェック無し、正しく使うのが前提との事です。
(実際の取得メソッドはインライン関数です)
0976デフォルトの名無しさん
2009/03/19(木) 03:08:55しかし、少しでも速度を稼ごうとする奴がこんなコード書くかなぁ。
global[ key ].a = a;
global[ key ].b = b;
0977デフォルトの名無しさん
2009/03/19(木) 03:16:08コードの見た目で処理が減ってるように見えるだけで、速度を稼ぐことにはなって無いよ。
内部的には find() の戻り値をチェックするのと同等の分岐が必要になる。
0978デフォルトの名無しさん
2009/03/19(木) 07:33:11その方法で良さそうというか、常套手段。
あるいは、mapに登録するクラスのデフォルトコンストラクタに無効フラグを設定するか。
その上で、元のクラスを変更するよう訴え続けるべし。
0979デフォルトの名無しさん
2009/03/19(木) 08:09:01ふと思ったんだけどさ、GetVal というメソッドを、CreateValと改名すれば
なんか許せる気分になるな。ほらファクトリーもどきでw
・・・だめだ自分をごまかせねぇ OTZ
>>968
単に元コードが変更できないだけで、ラップしてそのメソッド利用を強制できる環境なら、
GetValの代わりに、getValを作るとか、GlobalMapクラスを作成して、
globalをprivateメンバにして、利用はGlobalMapのメソッドからアクセスするように
すりゃいいんじゃないのか。
キーをベクタに登録するよりはましな感じが。globalに直接アクセスしているライブラリが
でーんとあるとかいうなら、また別な話だが。
0980デフォルトの名無しさん
2009/03/19(木) 16:14:260981デフォルトの名無しさん
2009/03/19(木) 16:17:37その次にしろ
0982デフォルトの名無しさん
2009/03/19(木) 20:54:270983デフォルトの名無しさん
2009/03/19(木) 20:56:37問題は「既にキーが存在するかどうかが判らないクソ仕様になっている」つうことですな。
ラップするだけじゃ情報が足りないのね。
0984デフォルトの名無しさん
2009/03/19(木) 22:20:350985デフォルトの名無しさん
2009/03/20(金) 07:31:080986デフォルトの名無しさん
2009/03/20(金) 13:59:020987デフォルトの名無しさん
2009/03/20(金) 13:59:330988デフォルトの名無しさん
2009/03/20(金) 14:00:030989デフォルトの名無しさん
2009/03/20(金) 14:00:330990デフォルトの名無しさん
2009/03/20(金) 14:01:030991デフォルトの名無しさん
2009/03/20(金) 14:07:45>>987
0992デフォルトの名無しさん
2009/03/20(金) 14:25:350993デフォルトの名無しさん
2009/03/20(金) 14:26:020994デフォルトの名無しさん
2009/03/20(金) 14:26:390995デフォルトの名無しさん
2009/03/20(金) 14:27:010996デフォルトの名無しさん
2009/03/20(金) 14:28:170997デフォルトの名無しさん
2009/03/20(金) 14:28:310998デフォルトの名無しさん
2009/03/20(金) 14:29:100999デフォルトの名無しさん
2009/03/20(金) 14:29:53http://pc11.2ch.net/test/read.cgi/tech/1231640498/
1000デフォルトの名無しさん
2009/03/20(金) 14:30:43http://pc11.2ch.net/test/read.cgi/tech/1231640498/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。