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


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

C++相談室 part43
751 名前:デフォルトの名無しさん :2005/09/20(火) 13:09:35
ただのvoid型
ソース全部検索したけどvirtualって文字列は
CWinAppの派生クラスに1コだけだった

752 名前:デフォルトの名無しさん :2005/09/20(火) 13:14:39
>>749
それはVC++の意味不明なエラーメッセージで混乱してるだけ。g++でコンパイルしてみ。
「ISO C++ではそのようなアドレス取得は認められていません」って出るから。

753 名前:デフォルトの名無しさん :2005/09/20(火) 13:18:00
>>749
game->Main(); ではないかと釣られてみる。

754 名前:デフォルトの名無しさん :2005/09/20(火) 13:18:37
そりゃ残念だ
どうしても手動でメモリ確保しつつ関数のアドレスが欲しかったんだけど
教えてくれてサンクス

755 名前:デフォルトの名無しさん :2005/09/20(火) 13:19:59
>>749
&(CGame::Main);じゃなんでダメなの?

756 名前:デフォルトの名無しさん :2005/09/20(火) 13:20:48
関数のアドレスを取るだけなら&CGame::Mainでいいけどね。
ただしstaticにしないとコールはできないよ。

コールしたい場合はstd::mem_funか、boost::functionを使うと吉。

757 名前:デフォルトの名無しさん :2005/09/20(火) 13:22:07
>>753
「'&' に左辺値がありません」って言われる
その&じゃないってのに

>>755-756
ちょっと考え直してみる

758 名前:デフォルトの名無しさん :2005/09/20(火) 13:25:27
>>757
ていうか何でエラーが出るか理解してるか?

C++のクラスでは、オブジェクトがいくつあったところで関数の実体は1つしかなくて
その関数に暗黙にオブジェクトのポインタ(thisポインタ)が渡されるのは知ってるよね?

ということは、オブジェクトAの関数F をポインタで表現しようとなると、
オブジェクトAのアドレスと関数Fのアドレスを両方管理しなきゃいけなくなって
1つのポインタじゃ表現できないからエラーになる。

だから結局、関数だけのアドレスを取得するか(&CGame::Main)、
両方を管理できるmem_funのようなクラスを使う必要があるってだけ。
用途に応じて使い分ければいい。

759 名前:デフォルトの名無しさん :2005/09/20(火) 13:27:36
インスタンスをいっぱい生成して
それらのメイン関数をまとめて実行したい
だからメイン関数のアドレスを集めようとしてた

>C++のクラスでは、オブジェクトがいくつあったところで関数の実体は1つしかなくて
>その関数に暗黙にオブジェクトのポインタ(thisポインタ)が渡されるのは知ってるよね?
すいません実は・・・

760 名前:デフォルトの名無しさん :2005/09/20(火) 13:28:32
>>756
this->*pFunc

761 名前:デフォルトの名無しさん :2005/09/20(火) 13:28:52
>>747
こんな感じで。

#include <iostream>
#include <fstream>

int main()
{
 std::ostream* fsp;
 int i;

 std::cout << "1: std::coutに出力 2: 'test.txt'に出力? ";
 std::cin >> i;

 if (i == 1)
  fsp = &std::cout;
 else if (i == 2)
  fsp = new std::ofstream("test.txt");
 else
  return 0;

 (*fsp) << "出力\n";

 if (fsp != &std::cout)
  dynamic_cast<std::ofstream*>(fsp)->close();
}

762 名前:デフォルトの名無しさん :2005/09/20(火) 13:33:00
>>759
boost::signalを調べてみれば?
そこまで複雑なものじゃなくてもいいなら、ちょっと工夫すれば自作できるだろうし

763 名前:デフォルトの名無しさん :2005/09/20(火) 16:47:03
下の様に、あらかじめ数が分からないintデータを、ファイルが終わるまでreadしたいのですが、
下のやり方だとreadが一回多くなってしまいます。
上手いやり方があったら教えて頂けないでしょうか。

#include <fstream>

int main(){
int writed_count=0, read_count=0;

std::ofstream ofile( "hoge", std::ios::binary );
for( int i=0; i<5; ++i ){
ofile.write( (const char*)&i, sizeof(int) );
++writed_count;
}
ofile.close();

int array[10] = {0};
int pos = 0;
std::ifstream ifile( "hoge" );
while( ! ifile.eof() ){
ifile.read( (char*)&array[pos], sizeof(int) );
++read_count;
++pos;
}
printf( "write count = %d\nread count = %d\n", writed_count, read_count );
return 0;
}

764 名前:デフォルトの名無しさん :2005/09/20(火) 16:52:48
>>763
while (!ifile.eof()) がおかしい。
C/C++はBASICとは違い、一度読んでみて初めてEOFかどうかわかる。

765 名前:デフォルトの名無しさん :2005/09/20(火) 16:57:49
従って、「読み込んでからeof()で調べてみて、okだったらやりたいことをやる」
という順序が正解ですな。

たとえば、条件文のところをwhile (1)にした上で、ifile.read()の直後にeof()をチェックして
真だったらbreakするとか、
条件文の中に読み込む式とeof()をカンマで並べるとか。

766 名前:デフォルトの名無しさん :2005/09/20(火) 16:58:40
>>764
ありがとうございます、おかげで良く分かりました
この場合はreadの後にeofで終了判定すべきなんですね

767 名前:763=766 :2005/09/20(火) 17:00:09
>>765
リロードが間に合いませんで
なるほどwhileの所に書く手もあるんですね
重ね重ね感謝ッス

768 名前:デフォルトの名無しさん :2005/09/20(火) 18:05:52
listの最後の要素のイテレータが欲しいのですが、
どうすれば効率よく取れますか?
it = list.end();
--it;
はマズイですよね?

769 名前:デフォルトの名無しさん :2005/09/20(火) 18:09:53
>>768
std::listのイテレータはBidirectionalIteratorだからまずくない。

770 名前:デフォルトの名無しさん :2005/09/20(火) 18:22:25
今ExceptionalC++を読み直してみたらまずいのは
--list.end()でしたね。
ありがとうございました。

771 名前:デフォルトの名無しさん :2005/09/20(火) 19:33:12
list.rbegin();

772 名前:デフォルトの名無しさん :2005/09/20(火) 19:50:54
>>771
そいつが返すのはreverse_iteratorじゃないのか?

773 名前:デフォルトの名無しさん :2005/09/20(火) 22:15:12
>>770
list::iterator が builtin type であることはないから
問題ないのでは?

774 名前:デフォルトの名無しさん :2005/09/20(火) 23:27:12
どんなクラスへのポインタも代入できて、そのメンバ関数も実行できる型って無い?
boost::anyでいけるかと思ったけど
メンバ関数を実行しようとすると「boost::anyのメンバではありません」とか言われる

775 名前:デフォルトの名無しさん :2005/09/20(火) 23:30:07
どんな型のポインタも代入できる、とは型がないということだ。
メンバ関数が実行できる、とは、型がある、ということだ。

型に共通のメンバ関数を括りだしてインターフェースにするか、
Object型にしてInvoke(COMMAND,...)とか、RTTIで型の列挙、
みたいな話になってくるが。

776 名前:デフォルトの名無しさん :2005/09/20(火) 23:36:15
IOの
[io]?strstream
だけがtemplate化されてないのって何か理由あるのかな?


