トップページ⇒tech
1001コメント275KB

C++相談室 part85

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/10/09(土) 20:22:35
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/
0175デフォルトの名無しさん2010/10/15(金) 16:39:14
リンカに渡せばコンパイルもしてくれるからね
0176デフォルトの名無しさん2010/10/15(金) 17:03:38
んなこたーない。
0177デフォルトの名無しさん2010/10/15(金) 17:13:36
LTCGとかある意味コンパイルだな
0178デフォルトの名無しさん2010/10/15(金) 17:23:40
糞$はリリース時にNDEBUGを定義する仕様じゃないあたりに悪意を感じる
0179デフォルトの名無しさん2010/10/15(金) 17:25:30
日本語でおk
0180デフォルトの名無しさん2010/10/15(金) 17:50:00
意訳すると糞$しね
0181デフォルトの名無しさん2010/10/15(金) 20:40:46
VCだと

assert( false && "message" );

で"message"も表示してくれるよね
0182デフォルトの名無しさん2010/10/15(金) 20:53:32
なんで VC に限るんだよ
0183デフォルトの名無しさん2010/10/15(金) 20:55:42
質問者が環境を明確にしないから
0184デフォルトの名無しさん2010/10/15(金) 20:56:51
>>183
C++の仕様の話をしているんじゃねぇの?
0185デフォルトの名無しさん2010/10/15(金) 21:05:53
標準内だけでの話なら無いで終わりじゃん
0186デフォルトの名無しさん2010/10/15(金) 22:04:03
正式版だのReleaseバージョンだの_DEBUGだの
0187デフォルトの名無しさん2010/10/16(土) 01:18:09
>>181 VC 以外でも表示されるよ。標準に従うなら必須だから。
0188デフォルトの名無しさん2010/10/16(土) 04:45:18
_DEBUGて標準なの?
標準はNDEBUGだけかと思ってたが
0189デフォルトの名無しさん2010/10/16(土) 20:03:46
eclipseのswtってc++で操作できますか?
0190デフォルトの名無しさん2010/10/16(土) 20:11:18
>>188 _DEBUG は標準じゃない。 NDEBUG は標準。
0191デフォルトの名無しさん2010/10/16(土) 23:20:56
assert(!"message");
0192デフォルトの名無しさん2010/10/16(土) 23:43:31
STLのヘッダを見ていてインデントがかなり分かりにくいと思ったんですが、よくある方式なんですか?
0193デフォルトの名無しさん2010/10/17(日) 00:38:29
STLといっても実装はいろいろあるんだが・・・
0194デフォルトの名無しさん2010/10/17(日) 00:56:10
インデントとコメントは可能な限り排除して、
マクロも全部展開することで
コンパイルがわずかに早くなるよ。

人間には検出不可能だけど。
0195デフォルトの名無しさん2010/10/17(日) 01:00:47
プリコンパイルドヘッダ使おうよ。
01961942010/10/17(日) 01:03:14
>>195
そこに気がつくとは、おぬし天才だな。



・・・って>>194は冗談に決まっているじゃないですか!
0197デフォルトの名無しさん2010/10/17(日) 01:08:39
厨房くせぇ
0198デフォルトの名無しさん2010/10/17(日) 01:11:08
VC++2010のSTLなんです。一応インデントとかコメントはあってこんな感じ
class hoge
  { // hoge class
public:
  hoge(){}
  };
こんな風に中括弧とスコープ内部が同じ深さになってて更にネストが加わるとどんどんわかりにくく
0199デフォルトの名無しさん2010/10/17(日) 01:19:25
書き換えりゃいいじゃん
0200デフォルトの名無しさん2010/10/17(日) 01:20:41
そのソースを書いた人と>>198で
エディタのタブ幅設定が違うだけかと
0201デフォルトの名無しさん2010/10/17(日) 01:22:30
Ctrl+A Ctrl+K Ctrl+Fでフォーマットしなおせ
0202デフォルトの名無しさん2010/10/17(日) 01:32:19
VisualStudioならAlt+F8で整形できる
0203デフォルトの名無しさん2010/10/17(日) 01:32:46
>>200
さすがの俺もスペースとタブを見間違えませんよw