777 名前:デフォルトの名無しさん :2005/09/20(火) 23:40:13
標準C++にstrstreamなんてないが。
basic_[io]stringstream<>ならあるけどな。

778 名前:デフォルトの名無しさん :2005/09/20(火) 23:41:09
>>775
諦める。・゚・(ノД`)・゚・。

779 名前:デフォルトの名無しさん :2005/09/20(火) 23:42:49
>>776
strstream類は過去との互換性のためだけに存在するから。
逆にstringstream類はテンプレートになっている。

780 名前:デフォルトの名無しさん :2005/09/20(火) 23:45:02
>>777
少なくともX3014:2003には附属D.7にstrstream類が載っている。

781 名前:デフォルトの名無しさん :2005/09/21(水) 00:57:20
>>774
boost::anyにoperator->を付け加えてやればできるのではないかと。
試してないけど。

782 名前:デフォルトの名無しさん :2005/09/21(水) 00:59:56
どのみち型が確定しないと意味がない。

783 名前:776 :2005/09/21(水) 01:11:35
どうも。
>>777
basic_iostream<...>->strstream
>>779
そのような歴史的経緯?もあり、
配列ベースの入出力のようなので今後はあまり使わない方がよさそうですね。


784 名前:デフォルトの名無しさん :2005/09/21(水) 01:51:11
そこでObjective C++ですよ


785 名前:デフォルトの名無しさん :2005/09/21(水) 03:01:44
どこで?

786 名前:デフォルトの名無しさん :2005/09/21(水) 03:40:53
>>784
微妙に使いどころに苦しむ。

オブジェクトに互換性がないんじゃ、混ぜて書けるメリットが無いと思うんだが。
つか、むしろC++ベースでCocoaをサポートしてくれ

787 名前:635 :2005/09/21(水) 16:47:08
>> 638
情報ありがとうございました。鬼車の c++ ラッパーを作って、ruby-like な gsub とか
scan ができるようになりました。日本語の正規表現も問題なしです。

788 名前:デフォルトの名無しさん :2005/09/21(水) 16:57:05
鬼車で解決したみたいだからどうでもいいけど、
日本語で問題があったならwregexだとどうだったんだろうか。

789 名前:デフォルトの名無しさん :2005/09/21(水) 18:18:15
PC一般板の、エスパースレから誘導されてきました。
よろしくお願いします。

c++で作られたソフトをダウンロードしたのですが
文字が一部「・」とか「・・」と表示されていて
読めません。
どうすれば日本語に戻りますか?

790 名前:デフォルトの名無しさん :2005/09/21(水) 18:25:20
参照仮引数と、ポインタを使った仮引数の違いは
コードの書き方に違いが出るだけで
やってることはおなじと考えていいんですか?

791 名前:デフォルトの名無しさん :2005/09/21(水) 18:28:46
>>790
そそ。

792 名前:デフォルトの名無しさん :2005/09/21(水) 18:54:15
参照だとNULLを渡せないていう制約はあるけどね

793 名前:デフォルトの名無しさん :2005/09/21(水) 18:57:16
こういう変態的な事したら渡せる。
*static_cast<hoge*>(NULL)

まぁ自分もNULLが来ないことを前提にコード書いてるけどね

794 名前:デフォルトの名無しさん :2005/09/21(水) 19:43:11
>>789
自分がそのプログラムのソースコードを修正する気でもない限り、ここは板違い。
恨むならエスパースレでお前にここに行けと答えた奴を恨め。

795 名前:790 :2005/09/21(水) 20:15:18
前勉強したときはなんか頭混乱して
よくわからなかったままだったんですが、
今回勉強し直してたらおんなじなんじゃないかとおもいまして
お聞きしました。
すっきりしました。

さんくすです。


796 名前:デフォルトの名無しさん :2005/09/21(水) 20:19:58
クラス内で定義されたタイプはなんて呼んだらいいんでしょう?
メンバータイプでぐぐると異様に件数が少ないんですが・・・

797 名前:デフォルトの名無しさん :2005/09/21(水) 20:21:42
>>789
EUCかUTF-8かSJISかいろいろ試せ。

798 名前:635 :2005/09/21(水) 23:02:51
>>788
gcc with boost::regex (wregex) だと、正規表現自体に日本語を含むケースでまともに
動きませんでした。原因は良く分かりませんが・・・。

799 名前:デフォルトの名無しさん :2005/09/22(木) 03:57:41
>>796
クラス内で定義されたクラス型なら
"nested class" 「ネストされたクラス」っていう呼び方があるけど、
typedef だと特に用語も無く「クラス内の typedef 」とか言えばいいと思う。

800 名前:デフォルトの名無しさん :2005/09/22(木) 05:50:42
自分のクラスをintの参照にキャストしたい場合、
class AAA
{
public:
operator int&()
{
return & m_i;
}
int m_i;
};
という具合に自分のメンバのm_iのポインタを返せばいいのですか?
正しい方法を教えてくださいませ。

801 名前:デフォルトの名無しさん :2005/09/22(木) 07:30:05
>>800
参照とポインタは違う。やればすぐ判ることを一々聞くな。
そもそも、メンバを返すのが適当な設計かどうかは一概には言えんぞ。
それと、constメンバ関数にしておいた方がいいかも知らん。

802 名前:初心者 :2005/09/22(木) 13:20:24
質問があります。
現在、ボーランドでプログラムを作っているのですが、
TransparentBlt()関数が読み込めないらしく、
 Error: 外部シンボル 'TransparentBlt' が未解決
と出てしまいます。

何かをインクルードし忘れているからでしょうか?
windows.hだけをインクルードしているのですが。

803 名前:デフォルトの名無しさん :2005/09/22(木) 13:40:02
>>802
Win32API質問箱 Build35
http://pc8.2ch.net/test/read.cgi/tech/1125850096/

804 名前:デフォルトの名無しさん :2005/09/22(木) 13:42:18
以下のようなMakefileでコンパイルしているのですが、$(EXE)を生成する時は、$(CC)により指定しているコンパイラを
使ってくれるのですが、$(OBJS)を生成するときは、g++が使われてしまいます。拡張子ルールか何かがまちがっているのでしょうか?
どなたかご教授をよろしくお願いします。
環境は、Red Hat(R) Enterprise Linux AS 2.1

/************* Makefile ****************/
CC = /opt/intel_cc_80/bin/icc
DEBUG = -g
CFLAG = -c $(DEBUG)
OFLAG = -o
IPOFLAG = -ipo
IPFLAG = -ip
LFLAG = -lm

# ソースファイルの宣言
SRCS = Main.cpp HelloWorld.cpp

OBJS = ${SRCS:.cpp=.o}

# 実行ファイルの宣言
EXE = Ocean

$(EXE) : $(OBJS)
$(CC) $(OFLAG) $(EXE) $(IPOFLAG) $(OBJS) $(LFLAG)

.c.o :
$(CC) $(CFLAG) $(IPOFLAG) $<

Main.o : HelloWorld.h
HelloWorld.o : HelloWorld.h


805 名前:デフォルトの名無しさん :2005/09/22(木) 13:51:09
>>804
.cpp.oはデフォルトでどう定義されているのか見てみるがよろし。

806 名前:初心者 :2005/09/22(木) 13:55:17
>>803
どうもです。
行ってきます。

807 名前:804 :2005/09/22(木) 13:56:20
>>805
c++のプログラムでしたので、
.c.o => .cpp.o
と、変更したら解決できました。ありがとうございます。

ほんとしょうがないミスで申し訳ありません。

808 名前:デフォルトの名無しさん :2005/09/22(木) 13:56:29
.c から .o を生成する規則を自分で記述しときながら、実際の SRC は .cpp の群
.cpp から .o を生成する規則を追加汁

809 名前:デフォルトの名無しさん :2005/09/22(木) 21:50:36
今晩は、教えてください。
ウィドウに、文字を書き込んでいるのですが、
一定の処で、改行したいのですが、
どうも、区切り場所の文字が、変になります。
バイト数を求めるには、どうすればよいのでしょうか
string hh;
hh = strtok(NULL,"\t");
while(1){
if(strlen(hh.c_str())>=25){
TextOut(ps.hdc,105,takasa,hh.substr(0,24).c_str(),
strlen(hh.substr(0,24).c_str()));
hh = hh.substr(24,hh.length());
takasa +=20;
}else{
TextOut(ps.hdc,105,takasa,
hh.substr(0,hh.length()).c_str(),
strlen(hh.c_str()));
break;
}
}

810 名前:デフォルトの名無しさん :2005/09/22(木) 21:58:25
なぜだめなのかを考えなさい
意外と簡単だから

811 名前:デフォルトの名無しさん :2005/09/22(木) 22:05:34
strlen(hh.c_str())
ってずいぶん斬新なコードだなぁ、

812 名前:デフォルトの名無しさん :2005/09/22(木) 22:21:43
string使う意味が全くないな

813 名前:デフォルトの名無しさん :2005/09/22(木) 22:26:49
>>810さんありがとうございます。
何度かんがえてもわかりません。
上のコードでは、最後の文字が半角なら
失敗しす。
だから、最後の文字が半角かどうか判断して、
コードを変えようかと思ったのですが、
もっと簡単な方法があると考えてよいのでしょうか。
そうならば、もっと考えて見ます。

>>811さん、全く読みにくいコードをあげてしまいすみません。
c も c++もまったくしらず、vc++からはじめたので、
charのポインターつかうか、stringクラスつかうか、
あるいは、この関数がどっちの関数なのか、
整理が全くできてない状態です。


814 名前:デフォルトの名無しさん :2005/09/22(木) 22:28:59
>>812さんへ
string 使うと、メモリの心配しなくてすむのかなと思ったのですが、
malloc とか、使わなくてすむと・・・

815 名前:デフォルトの名無しさん :2005/09/22(木) 22:34:08
>c も c++もまったくしらず、vc++からはじめたので、

こいつは大物になるぜ。

816 名前:デフォルトの名無しさん :2005/09/22(木) 22:35:50
>>814
std::string.length()のこともたまには思い出してあげてください。

817 名前:デフォルトの名無しさん :2005/09/22(木) 22:36:48
とりあえずstrlen(〜.c_str())は〜.length()に直せ。

818 名前:デフォルトの名無しさん :2005/09/22(木) 23:40:07
> hh.substr(0,hh.length()).c_str(),
目から鱗が落ちた。


819 名前:デフォルトの名無しさん :2005/09/22(木) 23:45:59
昔見たstr[strlen(str)] = '\0';並にヒットだ俺的に。

820 名前:デフォルトの名無しさん :2005/09/22(木) 23:49:01
VB厨臭い使い方だよなあ。MID$のような。

821 名前:デフォルトの名無しさん :2005/09/22(木) 23:58:28
>>819
激しく和露他

822 名前:デフォルトの名無しさん :2005/09/22(木) 23:58:29
未来の大物が降臨しているなw
ところで皆に聞きたいんだが、クラスのメンバである配列の初期化ってどうやってる?
自分のやり方むちゃくちゃな予感なんで定石を聞きたいんだが。

823 名前:デフォルトの名無しさん :2005/09/23(金) 00:00:30
>>822
むちゃくちゃなやり方知りたいので書いて

824 名前:デフォルトの名無しさん :2005/09/23(金) 00:00:40
>>822
普通のCスタイル配列じゃコンストラクタ関数の先頭で、とか無理だから
別にないと思うよ。

825 名前:デフォルトの名無しさん :2005/09/23(金) 00:07:54
参照をメンバに持つクラスを複数持ちたいときハマるよね。

826 名前:822 :2005/09/23(金) 00:08:53
class Color {
  union {
    float color[4];
    struct {
      float c1;
      float c2;
      float c3;
      float c4;
    };
  };

  Color(void) : c1(0.0),c2(0.0),c3(0.0),c4(0.0) {};
  Color(float* c) : c1(*c),c2(*(c+1)),c3(*(c+2)),c4(*(c+3)) {};
};

こんな感じでやってる。

827 名前:デフォルトの名無しさん :2005/09/23(金) 00:13:23
>>826
float4つだからAltiVecかSSEのコードかと思った。

828 名前:デフォルトの名無しさん :2005/09/23(金) 00:19:00
>>826
組込型なら、そういう場合は割り切ってコンストラクタの中で記述するのがいいかと。

829 名前:822 :2005/09/23(金) 00:25:38
そんなもんか。dd

830 名前:デフォルトの名無しさん :2005/09/23(金) 20:13:01
>>819
strを単なる文字型の配列として使っていたら最後が'\0'で終わってるとは限らないから有効なんじゃ、と
一瞬思ってしまったorz
'\0'で終わってなかったらstrlen使えないよな。sizeofならともかく。

831 名前:デフォルトの名無しさん :2005/09/24(土) 01:20:45
BCCでコンパイルしたときSleepが未定義の関数ってなるのは俺だけ?

832 名前:デフォルトの名無しさん :2005/09/24(土) 01:41:16
>>831
必要なライブラリにリンクしてても出るんなら
あんただけ。

833 名前:デフォルトの名無しさん :2005/09/24(土) 12:42:26
イテレータってポインタの代わりとして長期間保持していてるのって普通?
それともイテレータは基本的に複数要素に順番にアクセスするために
あるのであって、単にコンテナ内の一つの要素のアドレスを
長期間保持して好きなときに要素にアクセスしたいだけ(ptr++等のポインタ演算も行わない)
の場合、生ポインタを保持しておいたほうがいいの?

834 名前:デフォルトの名無しさん :2005/09/24(土) 12:42:56
質問です。
演算子のオーバーロードは継承した場合引き継がれないのでしょうか。

クラスで演算子のオーバーロードをしました。
class CBase{
(略)
void operator =(CBase*);
};
で、その後CBaseを継承したクラスを作成
class CMain : public CBase{
(略)
}

void main(){
CMain a;
a = new CBase();
}
としたところコンパイルエラーなのです。
ためしに
class CMain : public CBase{
(略)
void operator =(CBase*);
}
としてみたところ、コンパイルがとおりました。
つまり演算子のオーバーロードは継承されないのかなと感じたわけです。
これはそうなのでしょうか。

835 名前:デフォルトの名無しさん :2005/09/24(土) 12:46:26
>としたところコンパイルエラーなのです。
内容書けや

836 名前:デフォルトの名無しさん :2005/09/24(土) 12:52:35
>>833
イテレータは、ポインタの概念を大きく拡張したもの。
君の言っているポインタは、random access iteratorの事だと思うが、
C++ STLのコンテナや、ストリームは、自由にあちこちをアクセスできない
物がある。

イテレータをそれぞれの属性を持った物として定義する事により、その
コンテナやストリームの意味を逸脱しない範囲でアクセス出来るように
なっている。

それから、長時間保持するとあるが、コンテナのメンバ関数にはイテレータ
を無効にする物があるので、保持しても無意味。

837 名前:デフォルトの名無しさん :2005/09/24(土) 13:03:19
>>833
イテレータが無効になるタイミングを把握しているのなら、
長期間保持してもいい。
イテレータとしての操作が不要であれば、
生ポインタのほうがサイズや処理効率の面で
パフォーマンスがいいこともある。

>>836
map や list などのイテレータは、
指してる要素の削除以外では無効にならないんで、
長期間保持するのはよくあることだよ。

838 名前:デフォルトの名無しさん :2005/09/24(土) 13:09:19
>>834
演算子のオーバーロードも継承される。
ただし代入演算子の場合はうまくいかない。

同じクラスの代入用 T& operator = (T const&) はクラスを定義ごとに必ず宣言される。
ユーザーが宣言しなくても、コンパイラが自動的に宣言する。

前者のケースではコンパイラが自動的に追加した宣言によって
CBase の operator = が隠れてしまっている。

839 名前:デフォルトの名無しさん :2005/09/24(土) 13:25:25
>>838
あらー、代入演算子だけはダメなんですか。
ありがとうございます。

いちいち代入演算子のオーバーライドに長々プログラム書くのはアレなので、
CBaseにInsert()という関数を作ってそれを呼ぶようにします。

void operator =(CBase* p){
insert(p);
}

>>835
失礼しました。
error C2679: 二項演算子 '=' : 型 'class Image *' の右オペランドを扱う演算子は定義されていません。(または変換できません)
でした。

840 名前:デフォルトの名無しさん :2005/09/24(土) 13:47:41
>>839
そんなことするぐらいなら、全部 Insert() 使ったほうがいいぞ。
ただ便利だからと言うだけの理由で
組み込み型と意味の違う代入演算子を作るのはよくない。

さらに、 >834 の例だと a = 0 なんてコードもコンパイルが通る。
new の戻り値を生ポインタで受け取るのも危ない。

841 名前:デフォルトの名無しさん :2005/09/24(土) 14:18:16
>>837
例えばstd::mapが赤黒木で構成されているとして、挿入後回転や二重回転
が起きてもイテレータは全部有効なのか?

insert()が挿入後の新しいイテレータを返すようになっている仕様は、そういう
意味だと思っていたが。

842 名前:デフォルトの名無しさん :2005/09/24(土) 14:18:19
>>840
>ただ便利だからと言うだけの理由で
>組み込み型と意味の違う代入演算子を作るのはよくない。
なるほど、確かにその通りですね。
じっくり考えてみます。ありがとうございます。


843 名前:デフォルトの名無しさん :2005/09/24(土) 14:54:15
>>837
なるほど。そういう感じで使い分ければいいのですか。
ありがとうございます。

>>841
ISO/IEC 14882:1998
23.1.2 Associative containers
-8-
The insert members shall not affect the validity of iterators and references to the container,
and the erase members shall invalidate only iterators and references to the erased elements.
なので>>837さんが正しいです

844 名前:デフォルトの名無しさん :2005/09/25(日) 07:39:18
LinuxでMPIを使ったC++コードのデバッグをVC++みたいに
やるにはTotalViewとかを導入するしかないですか?

フリーのデバッガでMPIプログラムのデバッグをやるのに
便利なツールがあれば教えて下さい。

845 名前:デフォルトの名無しさん :2005/09/25(日) 09:42:09
>>844
スレ違い。>1くらい読んでくれ。

846 名前:デフォルトの名無しさん :2005/09/25(日) 14:31:15
>>832
ありがと。
ライブラリにリンクするの忘れてた。
オレが糞なだけだったよー。

847 名前:デフォルトの名無しさん :2005/09/25(日) 18:12:55
派生クラスのインスタンスを基底クラスのポインタに入れると
仮想関数も基底クラスで定義したものに変わるの?

848 名前:デフォルトの名無しさん :2005/09/25(日) 18:16:50
変わったら仮想関数の意味がないじゃない。

849 名前:デフォルトの名無しさん :2005/09/25(日) 18:18:05
まさにそれを変わらないために作られたカラクリが仮想関数なんだしな

850 名前:デフォルトの名無しさん :2005/09/25(日) 18:18:56
そうだよね。何がおかしかったんだろ

851 名前:デフォルトの名無しさん :2005/09/25(日) 18:30:32


852 名前:デフォルトの名無しさん :2005/09/25(日) 19:12:06
。・゚・(ノД`)・゚・。

853 名前:デフォルトの名無しさん :2005/09/25(日) 23:11:50
わかりにくかったらすみません。
Visual C++6.0なんですけど

struct 1_t {int s ;
int t ;
int u ;
} ;

struct 2_t {int A[N][N] ;
int B[N] ;
int C[Y] ;
int D[Y] ; 
} ;

struct 3_s {struct 1_t 1_s ;
struct 2_t 2_s ;
int E[2] ;
} 3_t[V][W] ;

って感じで構造体配列をヘッダで生成して、Mainで

struct 3_s *p = 3_t ;

ってやってポインタ代入するんですが、新しい動作:
C2440エラーってのが出ます。
色々試してみると、1次元配列にするとエラーが
出ないようなのですが。

854 名前:デフォルトの名無しさん :2005/09/25(日) 23:15:30
pは3_sへの単純なポインタだから1次元配列相当
struct 3_s *p = 3_t[0];なら代入はできるだろう

855 名前:デフォルトの名無しさん :2005/09/25(日) 23:21:46
>>854
早速の回答ありがとうございます。
試してみたところエラーは無くなりました。

以前そういう記述を読んだ記憶がわずかにあるの
ですが今手元に参考書が無いので確認できません。
とにかくありがとうございました。

856 名前:デフォルトの名無しさん :2005/09/25(日) 23:54:22
>>853
標準では、名前は非数字から始まらなくてはならないと規定されているから、そんな名前は避けること。