>>199,201
え、STLって書き換えていいもんなんですか?
それ以前になんかファイルに読み取り専用設定がされています

あと別に書き換え云々じゃなくてMS(が作ったんですか?)が
こういう風にしてるからには一つの有名な流儀なのかなと思いまして
0204デフォルトの名無しさん2010/10/17(日) 01:33:31
Whitesmiths style
0205デフォルトの名無しさん2010/10/17(日) 01:39:26
vs整形なんてできたのか
0206デフォルトの名無しさん2010/10/17(日) 01:43:34
すでにWhitesmithって名前でてるけど
スタイルに興味あったらこれとか眺めてみるといいかも
ttp://astyle.sourceforge.net/astyle.html#_Predefined_Style_Options
0207デフォルトの名無しさん2010/10/17(日) 01:50:31
>>204
どうもありがとう、なんだか凄く歴史がありそうな書き方なんですね

>>206
どうもです、自分でもスタイルに関して少し思うところがあったので読んでみます
0208デフォルトの名無しさん2010/10/17(日) 16:03:12
自宅だとwhitesmithで書いてるけど、
普通の職場じゃ一般的じゃないフォーマットだよな
0209デフォルトの名無しさん2010/10/17(日) 16:13:44
c++の勉強中なのですが、よくわからないところでエラーが発生します。

#ifndef __FILE_H_INCLUDED__
#define __FILE_H_INCLUDED__

#include<stdio.h>