857 名前:デフォルトの名無しさん :2005/09/26(月) 01:31:10
>>855
struct 3_s (*p)[W] = 3_t; でもいけるだろ。こちらは二次元配列風にアクセス
できる、配列へのポインタとなる。

858 名前:デフォルトの名無しさん :2005/09/26(月) 22:59:42
>>809です
皆様、いろいろご指導ありがとうございました。
mblenを使って解決いたしました。

859 名前:デフォルトの名無しさん :2005/09/27(火) 03:22:25
質問です。

暗黙のキャストが行われている箇所を明示的なキャストに変更する事によって、
処理速度が遅くなるといったことはあるのでしょうか?

860 名前:デフォルトの名無しさん :2005/09/27(火) 03:23:53
ありません

861 名前:デフォルトの名無しさん :2005/09/27(火) 03:42:03
>>859
暗黙のキャストを明示しただけなら、遅くなることは無い。
だが明らかに、そんなことはしないほうがいい。

862 名前:デフォルトの名無しさん :2005/09/27(火) 03:46:14
dinamic_castに変更したら遅くなるかもねー

863 名前:デフォルトの名無しさん :2005/09/27(火) 03:46:59
○dynamic_cast


釣ってくる

864 名前:デフォルトの名無しさん :2005/09/27(火) 03:48:50
>>861
式の可読性のために明示することはあるけどね。

865 名前:859 :2005/09/27(火) 03:51:09
回答ありがとうございます。

>>861
明らかにそんなことしないほうがいいというのは、
そもそもキャストする必要がないようにコードを書き直すべき、
という意味でしょうか?

866 名前:デフォルトの名無しさん :2005/09/27(火) 04:09:22
C++ で以下のようなコードを書くと

typedef struct {
int i;
} foo;

typedef struct {
foo foo;
} bar;

gcc 3.3.5 でコンパイルしたときに下記のようなエラーが出てしまいます。

error: declaration of `foo <無名 struct>::foo'
error: changes meaning of `foo' from `typedef struct foo foo'

定義を変えずにこれを回避するにはどうすればよいのでしょうか?
(上記の定義は C のコードとして書かれたもので、私が書き換えることはできません)

書き換えることができるなら bar の定義を次のようにすれば良いのですが...

typedef struct {
foo foo_;
} bar;

867 名前:デフォルトの名無しさん :2005/09/27(火) 08:08:26
ハードゲイ?

868 名前:デフォルトの名無しさん :2005/09/27(火) 08:42:04
>>866
typedefを取れ。

869 名前:デフォルトの名無しさん :2005/09/27(火) 08:43:21
あ、それだけではだめだ。

struct foo {
int i;
};

struct bar {
foo foo;
};


870 名前:デフォルトの名無しさん :2005/09/27(火) 08:54:44
>>869
書き換えない前提だとさ。

871 名前:デフォルトの名無しさん :2005/09/27(火) 10:18:07
>>865
そうだよ。

>>864
そんなのあるっけ?どんなとき?

872 名前:デフォルトの名無しさん :2005/09/27(火) 10:30:16
>>871
>>864じゃないけど、オーバーロードの絡む場合。たとえば、
unsigned char *addr;
std::cout << "addr = " << (void *)addr << "\n";
とか。

873 名前:デフォルトの名無しさん :2005/09/27(火) 10:42:39
>>872
それは可読性のためじゃなくて、望みの動作をさせるために必要なんだろ。

874 名前:デフォルトの名無しさん :2005/09/27(火) 10:46:19
全ての暗黙の変換を起こらないように書くことなど、実際的不可能だし意味がない

875 名前:デフォルトの名無しさん :2005/09/27(火) 10:51:25
>>874 だれもそんな話はしてないわけだが。

876 名前:デフォルトの名無しさん :2005/09/27(火) 11:19:43
畜生。規格書にはanonymous union についてしか書いてないな。

877 名前:デフォルトの名無しさん :2005/09/27(火) 11:31:40
>>866
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407

こんな話で規格がごたごたしている現状では無理だな。

878 名前:デフォルトの名無しさん :2005/09/27(火) 11:35:16
↓これなら通るみたい。

typedef struct foo {
int i;
} foo;

typedef struct {
struct foo foo;
} bar;

こういう混乱を避けるため、Cのコード書くときは
・無名の struct/unon/enum は使わない。
・struct/union/enum を省略するためだけの typedef は避ける
というガイドラインを実施したほうがよさそう。

879 名前:デフォルトの名無しさん :2005/09/27(火) 11:37:01
MSVCだとそのまま通るな。gccの問題か?

880 名前:デフォルトの名無しさん :2005/09/27(火) 13:24:54
gcc では問題なくて、g++ で error だな。
コンパイラ換えるか、そこだけでも C(not C++)にするか…
>>866
いずれにせよ、書き換えることができない、という前提自体が間違いなので、
お好きにすれば、としかならないなあ。

881 名前:872 :2005/09/27(火) 16:27:23
>>873
勘違いしてた。
でも、unsigned char *の代わりにint *ならどうよ。

882 名前:デフォルトの名無しさん :2005/09/27(火) 18:06:13
>>866
元のヘッダをlegacy.hとして
$ cat legacy.h
#ifndef Legacy_H
#define Legacy_H
typedef struct {int i;} foo;
typedef struct {foo foo;} bar;
#endif
$ cat bar.h
#ifndef Bar_H
#define Bar_H
#ifdef __cplusplus
extern "C" {
struct bar;
struct foo;
#else
# include "legacy.h"
#endif
struct Bar {bar *bar_;};
struct Bar *init_bar (struct Bar *p);
int *access_foo_i (struct Bar *p);
#ifdef __cplusplus
}
#endif
#endif
(続く)


883 名前:デフォルトの名無しさん :2005/09/27(火) 18:06:44
$ cat bar.c
#include "bar.h"
#include <malloc.h>
struct Bar *init_bar (struct Bar *p)
{
p->bar_ = (bar *)malloc (sizeof (bar));
return p;
}
int *access_foo_i (struct Bar *p)
{
return &p->bar_->foo.i;
}
$ cat test.cpp
#include <iostream>
#include "bar.h"
using namespace std;
int main ()
{
Bar b0;
init_bar (&b0);
*access_foo_i (&b0) = 10;
cout << *access_foo_i (&b0) << endl;
return 0;
}
$ gcc -c bar.c
$ g++ -o test test.cpp bar.o
$ ./test
10
でどう?


884 名前:デフォルトの名無しさん :2005/09/27(火) 19:09:41
>>882

> (上記の定義は C のコードとして書かれたもので、私が書き換えることはできません)

て書いてあるからifdef __cplusplusマクロなんぞも追加できないだろう

885 名前:882 :2005/09/27(火) 19:48:04
>>884
オリジナルと別に用意したラッパに加えるのはいいのでは?


886 名前:デフォルトの名無しさん :2005/09/27(火) 21:42:54 ID:0
>>885
……まさかと思ったが本気のつもりでこんなコードを……
まあくそみたいな前提にはそれにふさわしい例がつくという見本として……

887 名前:デフォルトの名無しさん :2005/09/27(火) 22:26:45 ID:0
そのlegacy.hを使いたい関数だけCでオブジェクトファイルを作ってリンクしたらいいんでない?

888 名前:デフォルトの名無しさん :2005/09/27(火) 23:03:33
>>886
ライブラリかなんかなんでしょ?
くそみたいなってのには違いないけど


889 名前:デフォルトの名無しさん :2005/09/27(火) 23:15:48
>>887
>>880
>>888
「ライブラリかなんか」でも無条件に書き換えられないわけではあるまいに。
どっちにしてもくそみたいなもんだが。
つか、とことん無意味に前提や条件をとり違えて問題点を見失っとるわけだが。

890 名前:866 :2005/09/28(水) 00:05:44
皆さんいろいろとありがとうございます。
有効打はなさそうですね...

ありがとうございました。

891 名前:デフォルトの名無しさん :2005/09/28(水) 19:07:21
質問です。
operatorのオーバーライドで、
int n;
CHoge c;
n = c;

という式を処理させたいのです。
どうにかintへの=をオーバーライドする術はないものでしょうか。

892 名前:デフォルトの名無しさん :2005/09/28(水) 19:13:19
=じゃなくてoperator int()作れば?

893 名前:デフォルトの名無しさん :2005/09/28(水) 19:36:59
>892
お返事ありがとうございます。
ただすいません、operator int() というのがどういうものなのか分かりません。

オーバーライド系の解説サイトはロベールさんのところをはじめ、あっちこっち見たのですが。
もしよければそれについて詳しいサイトを教えていただけませんでしょうか。

894 名前:デフォルトの名無しさん :2005/09/28(水) 19:55:03
だめだこりゃ