class CFile{
0210デフォルトの名無しさん2010/10/17(日) 16:16:14
途中送信してしまった

class CFile{
  //メンバ変数
private:
  FILE *m_pfile; //ファイル
・・・・・・

このclass CFile と書いてある所で宣言の構文エラーがあるようなんですが、よくわかりません。
エラー E2141 File.h 6: 宣言の構文エラー

http://www7b.biglobe.ne.jp/~robe/cpphtml/index.html
0211デフォルトの名無しさん2010/10/17(日) 16:18:08
全部貼れ
0212デフォルトの名無しさん2010/10/17(日) 16:20:37
#ifndef __FILE_H__INCLUDED__
#define __FILE_H__ENCLUDED__

#include<stdio.h>

class CFile{
//メンバ変数
private:
FILE *m_pfile; //ファイル
bool m_bCopy; //コピーコンストラクタで作られたかどうか

//コンストラクタ・デストラクタ
public:
CFile(); //コンストラクタ
CFile(const CFile& rohter); //コピーコンストラクタ
~CFile(); //デストラクタ

//ファイルの開閉
public:
bool Open(const char *pszFile,const char *pszFlags);
//ファイルを開く
void Close(); //ファイルを閉じる
0213デフォルトの名無しさん2010/10/17(日) 16:21:18

private:
bool ModifyFlags(const char *pszSource,char *pszDest,int nSize);
//フラグの調整

//ファイルの操作
public:
size_t Read(void *pData, seze_t nSize); //ファイルから読みだす
size_t Write(const void *pData,size_t nSize) //ファイルに書き込む

//評価
public:
bool IsValid() const; //m_pfileの値が有効かどうか
bool Eof(); //ファイルの終端に達したかどうか
};

//m_pfileの値が有効かどうか
inline bool CFile::IsValid() const{
return (m_pfile != NULL);
}

#endif
0214デフォルトの名無しさん2010/10/17(日) 16:22:59
size_t Read(void *pData, size_t nSize); //ファイルから読みだす
size_t Write(const void *pData,size_t nSize); //ファイルに書き込む
0215デフォルトの名無しさん2010/10/17(日) 16:24:42
今なおしましたが、まだエラーが残ってます。
■C:\c++> bcc32 File.h
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
File.h:
エラー E2141 File.h 6: 宣言の構文エラー
エラー E2141 File.h 40: 宣言の構文エラー
*** 2 errors in Compile ***
0216デフォルトの名無しさん2010/10/17(日) 16:29:06
#ifndef __FILE_H__INCLUDED__
#define __FILE_H__ENCLUDED__
ここも何か変だな
0217デフォルトの名無しさん2010/10/17(日) 16:30:44
.hを直接コンパイルしてるけど、それはC++としてコンパイルされてるのか? Cとしてコンパイルされてはいないよな?
0218デフォルトの名無しさん2010/10/17(日) 16:38:40
多分C++としてコンパイルされてると思います
0219デフォルトの名無しさん2010/10/17(日) 16:41:50
>>218
class A{};
だけ書いたファイルのコンパイルは通る?
0220デフォルトの名無しさん2010/10/17(日) 16:43:50
だいぶ古いコンパイラを使ってるな
0221デフォルトの名無しさん2010/10/17(日) 16:45:07
>>219
通ってない?

0222デフォルトの名無しさん2010/10/17(日) 16:45:47
>>219
■C:\c++> bcc32 classtest.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
classtest.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
0223デフォルトの名無しさん2010/10/17(日) 16:47:14
class A{};
int main(){
return 0;
}
こう書けば通りますが
0224デフォルトの名無しさん2010/10/17(日) 17:29:23
知ってるか?bccはファイルの拡張子みてコンパイルする言語を決めるんだぜ
.cppだったらC++としてコンパイルされてあたりまえ
.hはどうなんだと訊いてるんだ
0225デフォルトの名無しさん2010/10/17(日) 17:37:27
もしかしてcppでコンパイルされていませんか?
>>223を.cppだとコンパイル出来ましたが、
.hはエラーが発生しました
0226デフォルトの名無しさん2010/10/17(日) 17:39:16
じゃあそういうことで
0227デフォルトの名無しさん2010/10/17(日) 17:39:29
#include <stdio.h>
のかわりに
#include <cstdio>
ではどうですか?
0228デフォルトの名無しさん2010/10/17(日) 17:41:28
挙動を一々試すとかアホだろ
マニュアル読めよ
http://docwiki.embarcadero.com/RADStudio/ja/C%2B%2B_%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3_%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%EF%BC%9A_BCC32
>拡張子が .CPP のファイルは C++ ファイルとしてコンパイルされます。拡張子が .C のファイル、拡張子のないファイル、および .CPP、.OBJ、.LIB、.ASM 以外の拡張子を持つファイルは、C ファイルとしてコンパイルされます。
0229デフォルトの名無しさん2010/10/17(日) 23:23:34
mainなどのエントリポイントってどこで定義してもいいんですよね
0230デフォルトの名無しさん2010/10/17(日) 23:39:32
クラスの中とかnamespaceの中とかはだめなんじゃないかな... たぶん。
0231デフォルトの名無しさん2010/10/17(日) 23:40:37
int main = 195;
0232デフォルトの名無しさん2010/10/18(月) 10:24:58
template <typename T>
struct eq_t { bool eq(const T &lhs, const T &rhs) { return (lhs == rhs); } };

というような、比較関数をラップした構造体があり、いくつかの型に対して特殊化したバージョンもあります。
その中に、vector一般に対して部分特殊化した次のようなものがあるのですが、
template <typename T>
struct eq_t<std::vector<T>>
{
bool eq(const std::vector<T> &lhs, const std::vector<T> &rhs)
{
return (lhs.size() == rhs.size() && std::equal(lhs.begin(), lhs.end(), rhs.begin()));
}
};
これをコンテナ一般(というかbegin(), end()を持つクラス)を対象とするにはどうすればいいのでしょうか?
vector::mplあたりに何かありそうか気はするのですが。

0233デフォルトの名無しさん2010/10/18(月) 12:21:04
std::forward の意味がいまいちわからないのですが、
引数が左辺値か右辺値かによってコピーとムーブを自動的に区別して行う関数と
理解していいんでしょうか。
0234デフォルトの名無しさん2010/10/18(月) 12:27:47

エラー出力はバッファを持たないの意味が分からないのですが。
バッファを持つと持たないとは何が違うのでしょうか?
バッファとは何をするものですか?
0235デフォルトの名無しさん2010/10/18(月) 12:33:49
>>234
ディクスファイルや端末、ネットワークへの入出力は低速なので、一定量データを
溜めておいて、一度に行う事で高速化する。これがバッファリング

バッファリングされたデータは適切なタイミングで出力される必要があるが、
エラーが発生してプログラムが異常終了すると出力されない場合がある。
異常終了の場合にこそエラー出力は重要なので、エラー出力はバッファリングしない。
0236デフォルトの名無しさん2010/10/18(月) 12:42:30
>>233
forward() をはさまないとぜんぶ左辺値の参照(従来の参照)になっちゃう。
0237デフォルトの名無しさん2010/10/18(月) 15:05:04
質問させてください
例えばAクラスを継承するBクラスというものがあって、
BクラスからはAクラスのconst関数しか呼べないようにするにはどうすればよいでしょうか
(もちろん素のAクラスはいかなるAメンバ関数も使えます)
0238デフォルトの名無しさん2010/10/18(月) 15:07:50
非const関数を全部privateにするんじゃだめなの?
0239デフォルトの名無しさん2010/10/18(月) 15:41:52
ちょっと書き方がまずかったですね
Aはそのまま使うこともあり、その時にはconst関係なくメンバ関数を使いたいんです
要はAはメンバ変数書き換え関数を持っており、それは(もちろん非const時の)Aとしては普通に使えますが、
継承先Bからはそれを使えないようにしたいんです
Bが継承ではなくメンバ変数としてconst Aを持てば上記のことは出来るんですが
これを継承でする方法はないものかと
0240デフォルトの名無しさん2010/10/18(月) 15:47:45
書き換え関数を持たないBを親クラスにして
書き換え関数を持つAを作れば解決じゃね?
0241デフォルトの名無しさん2010/10/18(月) 15:50:57
Aを継承する非const関数を全部privateにしたAAを用意し、それを継承する。
0242デフォルトの名無しさん2010/10/18(月) 16:22:28
>>240
どうもありがとうございます
なるほど、クラスを分離して役割を明確にさせるんですね
結構シンプルでいいかもしれない

>>241
それって少なくとも非const関数を全てオーバーロードするんですよね?
ちょっと引数とかの同期が大変そうなので上の方法で検討してみたいと思います
どうもすみません
0243デフォルトの名無しさん2010/10/18(月) 16:33:11
Aで出来ることはBでも出来ないとデザインとしてまちがってますよ。
0244デフォルトの名無しさん2010/10/18(月) 17:36:16
(´A`)
(´B`)
0245デフォルトの名無しさん2010/10/18(月) 17:37:29
boolの配列は一つがcharの大きさの配列になるから
boolをintに詰め込んでintの配列にするのが最も効率的ですか?
0246デフォルトの名無しさん2010/10/18(月) 17:43:30
int型(4Bytet)なら32個のビットをそれぞれフラグとして使えるという意味ならそうじゃない?
0247デフォルトの名無しさん2010/10/18(月) 17:56:36
>>245
メモリ効率的にはそうだけど、実行効率は必ずしもビットがいいとは限らない。
0248デフォルトの名無しさん2010/10/18(月) 17:59:26
>>247
じゃあ何が良いの?
0249デフォルトの名無しさん2010/10/18(月) 18:01:52
unsigned charでビットフラグが良い
0250デフォルトの名無しさん2010/10/18(月) 18:03:07
メモリ効率がいいならキャッシュの乗る可能性も上がるんだから実行効率も上になるんじゃね?
0251デフォルトの名無しさん2010/10/18(月) 18:05:18
レジスターはintで処理するからintの方が効率よくね?
0252デフォルトの名無しさん2010/10/18(月) 18:08:10
バイト単位かビット単位かの違いでキャッシュヒットを心配しているけど、
今時のCPUのキャッシュを考えたら殆ど意味がない。
寧ろ、ビット演算のコストの方が問題。
0253デフォルトの名無しさん2010/10/18(月) 18:16:21
ビット演算のほうが普通にコストが低い件について
0254デフォルトの名無しさん2010/10/18(月) 18:33:15
みんなキャッシュ効率とかページ効率とか考えてコード組んでんのかすごいな
具体的にどういうコードを書けば効率良くなるんだろう
なるべく変数を減らして使いまわすぐらいしか思い浮かばん
0255デフォルトの名無しさん2010/10/18(月) 18:41:16
>>254
キミが思い浮かぶくらいの事はコンパイラが全部知っている。
変数使いまわしは難読性を向上させるだけ。
0256デフォルトの名無しさん2010/10/18(月) 18:41:17
下手な考え休むに似たり。
実直なコードを書いて、最適化はコンパイラに任せるのがよい。
0257デフォルトの名無しさん2010/10/18(月) 18:43:39
>下手な考え休むに似たり。

これってよくできた諺だよな
0258デフォルトの名無しさん2010/10/18(月) 19:44:52
大きなコンテナなんかを返す関数なんかも、単純に値を戻すのが実は一番効率がいいんだ、
とboostの中の人も言っている。
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
0259デフォルトの名無しさん2010/10/18(月) 20:01:17
今の話と全然関係ねぇえええええ
0260デフォルトの名無しさん2010/10/18(月) 20:04:35
ビット単位かバイト単位かとかいう以前に、intに詰め込みたくなるほどの
フラグを1カ所で管理してるのがおかしい。
0261デフォルトの名無しさん2010/10/18(月) 20:17:13
しかしいろいろ考えないと身につかない。
上から目線であやふやな思い込みを語るのはどうかと思う。
0262デフォルトの名無しさん2010/10/18(月) 20:33:57
あれこれ考えて試すのはいいけど、最低限結果を確認する手段は持ってないと意味がない。
なんとなく速くなった遅くなったじゃなくて、ちゃんとプロファイリングするなり
アセンブリ出力を読むなりしないと。
0263デフォルトの名無しさん2010/10/18(月) 20:34:28
はい、charで1ビットずつバラバラのクラスにします
ありがとうございました
0264デフォルトの名無しさん2010/10/18(月) 20:42:27
>>258
えいごよめねえ
解説を
0265デフォルトの名無しさん2010/10/18(月) 20:46:23
>>264
ガテン系に転職した方がいい。
0266デフォルトの名無しさん2010/10/18(月) 20:52:13
ガッテンガッテン!
0267デフォルトの名無しさん2010/10/18(月) 21:27:11
>>232が意図してるのとは少し違うかもしれないが
http://codepad.org/PIjvF4Yq
0268デフォルトの名無しさん2010/10/18(月) 21:28:42
>>265
プログラマーってガテン系じゃなかったのか?
0269デフォルトの名無しさん2010/10/18(月) 21:35:15
>>268
ガテン系プログラマは英語を読む必要は無い。
0270デフォルトの名無しさん2010/10/18(月) 21:37:30
この世界には英語しか話せない人が沢山いるんですよね
0271デフォルトの名無しさん2010/10/18(月) 21:38:46
日常会話レベルから英語やっとくとメリットありまくりだよ
0272デフォルトの名無しさん2010/10/18(月) 21:57:16
読み込みはなんとなくできるけど生成できない
02732322010/10/18(月) 22:00:23
>>267
まさに私が求めていたものです。Exaclty what I was looking for です。
じっくり読んで隅々まで理解するようにします。ありがとうございました。
0274デフォルトの名無しさん2010/10/18(月) 22:44:49
以下英語でレス
■ このスレッドは過去ログ倉庫に格納されています