895 名前:デフォルトの名無しさん :2005/09/28(水) 20:05:31
>>893
自分で検索する癖を付けろ
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/csref/html/vcwlkuser-definedconversionstutorial.asp

896 名前:デフォルトの名無しさん :2005/09/28(水) 20:08:07
それC#じゃね?w

897 名前:デフォルトの名無しさん :2005/09/28(水) 20:09:20
>>893
続けるなら初心者スレへどうぞ。

898 名前:デフォルトの名無しさん :2005/09/28(水) 20:13:14
了解しました。初心者スレに移動します。

899 名前:デフォルトの名無しさん :2005/09/29(木) 06:00:30
ロベールさんって誰やねんw

900 名前:デフォルトの名無しさん :2005/09/29(木) 15:00:22
>>899
ttp://www1.kcn.ne.jp/~robe/

901 名前:デバッグ生活6週間目 :2005/09/30(金) 14:19:11
初学者はつい目先のコンパイルエラーの解消に夢中になるあまり
考察の足りない小手先の修正をして事態を悪化させることがある。
最近デバッグ中に、某ソフトウェア・ハウスへ数年前に外注したコード中で
この例の反面教師となるようなダメかつ姑息なコードを見つけて
唖然としたので晒しておく。

まずは背景解説。

class A {
  public:
  A(void) {;}
  //...(omit)
  virtual void v(void)=0;
   //pure virtual function
};

class D : public A {
  D(void) : A() {v();}
   // pure virtual function is called!
  //...(omit)
  void v(void) {/* anything */;}
};

こういうコードはC++では実行結果が不定になる。
(分かりやすく言うと書いちゃだめ。)
仮想関数のセットアップはコンストラクタの実行の
どの段階で行われるか規格は敢えて厳密には決めていないからだ。
仮想関数をコンストラクタ中で呼び出すことはそもそも微妙だが、
特に純粋仮想関数の場合は深刻で、結果は不定だと明示されている。
気の利いたコンパイラなら上掲のコードについてエラーを報告するだろう。
(余談だがJavaのコンストラクタは根本的にC++と動作が違うのでOK。)


902 名前:& ◆uJ1hK4x8zw :2005/09/30(金) 14:20:21
>>901から続く)
で、エラーを出されたからといってその意味を深く考えないで:

class A {
  public:
  A(void) {;}
  //...(omit)
  virtual void v(void)={throw new NotCallException();}
    //Non pure virtual function in the appearance only.
};

とかやって見かけ上だけ小手先で回避しようとするのはよくない。
本当に仮想関数をコンストラクタ内で呼び出す必要があるのかどうか、
もしあるならどういうタイミングでどの関数が呼び出されるか
じっくり考えてみるべきだ。

903 名前:デバッグ生活6週間目 :2005/09/30(金) 14:22:14
>>902から続く)
まして:

class A {
  public:
  A(void) {;}
  //...(omit)
  virtual void v(void)=0;
    //pure virtual function
  protected:
  void bypass(A* a) {a->v();}
};

class D : public A {
  D(void) : A() {bypass(this);}
    // Ooops!! pure virtual function is called!
  //...(omit)
  void v(void) {/* anything */;}
};

などとやってコンパイラを出し抜こうと考えるのは
以ての外である。
これはコンパイラが検出可能だったシンプルな問題を
ロジックをスパゲティ化することで
コンパイラにも人間にも
見つけにくい実行時エラーに変えて
隠蔽したに過ぎない最低のコードになる。

904 名前:& ◆uJ1hK4x8zw :2005/09/30(金) 14:26:38
>>901-903
以上、こういうコードは真似しないようにしようというお話。
以下これを見つけた私がどう思ったかは愚痴スレでw

ぐち0x12 〜底なし沼はなお深く〜
http://pc8.2ch.net/test/read.cgi/prog/1116475364/

905 名前:デフォルトの名無しさん :2005/09/30(金) 17:38:48
宣伝死ねって事でいいんだろうか

906 名前:デフォルトの名無しさん :2005/09/30(金) 18:13:12
最初は愚痴の部分まで一気に書きかけたが、
誘導される前に自己誘導&自粛したってことで。

907 名前:デフォルトの名無しさん :2005/09/30(金) 20:44:40
愚痴の部分抜いたら初心者でもマトモな脳みそがあれば
自分で分かるような事を偉そうに書いただけになるんだが。

908 名前:デフォルトの名無しさん :2005/09/30(金) 23:10:12
長すぎ。3行で飽きて読むのやめた。

909 名前:デフォルトの名無しさん :2005/10/01(土) 00:48:25
>>901-908
全部自作自演って落ちなんだろ?

910 名前:デフォルトの名無しさん :2005/10/01(土) 05:52:26
>>901
コンストラクタ内で仮想関数を呼び出したときの動作については
規格中に記述があるよ。 12.7.3 がそう。
 D(void) : A() {v();}
ここでは D::v() が呼び出される。
そして D::v() は純粋仮想関数では無いので、
呼び出し自体に問題は無い。

偉そうな長文が間抜けだな。

911 名前:デフォルトの名無しさん :2005/10/01(土) 17:16:30
偉そうな奴は大抵間抜けだからな。

912 名前:デフォルトの名無しさん :2005/10/02(日) 02:05:03
メンバ関数ポインタのポインタをtypedefを使わずにどのように定義したらいいんでしょうか?

typedef void(*ClassName::Func)();
Func* f;
のFunc*をtypedefを使わずに定義したいんです。

単なるメンバ関数のポインタなら
void(ClassName::*f)();
でいいんですが....

913 名前:デフォルトの名無しさん :2005/10/02(日) 02:09:44
>>912
みずらくなるからやめれ

914 名前:デフォルトの名無しさん :2005/10/02(日) 05:03:17
std::string型の変数に"2.5"や"4.7"などの小数点を含む数字の文字列が格納されているのですが、
これを数字として扱って加減乗除するにはどうすればいいですか?

915 名前:デフォルトの名無しさん :2005/10/02(日) 07:33:08
こんな感じかな
std::string s = "2.5";
double x;
std::sscanf(s.c_str(), "%lf", & x);

916 名前:デフォルトの名無しさん :2005/10/02(日) 07:44:26
>>915
いい加減Cの呪縛から逃れろ。
>>914
boost::lexical_cast<double>(str)を使うか、std::stringstream s(str); s >> d;
などどやる。

917 名前:デフォルトの名無しさん :2005/10/02(日) 08:42:15
>>915
C流でやるならせめてstd::atof(s.c_str())にしてくれ。

918 名前:デフォルトの名無しさん :2005/10/02(日) 09:31:40
>>912
俺もそのままtypedef使えとは思うが、こういう手段を知っていても損はないと思う。
#include <iostream>
#include <typeinfo>

class ClassName {};
typedef void (*ClassName::Func)();

int main()
{
    std::cout << typeid (Func *).name() << std::endl;
}

919 名前:デフォルトの名無しさん :2005/10/02(日) 09:54:02
>>916
C++は両方とも糞重いのが難点
まあlexical_castも中でstringstream使ってるから当たり前だけど。

920 名前:914 :2005/10/02(日) 10:49:27
>>915-916
ありがとうございました。お蔭様でうまくいきました。

921 名前:デフォルトの名無しさん :2005/10/02(日) 10:50:13
貧弱シンプルC路線で行くか重厚楽々C++路線で行くか

922 名前:デフォルトの名無しさん :2005/10/02(日) 10:51:29
それを好きに選べることがC++のいいところでもある。

923 名前:デフォルトの名無しさん :2005/10/02(日) 11:24:32
でも単なる変換ならatofのが早くて楽な罠。
sscanfは使わないけど。。

924 名前:デフォルトの名無しさん :2005/10/02(日) 18:06:18
大量にメモリを確保する予定がある場合、
配列で一気に確保するのと、ちまちま一つずつnewしていくのでは、どちらが確実なのでしょうか。
速さは問いません。

配列の方が無駄が無さそうですが、
素人目にはしかし、連続したメモリ空間が無いと失敗しちゃいそうなイメージがあります。

925 名前:デフォルトの名無しさん :2005/10/02(日) 18:13:54
>>924
どっちかと言うと、ちまちま一つずつのほうが成功しやすいだろうな。

ページングの効く環境であれば、物理メモリの
フラグメンテーションによる危険性はほとんど無視できるんで、
あんまり差は無いと思うよ。

926 名前:デフォルトの名無しさん :2005/10/02(日) 18:29:15
関係ないけどC++にとってatoiは標準ライブラリなの?
単に好みとしてC++の標準ライブラリだけを使いたくなるものジャン。
でもC++でatoiみたいなことするにはstrstreamに対して<<とか使うんでそ?めんどい


927 名前:デフォルトの名無しさん :2005/10/02(日) 18:31:22
>>926
じゃあなんでstdネームスペースがあるんだよって言いたくなる

928 名前:デフォルトの名無しさん :2005/10/02(日) 18:38:07
atoi
The return value is 0 if the input cannot be converted to a value of that type.
だれじゃこんな糞仕様にしたのは

929 名前:デフォルトの名無しさん :2005/10/02(日) 18:41:21
ごめん

930 名前:デフォルトの名無しさん :2005/10/02(日) 18:42:06
そんな時はstrtolですよ。

931 名前:924 :2005/10/02(日) 18:58:41
>>925
用語を調べていたら遅くなってしまいすいません。
おかげでとても勉強になりました。ありがとうございました。

932 名前:デフォルトの名無しさん :2005/10/02(日) 19:25:07
Cに由来する標準ライブラリ関数を残らず再設計してリプレースしてほしい

933 名前:デフォルトの名無しさん :2005/10/02(日) 19:39:43
>>926
少なくともJIS X3014:2003では<c〜>もその他のヘッダも全く同列に扱われている。
もっとも<c〜>のほとんどはCの<〜.h>と同じと書かれているが。

934 名前:デフォルトの名無しさん :2005/10/02(日) 19:43:09
>>926
そんでもってstrstreamはほかとは別扱いで附属書D 互換性に載せられている。

935 名前:デフォルトの名無しさん :2005/10/02(日) 20:19:02
そりゃあstrstreamはdeprecatedだからな

936 名前:デフォルトの名無しさん :2005/10/02(日) 20:31:15
>>928
文句があるなら>930
私ゃ妥当な仕様だと思うがね。

937 名前:デフォルトの名無しさん :2005/10/02(日) 23:44:16
そういや、strstreamは使った事ないな。俺がC++始めた時には既に
標準規格が決まっていて、strstreamは使わないでください、みたいな
事が書いてあったな。でもこれを使ってるプログラムはたくさんあるわけで、
過去との互換性に残すんでしょ?

938 名前:デフォルトの名無しさん :2005/10/02(日) 23:47:09
strstreamは規格化(?)されたときにすごく非難された、とは聞いたことがある。
んだからstrstreamを使ってるプログラムはほとんどないんじゃない?

939 名前:デフォルトの名無しさん :2005/10/02(日) 23:52:02
>>926はstringstreamを知った上でわざとstrstreamを出したのかな

940 名前:デフォルトの名無しさん :2005/10/03(月) 00:01:27
>>938
ISO/IEC 1482:1998の通り、標準規格が決まったのは1998年の事で、C++自体は
1985年頃からあるわけで、その13年間でdeprecatedなプログラムが書かれた可能性
はどうかな?

あ、そうか、STLそのものは1993年にC++への組み込みが提案され、1994年に正式
に取り入れられる事が決まったので、たった4年ほどしかstd::strstreamを安心して
使える時期はなかったんだね。

941 名前:デフォルトの名無しさん :2005/10/03(月) 11:34:47
>>910
その動作は10年前から知ってる。
…だからわざわざ絶対にまずい純粋仮想関数の場合と分けて
「微妙だ」と書いたんだが。

仮想関数がコンストラクタ内でだけは通常のようなオブジェクトの動的な型ではなく、
静的な型に従って呼び出されるというのは決して直感的に分かりやすい動作とは思えない。
(その呼び出しそのものは確かに動作として安全ではあっても、
その仮想関数からさらに仮想関数が呼ばれたりRTTIが利用されたりした場合の
動的な型と静的な型がどうなっているか考えると頭が痛くならないか?
多分このようにコンストラクタ内でだけ仮想関数の動作が「特別扱い」される仕様は
古いC++コードとの互換性のために残ってしまった仕様ではないかと思う。
そしてこの微妙な仕様のせいで純粋仮想関数をコンストラクタ内で呼ぶのは
呼ぶ相手がなくなるために具合が悪いわけだ。
純粋仮想関数のほうが歴史的には後でできた仕様だったからこうなったのだろうが。)

・・・なので絶対に必要なとき以外はやはり書かないに越したことはにと思うのだ。
(もっともその「絶対に必要な例」は中々思いつけないが。)
というわけで例に挙げたコードのように論理的には純粋仮想関数であるべきものを
コンパイルエラー回避目的でエラー例外を投げる仮想関数に書き換えるのは
決して必要に迫られて熟慮した結果というよりはやっぱり性質の悪い小手先の誤魔化しだと思う。

942 名前:謹んで訂正 :2005/10/03(月) 11:40:10
>>941
・書かないに越したことはにと思うのだ→書かないに越したことはないと思うのだ
・決して必要に迫られて→ 必要に迫られて

943 名前:デフォルトの名無しさん :2005/10/03(月) 12:47:27
>>901
>こういうコードはC++では実行結果が不定になる。
>(分かりやすく言うと書いちゃだめ。)
>仮想関数のセットアップはコンストラクタの実行の
>どの段階で行われるか規格は敢えて厳密には決めていないからだ。
>仮想関数をコンストラクタ中で呼び出すことはそもそも微妙だが、
>特に純粋仮想関数の場合は深刻で、結果は不定だと明示されている。
>気の利いたコンパイラなら上掲のコードについてエラーを報告するだろう。

・初心者も読むスレッドでこういう嘘を平気で書き、なおかつ指摘されても訂正もしない
・他人のミスとも言えないようなミスはことさらに(誤りを含んだ)長文で指摘する
・しかも多分スレ違い。

944 名前:デフォルトの名無しさん :2005/10/03(月) 12:57:50
>>943
たぶん、得意げになりたかっただけだろ。
スルーで勘弁してやってくれ。

945 名前:デフォルトの名無しさん :2005/10/03(月) 13:43:37
>>941
恥をかきたくなかったら、最低でも、規格書のどこを読めば
そんな動作をするか、リファレンス先を書いておけ。

ま、この場合完全な嘘だから、リファレンス先などありはしないがな。

946 名前:デフォルトの名無しさん :2005/10/03(月) 14:39:13
>>941
D&E読め。
コンストラクタで仮想関数呼び出しでは派生クラスでオーバーライドしたほうの関数が呼ばれない理由がちゃんと書いてある。

ようするに派生クラスでオーバーライドした仮想関数の実装が
その派生クラスのコンストラクタが行われていることに依存していたら、
派生クラスのコンストラクタが呼ばれる前(== 基底クラスのコンストラクタの中)で、
派生クラスでオーバーライドされた仮想関数が呼ばれたらまずいことになる、
だからはコンストラクタでの仮想関数呼び出しでは派生クラスでオーバーライドした関数は呼ばれない仕様にしたと書いてある。

947 名前:デフォルトの名無しさん :2005/10/04(火) 00:53:48
>>941
この動作がいかに(マシンにとって)自然であるか理解していないのなら、
10年もの間、誤解していたことになるな。

948 名前:デフォルトの名無しさん :2005/10/04(火) 00:57:10
>>941は自我崩壊寸前です。

949 名前:デフォルトの名無しさん :2005/10/04(火) 01:27:04
>>941はJavaから入ったに違い無い

950 名前:デフォルトの名無しさん :2005/10/04(火) 01:44:15
>>941 ワロスwwwwnwっうぇwuwwwrwuwっうぇwwpwwwwwow

951 名前:デフォルトの名無しさん :2005/10/04(火) 03:12:06
さあ、そろそろ>>941の長文が飛び出すぞw

952 名前:デフォルトの名無しさん :2005/10/04(火) 03:31:20
晒し上げしていいの?

953 名前:デフォルトの名無しさん :2005/10/04(火) 08:32:32
ドゾー

954 名前:デフォルトの名無しさん :2005/10/04(火) 11:12:11
ここまで説得力の無い長文の言い逃れは久々に見たw

955 名前:デフォルトの名無しさん :2005/10/04(火) 17:54:10
>>941
俺はもう長くは無いだろう
まで読んだ

956 名前:デフォルトの名無しさん :2005/10/04(火) 18:38:45
>>941の素晴らしい反論マ━(゚∀゚)━( ゚∀)━( ゚)━( )━(゚ )━(∀゚ )━(゚∀゚)━ダ????

957 名前:デフォルトの名無しさん :2005/10/04(火) 18:42:41
ここまで俺の自演

958 名前:namahage :2005/10/04(火) 20:55:24
sinxをテーラー展開するプログラムを教えてください

959 名前:デフォルトの名無しさん :2005/10/04(火) 21:07:37
なんてやる気の無い質問者なんだ

960 名前:デフォルトの名無しさん :2005/10/04(火) 21:21:57
マルチか......
別のとこで答えて損した。

961 名前:950 :2005/10/05(水) 00:08:40
スルーされると寂しい。(´・ω・`)ショボーン

962 名前:デフォルトの名無しさん :2005/10/05(水) 00:40:19
これだけ叩かれると俺だったら勃起しちゃうな。羨ましいぜ>>941

963 名前:950 :2005/10/05(水) 02:52:59
チクショー、このスレにはヌルポハンターはいないのか・・・

964 名前:デフォルトの名無しさん :2005/10/05(水) 07:31:33
キムチでも呼んで来い

965 名前:デフォルトの名無しさん :2005/10/05(水) 20:20:49
そろそろ誰か次スレ建ててくれよ。俺建てようと思ったけどダメだった。

966 名前:デフォルトの名無しさん :2005/10/05(水) 21:01:39
>>965
立てた
C++相談室 part44
http://pc8.2ch.net/test/read.cgi/tech/1128512737/

967 名前:デフォルトの名無しさん :2005/10/06(木) 01:00:48
>>967


968 名前:デフォルトの名無しさん :2005/10/06(木) 01:08:07
>>967
相手が違うw

969 名前:デフォルトの名無しさん :2005/10/06(木) 01:15:07
>>967


970 名前:デフォルトの名無しさん :2005/10/06(木) 04:44:46
>>966
そんなに感謝されたいのか。
>>967


971 名前:デフォルトの名無しさん :2005/10/06(木) 09:01:21
>>967



972 名前:デフォルトの名無しさん :2005/10/06(木) 15:20:03
そうだ、埋めよう。

973 名前:デフォルトの名無しさん :2005/10/06(木) 16:01:11
padding

974 名前:デフォルトの名無しさん :2005/10/06(木) 17:41:09
std::cout << "ume" << endl;

975 名前:デフォルトの名無しさん :2005/10/06(木) 17:44:32
std::cin >> "ツンデレ";

976 名前:デフォルトの名無しさん :2005/10/06(木) 17:45:31
C++飽きてきた
誰もソース読もうとしない
さみしい
凄いですね、オブジェクト指向ですねっておまえらバカにしてるだろ……

977 名前:デフォルトの名無しさん :2005/10/06(木) 18:12:24
>std::cin >> "ツンデレ";
これ実行したらどうなるの?

978 名前:デフォルトの名無しさん :2005/10/06(木) 18:15:44
そ、そんなこと聞かないでよ!(*`Д´)

979 名前:デフォルトの名無しさん :2005/10/06(木) 18:16:21
多態の説明にツンとデレが使えるとおもった

980 名前:デフォルトの名無しさん :2005/10/06(木) 18:25:19
stateパターン?

981 名前:デフォルトの名無しさん :2005/10/06(木) 18:27:05
ツンデレ萌え埋め

982 名前:デフォルトの名無しさん :2005/10/06(木) 20:42:33
ちんたら埋めてんじゃねーよ

983 名前:デフォルトの名無しさん :2005/10/06(木) 20:45:30
30分以内に埋まったら職安に行く。

984 名前:デフォルトの名無しさん :2005/10/06(木) 20:46:23
おいおまいら!
983を職安に連れて行くぞ!

985 名前:デフォルトの名無しさん :2005/10/06(木) 20:52:36
うめ

986 名前:デフォルトの名無しさん :2005/10/06(木) 20:53:52
>>983
一緒にこたちょの実況やろうぜ!

987 名前:デフォルトの名無しさん :2005/10/06(木) 20:54:03
ume

988 名前:デフォルトの名無しさん :2005/10/06(木) 21:52:57


989 名前:デフォルトの名無しさん :2005/10/06(木) 23:14:53
>>983はニート継続

990 名前:デフォルトの名無しさん :2005/10/06(木) 23:25:20
うーーーーーーーーーーーめええええええええええええええええええええええええええええええええええええ

991 名前:デフォルトの名無しさん :2005/10/06(木) 23:32:04


992 名前:デフォルトの名無しさん :2005/10/06(木) 23:44:20
青樹

993 名前:デフォルトの名無しさん :2005/10/06(木) 23:53:07
C++相談室 part44
http://pc8.2ch.net/test/read.cgi/tech/1128512737/l50
一応張っておく。

994 名前:デフォルトの名無しさん :2005/10/07(金) 00:26:52
30分以内に埋まらなかったら株価大暴落

995 名前:デフォルトの名無しさん :2005/10/07(金) 00:27:39
ここから>>1000までは悲惨な>>983をなぐさめるスレ

996 名前:デフォルトの名無しさん :2005/10/07(金) 00:27:56
出遅れた。983の無職は続く…

997 名前:デフォルトの名無しさん :2005/10/07(金) 00:32:51


998 名前:デフォルトの名無しさん :2005/10/07(金) 00:35:41
1000


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