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


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

C++相談室 part13
751 名前:デフォルトの名無しさん :02/12/20 19:04
d2fc22-022.tiki.ne.jp

752 名前:デフォルトの名無しさん :02/12/20 19:53
>>749
> 何か間違っているのでしょうか?
お前の関数の書き方。

753 名前:デフォルトの名無しさん :02/12/20 20:06
>>749
その .cpp での実装もさらせ。

754 名前:デフォルトの名無しさん :02/12/20 20:07
>>749
普通に通るけど何か問題でも?

class Baka
{
friend std::ostream& operator<<(std::ostream& os, const Baka& obj);
int aho;
public:
Baka(int i) : aho(i) {}
};

std::ostream& operator<<(std::ostream& os, const Baka& obj)
{
os << obj.aho;
return os;
}

int main()
{
Baka b(123);

std::cout << b << std::endl;
}

755 名前:デフォルトの名無しさん :02/12/20 20:14
friend ostream& operator<<(ostream& os, const Baka& obj);
がprivateだから外からアクセスできないってことだろ。

あ た り ま え だ ボ ケ

756 名前:デフォルトの名無しさん :02/12/20 21:31
>>755
(゚Д゚)ハァ?friend宣言はメンバじゃないよ。

757 名前:749 :02/12/20 22:17
>754
全く同じ様にしてるのですが、
できないんです。何故だろう。

os << obj.aho;

の部分がエラーになります。

因みに、friend関数をpublicにしようが、
privateにしようが同じです。

758 名前:デフォルトの名無しさん :02/12/20 22:26
>>757
「全く同じ様にしてる」ってコピペしてみればいいかも・・・

759 名前:デフォルトの名無しさん :02/12/20 22:28
同じよ同じ。でもちょっとだけ同じじゃないの。

760 名前:デフォルトの名無しさん :02/12/20 22:31
>>759
全コードを載せてくれ。

761 名前:デフォルトの名無しさん :02/12/20 22:33
>>757
friendは宣言だけなんだから、privateにしようがpublicにしようが関係ない。
gcc3.2.1(MinGW)では問題なく通ったぞ。

762 名前:749 :02/12/20 22:35
>758
すいません。コピペしてみて試してみました。
なんと、コンパイル通りました。
よく見てみると、全く同じでは内容です。

baka.hで

namespace Orokamono
{
class Baka
{
friend std::ostream& operator<<(std::ostream& os, const Baka& obj);
int aho;
public:
Baka(int i) : aho(i) {}
};
}

baka.cppで

#include <iostream>
#include "baka.h"
using namespace std;
using namespace Orokamono;
std::ostream& operator<<(std::ostream& os, const Baka& obj)
{
os << obj.aho;
return os;
}

とやると、フレンド関数がクラスのprivateメンバにアクセスできなくなります。
これは、書き方がおかしいのでしょうか?

763 名前:749 :02/12/20 22:43
自己解決しました。ありがとうございます。
どうやら

baka.cppで

ostream& Orokamono::operator<<(ostream& os, const Baka& obj)
{
・・・
}

としたら、できるようです。
これって、標準の正しい書き方ですか?
名前空間をusingしているのにこの書き方はおかしい気がします。

764 名前:デフォルトの名無しさん :02/12/20 22:46
>>762
こうやったら通ったぞ。

std::ostream& Orokamono::operator<<(std::ostream& os, const Baka& obj)
{
os << obj.aho;
return os;
}

765 名前:デフォルトの名無しさん :02/12/20 22:47
>>763
定義する識別子にはusingは関係ない。

766 名前:デフォルトの名無しさん :02/12/20 22:49
>>763
<<演算子そのものもOrokamono名前空間で包んでおかないとだめなのでは?

767 名前:デフォルトの名無しさん :02/12/20 23:04
例えば、
namespace Orokamono {
class Baka {
friend std::ostream& ::operator<<(std::ostream& os, const Baka& obj);
int aho;
public:
Baka(int i) : aho(i) {}
};
}
のような書き方が意味を持つならば(<<がOrokamonoの外にある事を示す)、
<<の定義部ではOrokamono限定子は不要だったろうが、いろいろ試してみたが、
名前空間の外にあるという指示を出すことは出来ないようだ。

768 名前:749 :02/12/20 23:22
名前空間の中にある、クラスの中で
friendの宣言をしているだけで、その関数は名前空間の中で
宣言されてるってことなのでしょうか。

別の名前空間にある関数をfriendにするってこともできなくなるのでは?

769 名前:デフォルトの名無しさん :02/12/20 23:29
>>767
できないんだ?
それは困ったね・・・

770 名前:デフォルトの名無しさん :02/12/20 23:54
>>768>>769
どうも、friendと名前空間は相性が悪いようです。混ぜて使わない方が
良さそうです。

771 名前:デフォルトの名無しさん :02/12/21 00:28
>>770
んなこたーない

772 名前:デフォルトの名無しさん :02/12/21 00:51
>>771
でも、いろいろやってみたけど、他の名前空間に含まれる関数をfriendに
できなかったよ。何か方法あるの?

773 名前:デフォルトの名無しさん :02/12/21 02:09
>772
前方宣言しとけば良いだけでは?

namespace NS { void func(); }

class Foo
{
 ...
 friend void NS::func();
};

774 名前:デフォルトの名無しさん :02/12/21 02:58
>>773
おお!うまく行った!しかし、operator<<の名前空間の解決のためにかなり
おかしな書き方をしなければならんようです。何とかならないものか?

-- baka2.h

namespace Orokamono {
class Baka;
}

namespace Hentai {
std::ostream& operator<<(std::ostream& os, const Orokamono::Baka& obj);
}

namespace Orokamono {
class Baka {
friend std::ostream& Hentai::operator<<(std::ostream& os, const Baka& obj);
int aho;
public:
Baka(int i) : aho(i) {}
};
}

775 名前:デフォルトの名無しさん :02/12/21 02:59
続き
-- baka2.cpp

#include <iostream>
#include "baka2.h"

namespace Hentai {
std::ostream& operator<<(std::ostream& os, const Orokamono::Baka& obj)
{
os << obj.aho;
return os;
}
};

int main()
{
Orokamono::Baka b(123);

Hentai::operator<<(std::cout, b) << std::endl; //これが嫌らしい。何とかならんか?
}

776 名前:デフォルトの名無しさん :02/12/21 03:12
int main()
{
using Hentai::operator<<;

Orokamono::Baka b(123);

std::cout << b << std::endl;
}

のように、こういう時こそusing宣言が役に立ちそうだ。

777 名前:デフォルトの名無しさん :02/12/21 03:56
えーと、議論してる皆さん、Exceptional C++読みなさい。
要点は
・friend関数はclassの構成要素の一部である
 (したがって同じヘッダファイル・同じ名前空間に入れるべきである)
・同じ名前空間にあれば、koenigの名前照合規則が適用される

778 名前:デフォルトの名無しさん :02/12/21 04:08
こんな感じ?

namespace Orokamono {
class Baka {
int i;
friend void print(Baka& b);
public:
Baka(int j) : i(j) {}
};
void print(Baka& b)
{
std::cout << b.i << std::endl;
}
}

void wrapper(Orokamono::Baka& b)
{
print(b); // Koenig lookup
}

int main()
{
Orokamono::Baka b(123);
wrapper(b);
}

779 名前:デフォルトの名無しさん :02/12/21 04:15
もう一つわかっちまった。

int main()
{
Orokamono::Baka b(123);

std::cout << b << std::endl;
}

が動かないのは、operator<<と、bが違う名前空間に属しているため、
koenig名前照合が働かないからだね。この例では、friend宣言した<<
演算子は、bと同じ名前空間に入れてKoenig名前照合が働くようにす
るのがスマートな解決法だと言えるね。

780 名前:デフォルトの名無しさん :02/12/21 04:18
>この例では、friend宣言した<<演算子は、bと同じ名前空間に入れてKoenig名前照合が働くようにする

そう、それを言いたかったの。

それと、>>778はwrapperかまさなくても、main中で直接print(b)と書けるよ。
koenig則のおかげで。
それがprintでなく、operator<<だとしても同じこと。

781 名前:デフォルトの名無しさん :02/12/21 04:24
>>780
ありがとうー!おかげで名前空間に関する理解が深まりました。
friendが名前空間をまたぐことができるという仕様はそのままにして
おいて、スマートにKoenig則が働くよう、無意味に名前空間を
またぐようなプログラムは書かない方がいいみたいですね。

782 名前:デフォルトの名無しさん :02/12/21 15:13
C++はIEEEされてますか?

783 名前:デフォルトの名無しさん :02/12/21 15:16
yes, C++ was IEEEd.

784 名前:デフォルトの名無しさん :02/12/22 20:14
struct SA{
struct {int nn;}NN;
SA():NN.nn(NULL){}
};
なんでコンストラクタで初期化できないんだろう?
SA(){NN.nn=0;}
は、うまくいくのに。

785 名前:デフォルトの名無しさん :02/12/22 20:24
>>784
当たり前だと思う。

786 名前:デフォルトの名無しさん :02/12/22 20:25
>>784
NN.nn っていうのは SA のメンバじゃないから。SA のメンバは NN であって、だから NN のコンストラクタを呼ばないと。
struct SA{
  struct NN{
    int nn;
    NN(int x):nn(x){}
  }NN;
  SA():NN(NULL){}
};
・・・まで。なんで int を NULL で初期化してるんだ。

787 名前:デフォルトの名無しさん :02/12/22 20:28
>784
nested class のコンストラクタを自分で宣言してないから。コンストラクタを
宣言しない場合にはコンパイラによって暗黙のコンストラクタが生成される
けど、それは引数無しと決まってる。

どうでも良いが int を NULL で初期化するのは、C++ の syntax としては
正しいが、やめた方が…。

788 名前:デフォルトの名無しさん :02/12/22 21:07
>>786>>787
サンクスです。理解できました。
それはそうとして、intをNULLで初期化してはいけないのですか?
ちょくちょくやるんですが・・・。

789 名前:デフォルトの名無しさん :02/12/22 21:11
>>788
NULL は NULL ポインタの値であり、多くのポインタ演算や関数で使われます。

MSDNより。

790 名前:デフォルトの名無しさん :02/12/22 21:55
>>788
いけないっつうか・・・・慣習的に NULL はヌルポインタを表すものだから、ポインタじゃない int に NULL を使うのは好ましくない。

791 名前:デフォルトの名無しさん :02/12/22 22:00
要らぬ物議を醸さぬよう、早々に0を使うようにされよ。

792 名前:デフォルトの名無しさん :02/12/22 22:13
>>789>>790サンクスです。
>>791ラジャア

793 名前:デフォルトの名無しさん :02/12/22 23:41
inlineとかいた関数がインライン展開されない場合は
関数ポインタをとろうとした場合以外にどんなときが
ありますか?

794 名前:デフォルトの名無しさん :02/12/22 23:45
でかすぎるとき

795 名前:デフォルトの名無しさん :02/12/22 23:46
つーか、そもそも展開されるという保証はない。

796 名前:デフォルトの名無しさん :02/12/22 23:47
staticローカル変数があると、ほぼ確実。

797 名前:デフォルトの名無しさん :02/12/23 00:03
インライン展開されているのをたしかめる簡単な方法
ってありますか?

798 名前:デフォルトの名無しさん :02/12/23 00:06
バイトコードを読むくらいしか…

799 名前:デフォルトの名無しさん :02/12/23 00:12
>>797
機械語で出力して確認する。
ソースコードをコメントに入れるオプションを使えば
わかりやすい。


800 名前:デフォルトの名無しさん :02/12/23 00:51
>>793
BCCの警告から知ったんだけど
ルーブ文があるとだめだって、あと例外指定付きの関数とか。

801 名前:デフォルトの名無しさん :02/12/23 00:56
>>800
それはBCCがそういう趣味なだけ。

802 名前:800 :02/12/23 01:00
ヽ(`Д´)ノウァァン

803 名前:デフォルトの名無しさん :02/12/23 01:50
NULL と 0 の話題が出ているみたいなので、便乗質問。

ポインタに 0 を代入しても良いのかな?
(void*)0 とかにしなければ駄目?

くだらない質問なのでスルーしてもらっても良いです。

804 名前:デフォルトの名無しさん :02/12/23 02:00
良い。

詳しくはC-FAQを参照。
C++の0(NULL)は、ほぼCと同じと考えて良い。
(void *の扱いが違うので、NULLの#define等が違う場合が多いが)

805 名前:デフォルトの名無しさん :02/12/23 02:01
C++第三版に確かNULLより0を使えとあったはず

806 名前:名無しさん@XEmacs :02/12/23 02:04
そのとうり!!

807 名前:デフォルトの名無しさん :02/12/23 02:12
>805
定期的に繰り返される話題だが、規格上 C++ では

- 何も有効なオブジェクトを指さないポインタを null ポインタという
- NULL は null ポインタ定数であり、これをポインタ変数に代入すると、その変数は
 null ポインタになる
- NULL は整数型で 0 と等しい。(型は int, long, どれかは決まってないけど、とも
 かく 0 と比較すると真になる値)

と決まってる。よって NULL と 0 どちらを使うかは、趣味の問題。

808 名前:デフォルトの名無しさん :02/12/23 02:17
ざっと見たけど、
乳首がポインタでNULLNULLな訳か・・・・
なるほど・・・奥が深い・・・

809 名前:デフォルトの名無しさん :02/12/23 02:20
>>797
処理系によっては、インラインで宣言されているにもかかわらず、インライン展開
できなかったら警告を出すように指定できる。gcc だと -Winline とか。

>794 >796
あとは、末尾再帰以外の再帰がある時もインライン化されないね。このあたりは
Efficient C++ って本が参考になるかな。

810 名前:デフォルトの名無しさん :02/12/23 03:13
ソース書いて、コンパイルしたところ、特定のファイル名によって実行スピードが
速くなる場合があります。
例えば、
g++ -o test1 test1.cpp
cp test1.cpp test11.cpp
g++ -o test11 test11.cpp
とコンパイルすると、test11の方が速いといった具合です。
g++ -S でアセンブラを比較したら、ファイル名の部分だけ異なっているのですが
このような事は一般的に起こるのでしょうか?
今まで気にしていなかったのですが、禿しく気になりました。


811 名前:デフォルトの名無しさん :02/12/23 03:15
>>810
気のせい

812 名前:デフォルトの名無しさん :02/12/23 03:27
>>810
気にしてたら禿げるよ。

813 名前:810 :02/12/23 03:43
禿たくは無いんですが、
timeでの計測も差が出るし、プロファイラで見ても差があるのですが・・・。
気のせいですかね?


814 名前:デフォルトの名無しさん :02/12/23 03:55
>>813
ソース出してみ。argv[0]でなんか変わってるとかないだろうな。

815 名前:デフォルトの名無しさん :02/12/23 04:16
>>810
バイナリレベルで二つの実行ファイルを比較したら?同じ?
違うとしたら、微妙な所でキャッシュメモリのヒット率に大幅な差が出ている
のかもしれないな。そんな事は滅多にないと思うが。

816 名前:デフォルトの名無しさん :02/12/23 05:01
リフレクションって出来ないの?

817 名前:デフォルトの名無しさん :02/12/23 05:01
>>810
以前fj.comp.lang.c辺りで話題になっていたが、
gccはアライメントがファイル名で狂うため、
その長さで実行速度が実感できるほど変わるらしいよ。

818 名前:810 :02/12/23 05:02
ファイル名を一文字ずつ増やして実行ファイルのサイズを変えてtimeで計ってみました。
ソースは長いのでちょっと出せません。スマソ

サイズ  timeの結果
------------------------------------------------------
36232 8.000u 0.000s 0:08.00 100.0% 0+0k 0+0io 139pf+0w
36233 8.010u 0.000s 0:08.01 100.0% 0+0k 0+0io 139pf+0w
36234 8.000u 0.000s 0:08.00 100.0% 0+0k 0+0io 139pf+0w
36235 8.000u 0.000s 0:08.00 100.0% 0+0k 0+0io 139pf+0w
36236 7.850u 0.000s 0:07.85 100.0% 0+0k 0+0io 139pf+0w
36237 7.830u 0.000s 0:07.83 100.0% 0+0k 0+0io 139pf+0w
36238 7.830u 0.000s 0:07.83 100.0% 0+0k 0+0io 139pf+0w
36239 7.840u 0.000s 0:07.85 99.8% 0+0k 0+0io 139pf+0w
36240 7.610u 0.010s 0:07.84 97.1% 0+0k 0+0io 139pf+0w
36241 7.840u 0.000s 0:07.84 100.0% 0+0k 0+0io 139pf+0w
36242 7.850u 0.000s 0:07.85 100.0% 0+0k 0+0io 139pf+0w
36243 7.830u 0.010s 0:07.84 100.0% 0+0k 0+0io 139pf+0w
36244 8.000u 0.000s 0:08.00 100.0% 0+0k 0+0io 139pf+0w
36245 8.010u 0.000s 0:08.01 100.0% 0+0k 0+0io 139pf+0w

ファイルサイズ36236〜36243まで微妙に速いんですよね〜
これやっててかなり萎えました・・・


819 名前:810 :02/12/23 05:03
>> 817 おお!禿げずにすみそうです。ありがとうございました。

820 名前:デフォルトの名無しさん :02/12/23 05:04
>>816
C++に出来ないことはありません。
出来ないように見えるものはすべて不要なものです。

821 名前:デフォルトの名無しさん :02/12/23 05:05
>>820

出来るということですか?

822 名前:デフォルトの名無しさん :02/12/23 05:07
>>821
不要です。要するにリフレクションなんて機能は使う必要ありません。

823 名前:デフォルトの名無しさん :02/12/23 05:09
VBでは出来るリフレクションがC++で出来ないとは一体どういうことだ?

824 名前:デフォルトの名無しさん :02/12/23 05:10
>>821
C++でJavaを実装すればできる

825 名前:デフォルトの名無しさん :02/12/23 05:11
>>823
>>822

826 名前:デフォルトの名無しさん :02/12/23 05:11
>>822

例えば設定ファイルによって
実行時に使うクラスが変わる場合は、
どう実装すればよいのでしょう?

827 名前:デフォルトの名無しさん :02/12/23 05:12
>>824
C++でJavaを実装してもC++のリフレクションは出来ませんよ。

828 名前:デフォルトの名無しさん :02/12/23 05:13
>>826
そんな設計が糞なのです。

829 名前:デフォルトの名無しさん :02/12/23 05:14
C++やっぱダメだな…

830 名前:デフォルトの名無しさん :02/12/23 05:14
>>826
それはリフレクションを使用する例としては不適切だと思う。

831 名前:デフォルトの名無しさん :02/12/23 05:14
>>826
switchとかifとかつかっとけや

832 名前:デフォルトの名無しさん :02/12/23 05:15
>>831

メンテ大変なので嫌です。

833 名前:デフォルトの名無しさん :02/12/23 05:15
managed C++ なら使えますが、なにか?

834 名前:デフォルトの名無しさん :02/12/23 05:16
>>829
お前はC++の進化の歴史を知らんのか?
まだまだこれからもC++は進化する。
「プログラミング言語 C++ 第4版」はさらにページ数が倍に。

835 名前:デフォルトの名無しさん :02/12/23 05:16
>>833

ありがd。調べます。

836 名前:デフォルトの名無しさん :02/12/23 05:19
>>833
むしろ.NET対応言語なら使えるといった方がいいな。

837 名前:デフォルトの名無しさん :02/12/23 05:23
In function `int main()':
ANSI C++ forbids implicit conversion from `void *' in assignment
59: array = malloc( n_array );

↑のようなエラーが出ましたが、どういうことでしょうか?


838 名前:デフォルトの名無しさん :02/12/23 05:32
メッセージの通り。

839 名前:デフォルトの名無しさん :02/12/23 05:35
#ifdef __cplusplus
#define NULL 0
#else
#define NULL (void *)0
#endif

840 名前:デフォルトの名無しさん :02/12/23 06:53
>>832
リフレクション風のクラスだか関数だかをお前が管理しなきゃ良いだろ。

841 名前:デフォルトの名無しさん :02/12/23 07:26
>>837
mallocの返り値をarrayの型にキャスト。解決。以上

842 名前:デフォルトの名無しさん :02/12/23 07:27
>>837
つーかC++でmalloc()使うなよ。new使え。

843 名前:デフォルトの名無しさん :02/12/23 07:41
アプリケーションに一つしか使わないやつを
static で生成して、
それを使うクラスは、継承して内部(?)に持たせて使う
やりかたってやってもいいのでしょうか?


例)
class CDXGraphic{
public:
static LPDIRECT3DDEVICE8 s_pDevice;
static void Initialize();
}

class CRender : public CDXGraphic{
public:
void render(){ ここで、s_pDevice を使って書く。
};



844 名前:デフォルトの名無しさん :02/12/23 09:36
問題ないっしょ。
俺なら、変数をprotectedにするか、変数はprivateにして取得/設定メソッド
をprotectedにする。

845 名前:デフォルトの名無しさん :02/12/23 09:56
つーか、問題あると思うなら、それが間違っててもいいから
「自分はこんな問題があると思うんだけど、これって不味くない?」
とかなんとか書かないと、問題点が整理されなくて結局質問者の損な気が・・・

846 名前:デフォルトの名無しさん :02/12/23 11:19
リフレクションを要らないと言う奴はCppUnitも使ったこと無い素人

847 名前:デフォルトの名無しさん :02/12/23 11:43
>846
C++ だと、ふつー Perl か ruby でスクリプト書いて、テストメソッド順番に呼ぶ
コードを自動生成。

848 名前:デフォルトの名無しさん :02/12/23 12:32
Your program exited with signal #11 (segmentation violation
[maybe caused by accessing memory out of bounds,
array indexing out of bounds, using a bad pointer
(failed open(), failed malloc), or going over
the maximum specified memory limit]) .

と出ているけどどう直せばいいんでしょうか?

849 名前:デフォルトの名無しさん :02/12/23 12:36
>>847
リフレクションが無いからそうなる。
リフレクションのありがたみを感じられる場面ですな。

850 名前:848 :02/12/23 13:15
http://www.st.rim.or.jp/~phinloda/cqa/cqa10.html
Q 【Segmentation violation】
 "Segmentation violation"というメッセージが出てプログラムが
異常終了してしまう。原因は何だろうか。

 簡単にいえば、使ってはならないメモリを使おうとした場合に
このようなメッセージが出ます。具体的には、ポインタの使い方を誤ったとか、
printf に指示したフォーマットと与える引数の型が一致しなかったりすると、
このような状況になることがあります。

n_array = (max-1) / 2;
array = (char *)malloc( n_array );
memset( (void *)array, 1, n_array );

ここの部分が原因でしょうか?

851 名前:デフォルトの名無しさん :02/12/23 13:19
>>すとらうすとらっぷ
要らぬ物議を醸さぬよう、早々にC++仕様に空のオブジェクト参照 null を追加せよ。

852 名前:851 :02/12/23 13:25
>>850
そこじゃないような気がするけど、そこだけ単体で試してみたら?
あと、そこの部分だったら微妙にスレ違い(Cのスレに行け)。

つーか他の部分のソースは?

853 名前:デフォルトの名無しさん :02/12/23 13:31
>>852 プログラムのソース
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define print_usage(s) \
fprintf( stderr, "Usage: %s <min> <max>\n"\
" 5 <= MIN < MAX <= 100,000,000\n",\
s )

static int reverse_int( int i ) {
int res = 0;
while ( i ) {
res *= 10;
res += i % 10;
i /= 10;
}
return res;
}

854 名前:848 :02/12/23 13:32
>>853の続き…
static void sieve( char *array, int max ) {
int i;
for ( i = 3; i < max/3; i += 2 ) {
if ( array[i/2-1] ) {
int j;

for ( j = i*2; j <= max; j += i ) {
if ( j&1 )
array[j/2-1] = 0;
}

if ( i != reverse_int(i) )
array[i/2-1] = 0;
}
}
for ( ; i <= max; i += 2 )
if ( array [i/2-1] && i != reverse_int(i) )
array[i/2-1] = 0;
}

855 名前:848 :02/12/23 13:33
>>854の続き…
int main() {
FILE *fin, *fout;
int min, max, n_array, i;
char *array, number[20];

fin = fopen("pprime.in", "r");
fout = fopen("pprime.out", "w");

fgets(number, sizeof number, fin);
sscanf(number, "%d %d", &min, &max);

n_array = (max-1) / 2;
array = (char *)malloc( n_array );
memset( (void *)array, 1, n_array );

sieve( array, max );

for ( i = min/2-1; i < n_array; i++ )
if ( array[i] )
fprintf(fout, "%d\n", i*2+3 );

return 0;
}


856 名前:848 :02/12/23 13:34
読み込むデータが大きすぎてこのようなエラーが起こりました。

857 名前:デフォルトの名無しさん :02/12/23 13:36
>>851
標準化委員会に提案しる!

858 名前:デフォルトの名無しさん :02/12/23 13:37
>>848
スレ違いだが。
SIGSEGVが来るんなら、coreはできてないのか?
デバッガで見てみろ。

859 名前:デフォルトの名無しさん :02/12/23 13:39
>>856
malloc()に失敗してるだけじゃん。阿呆。

860 名前:848 :02/12/23 13:46
>>859
どうしたら直せるのでしょうか?

861 名前:デフォルトの名無しさん :02/12/23 13:56
C言語スレで聞けよ

862 名前:デフォルトの名無しさん :02/12/23 14:01
>>861
C == C++;

863 名前:デフォルトの名無しさん :02/12/23 14:07
>>862
C = C++;

864 名前:デフォルトの名無しさん :02/12/23 14:25
>>862
未定義?

865 名前:デフォルトの名無しさん :02/12/23 14:34
>>863−864
if(C == C言語 && C++ == C++言語)
    C = C++;

866 名前:デフォルトの名無しさん :02/12/23 15:57
>>847
CppUnitなら、
CPPUNIT_TEST_SUITEマクロ書くのも対した手間じゃないじゃん。
スクリプト起動するほうがかったるいや。

867 名前:デフォルトの名無しさん :02/12/23 17:02
>>865 ばーか

868 名前:デフォルトの名無しさん :02/12/23 17:28
ネタをネタと・・・
てか nxt ってだいぶローカルネタだな


869 名前:デフォルトの名無しさん :02/12/23 18:37
全角は資源の無駄ですので辞めましょう。

STOP! 全角

870 名前:デフォルトの名無しさん :02/12/23 20:44
ja, zenkaku ha tukawanai youni ne

871 名前:デフォルトの名無しさん :02/12/23 20:59
晒しあげ

872 名前:デフォルトの名無しさん :02/12/23 21:41
>866
ふつー make を使う。

873 名前:デフォルトの名無しさん :02/12/23 23:11
xv_overlay.cpp:13: ISO C++ forbids defining types within return type
xv_overlay.cpp:13: return type specification for constructor invalid

"gcc -c xv_overlay.cpp"で上のエラーがでて困っています。
コードを下記に晒します。
一体どこが悪いのでしょう?

#include <X11/Xlib.h>
#include <X11/extensions/Xvlib.h>
class XvAdaptor{
public:
XvAdaptor();
private:
Display *dpy;
XvAdaptorInfo *adaptor;
void Init(void){};
}

874 名前:873 :02/12/23 23:13
/** 873の続き **/
XvAdaptor::XvAdaptor():adaptor(NULL){ // xv_overlay.cpp:13 はここになります。
Drawable root;
XvAdaptorInfo **ppAdaptorInfo;
int nAdaptorInfo;

dpy = XOpenDisplay(NULL);
root = DefaultRootWindow(dpy);
XvQueryAdaptors(dpy, root, (u_int*)&nAdaptorInfo, ppAdaptorInfo);
if(nAdaptorInfo>0){
int num;
XvAdaptorInfo *tmp;
for(num = nAdaptorInfo-1; num >= 0; --num){
tmp = *(ppAdaptorInfo + num);
if(tmp->num_ports > 0){
if(adaptor != NULL){
XvFreeAdaptorInfo(adaptor);
}
adaptor=tmp;
}else{
XvFreeAdaptorInfo(tmp);
}
}
}
if(NULL != adaptor) Init();
}


875 名前:デフォルトの名無しさん :02/12/23 23:14
>>873 セミコロン

876 名前:873 :02/12/23 23:21
>>875
どこのセミコロンですか?

877 名前:デフォルトの名無しさん :02/12/23 23:23
クラス定義の後、コンストラクタの前

878 名前:873 :02/12/23 23:30
あっ、そうか。classはstructと同系列だった。
数年ぶりにC++に手をだしたもんで…

ひー、趙単純ミス! 逝っときます…

879 名前:デフォルトの名無しさん :02/12/24 01:52
クラス外で変数名を意識しないとダメなクラスはダメだと何かの本で読んだのですが、
メンバにクラスをってる場合もそうなのでしょうか?
class A {
private:
int i;
public:
void show(void){return i;}
};

class B {
private:
A a;
public:
void show(void){return a.show();}
};
って書くのめんどくさいんで、
class C {
public:
A a;
}
a.show()ってやりたいんですけど。

880 名前:デフォルトの名無しさん :02/12/24 02:01
あっ、
C c;
c.a.show();です。

881 名前:デフォルトの名無しさん :02/12/24 02:03
余計面倒くさくしてる気がものすごくする.....

882 名前:デフォルトの名無しさん :02/12/24 02:23
うっ、どうすればいいんでしょう?Aに関数がたくさんある場合、
Bはやってられないんですが...

883 名前:デフォルトの名無しさん :02/12/24 03:06
無名structとか無名classとかってどんな使い方があるんですか?
あんまり意味がないような・・・。

884 名前:デフォルトの名無しさん :02/12/24 03:37
class X {
static int size;
};
class Y: public X{
};
class Z: public X{
};
でY、Zでstatic int sizeを持つことって出来ませんか?
Y y1, y2, y3は同じsizeをもって
Z z1, z2, z3はも同じsizeを持つけどyとは違うみたいな。
Y,Zにstaticメンバを書けばいいんでしょうが、基底クラスの
概念ではこちらの方が気持ちいいんで。


885 名前:デフォルトの名無しさん :02/12/24 03:47
staticメンバはその名前について一つという原則から考えれば、無理だという
ことが分からんか?


886 名前:デフォルトの名無しさん :02/12/24 04:03
分かってはいるのですが、何か無いかと思いまして。
static_delayか何かあると気持ちいい〜



887 名前:デフォルトの名無しさん :02/12/24 05:11
fscanf(fin, "%s", name);

配列として宣言されたname、式の中ではポインタに書き換えられる。
そのポインタが指すところってname[0]でcharacter1字しか格納できない、
なのになぜstringを格納できるのでしょうか?
また、この%sのstringには\0が最後に入っているのでしょうか?

888 名前:デフォルトの名無しさん :02/12/24 05:16
fscanfっていう関数って、空白または改行に出会うまで指定された
フォーマットに従って引数にデータを格納するのですか?

例えば、
fscanf(fin, "%s %d %d", string, &number, &number_2);
とすれば、
stringSample 100 50
でも、
stringSample
100 50
でも、同じデータを格納するってことですか?

889 名前:デフォルトの名無しさん :02/12/24 06:13
ポインタの理解が足りない
fscanfなんて使わないから知らない(ヘルプ見れば)
C言語スレへ行け

890 名前:デフォルトの名無しさん :02/12/24 07:49
>>879
C::aに対して外部からどんなアクセスをしてもCの整合性が保てるなら、
それでもいいと思う。
同じ条件で、aをCのメンバにする意義はあまり無いと思う。

891 名前:328 :02/12/24 08:05
>>888
なぜ自分で試さない?

892 名前:デフォルトの名無しさん :02/12/24 09:56
>886
template <class T>
class X {
protected:
  static int size;
};

class Y : public X<Y> {};
class Z : public X<Z> {};



893 名前:デフォルトの名無しさん :02/12/24 14:34
>>879
隠蔽の意味がわかってないみたいですね。
おそらくclassの切り分け方が根本的におかしいのでしょう。
最終的に楽をしたかったら隠蔽についてよく考えてごらん。

プログラムを組むとき、動くか動かないかだけで考えるのはもう卒業しましょう。
オブジェクトには責務の範囲というものがあります。
そのオブジェクトがやるべき事は、確実に成し遂げなければなりません。
そのオブジェクトがやらなくていい事は、全く気にしなくても済むようでなければなりません。

そしてpublicにしたら面倒になる、という感覚が身に付いたとき、
初めてオブジェクト指向が身に付いたと言えるようになるんじゃないかな。
それには関連も同時に学んでいかなければなりません。
オブジェクト指向の設計では、インターフェイスを設計することは当然として、
オブジェクト同士の関連を設計する事も重要です。
だからデザインパターンもあわせて強しましょう。

894 名前:デフォルトの名無しさん :02/12/24 15:51
>>879
憂鬱なプログラマのためのオブジェクト指向開発講座
でも見ればわかるんでない?

895 名前:デフォルトの名無しさん :02/12/24 16:35


896 名前:デフォルトの名無しさん :02/12/24 23:42
>> 892 なるほど〜。これって良く使われるテクなんでしょうか?
皆さんどうもありがとうございます。ちょっと勉強して出直してきます。今後とも宜しくお願いします〜。


897 名前:デフォルトの名無しさん :02/12/24 23:52
892 のコードはどういう場面で必要なんだ?

898 名前:デフォルトの名無しさん :02/12/25 00:02
>> 890,893,894 コメントどうも。
class Bはclass Aをprivateで持っていてもいいんですが、
Bのメンバを表示したいためだけなのです。

899 名前:デフォルトの名無しさん :02/12/25 00:15
>897
良く使うのは、仮想関数呼び出しのペナルティなしに template method を実装
したいときかね。ATL の CWindowImpl とかが良いサンプル。

900 名前:デフォルトの名無しさん :02/12/25 06:04
>>896-898
おまいらわざとレスリンクしないようにしてるんですか?
そうじゃなかったらレスリンクして欲しいです。。。

901 名前:デフォルトの名無しさん :02/12/25 06:37
レスリングはしません。

902 名前:デフォルトの名無しさん :02/12/25 16:18
>>900
おまいのケツを捧げたら考えなくもないれす。

903 名前:デフォルトの名無しさん :02/12/25 19:38
ツケが溜まっています

904 名前:デフォルトの名無しさん :02/12/25 20:17
>>900
2ch ブラウザを使いましょう。

905 名前:デフォルトの名無しさん :02/12/26 04:00
>>904
え・・・?Jane使ってますが・・・

906 名前:デフォルトの名無しさん :02/12/26 16:47
次スレ逝きますか?
逝っていい?
ねえ逝っちゃうよ
ん…んっっ逝くっ

907 名前:278 :02/12/27 17:19
がいしゅつだったらすまんが...

クラスのインスタンスをグローバルで宣言すると
デストラクタが呼ばれないのはコンパイラが糞ってことなのか!?
ちなみにコンパイラはVC。

====>
#include <iostream>

using namespace std;

class global
{
public:
 global(){cout<<"global start..."<<endl;}
 ~global(){cout<<"global end."<<endl;}
} g;

void main(void)
{cout<<"main"<<endl;}
<====

これを実行すると...
====>
global start...
main
<====
となってデストラクタが呼ばれないのだが。

これがC++の仕様だったら漏れ、
…拳銃らしきものもって銀行襲っちゃうかも…


908 名前:デフォルトの名無しさん :02/12/27 17:20
あ、278は間違い。


909 名前:デフォルトの名無しさん :02/12/27 17:27
main() 終了後に呼ばれるから cout が死んでるのかも。

910 名前:デフォルトの名無しさん :02/12/27 17:31
>>909
そっか。順番で言うと、
cout, global, main, ~cout, ~global
となってタイミングの問題なのね。
十二分にありえる…。

う〜ん…意外だった。
THX!


911 名前:デフォルトの名無しさん :02/12/27 18:02
STL ハッカーさんはいますか?

912 名前:! :02/12/27 18:22
επιστημη

913 名前:デフォルトの名無しさん :02/12/27 18:33
次スレにはこれもはっといてくれ
http://std.dkuug.dk/jtc1/sc22/wg21/

914 名前:デフォルトの名無しさん :02/12/27 19:49
少なくとも何の説明もないリンクを踏むやつはいないと思うが…

915 名前:デフォルトの名無しさん :02/12/27 20:06
>914
JTC1/SC22/WG21 is the international standardization working group for the programming language C++.

916 名前:デフォルトの名無しさん :02/12/27 21:10
>>907
ん?ちゃんと呼ばれるよ。@VC6
global start...
main
global end.

終了時に呼ばれる関数テーブルが壊れてるのかも。
atexit/_onexitが正常に動くか試してみたら?

917 名前:デフォルトの名無しさん :02/12/27 22:20
>>907
Borland-C++5.6.2ですが、正しくデストラクタも呼ばれました。

918 名前:デフォルトの名無しさん :02/12/27 23:22
std::ostreamの << 演算子をオーバーロードして、
自分で作ったクラスのインスタンスを出力できるようにしたいのですが、
うまくいきません。

グローバル関数として
std::ostream& operator<<(std::ostream &p_rcLOStrm, CMyClass myclass);
という関数を作ったのですが、VC++で
error C2678: 二項演算子 '<<' : 型 'class ostream_withassign' の左オペランドを扱う演算子は定義されていません。(または変換できません)
というエラーになります。
お助けください。

919 名前:デフォルトの名無しさん :02/12/27 23:29
>>918
それだけでは不明です。CMyClassの定義と、operator<<の定義全体をうp
してみて下さい。

920 名前:918 :02/12/27 23:44
>>919
CMyClassは、演算子[] をオーバーロードしていて、
int operator[](int i);
この関数は正しく動作することを既に確かめています。

で、operator<<は、

std::ostream& operator<<(std::ostream &p_rcLOStrm, CMyClass myclass) {
  return p_rcLOStrm << myclass[0] << myclass[1] << myclass[2] << myclass[3];
}

となっています。

921 名前:デフォルトの名無しさん :02/12/27 23:55
>>920
うーん普通に動くが?

class CMyClass {
int i;
public:
CMyClass(int j = 0) : i(j) {}
int operator[](int j) {
return i + j;
}
};

std::ostream& operator<<(std::ostream &p_rcLOStrm, CMyClass myclass) {
return p_rcLOStrm << myclass[0] << myclass[1] << myclass[2] << myclass[3];
}

int main()
{
CMyClass cl;

std::cout << cl;
}

922 名前:デフォルトの名無しさん :02/12/27 23:59
なんでだろう。BCC5.5.1では通らなかった。

struct T {
  int operator[](int i) const { return i; }
};

std::ostream& operator<<(std::ostream& os, const T& t)
{
  os << t.operator[](0); //これは通った
  os << t[0];       //駄目だった
  return os;
}


923 名前:デフォルトの名無しさん :02/12/28 00:09
921です。
Borland-C++ 5.6.2及びgcc3.2.1(MinGW)では通ります。

924 名前:918 :02/12/28 00:11
>>921
#include <iostream.h>
の .h を取って、
using namespace std;
を書いたら正しく動くようになりました。
今まで適当に書いていても動いたので、なめてました…
ともかくありがとうございました。

925 名前:922 :02/12/28 00:11
あれ。今度は上手くいった。さっきコンパイルしたときは
+演算子がどうのってエラーが出たんだけどな。。。

926 名前:デフォルトの名無しさん :02/12/28 03:49
#include <iostream>
#include <typeinfo>
using namespace std;

class Base {
 virtual void f() {}
};

class Derived : public Base {
};

int main()
{
 Base base;
 try {
  Derived& dr = dynamic_cast<Derived&>(base);
 }
 catch(bad_cast &) {
  cout << "here." << endl;
 }
 catch(exception& e) {
  cout << e.what() << endl;
  cout << typeid(e).name() << endl;
 }
 return 0;
}

VC6のcl.exeだと、確かにbad_castが投げられてるようだがcatchできない・・・
bcc5.5.1だとうまくいく。どうなってるんだ・・・

927 名前:デフォルトの名無しさん :02/12/28 16:43
Functorまんせー

928 名前:デフォルトの名無しさん :02/12/28 21:12
質問なんですが、
STLのsetでupper_boundの逆、
引数より小さい最初の要素を探す
ってないでしょうか?

もしないなら、何らか代替えはないでしょうか?


929 名前:デフォルトの名無しさん :02/12/28 21:36
こんにちは。
外部シンボルinp,outpが未解決となってしまうエラーについて質問させてください。

I/Oボートにアクセスしステッピングモータを動かす
プログラミングをC/C++で行っています。
しかし
Error: 外部シンボル '_inp' が未解決(C:\DOCUMENTS AND SETTINGS\INFODRIVE\デスクトップ\program.OBJが参照)
Error: 外部シンボル '_outp' が未解決(C:\DOCUMENTS AND SETTINGS\INFODRIVE\デスクトップ\program.OBJ が参照)
というエラーが出てしまいmakeできません。
いろいろ調べて
#include "conio.h"
#include "IOBIN.h"
というのをインクルードしてみたのですがうまくいきません。
Win95、Cpad、Borland C++ Compiler 5.5 を使っています。
ちょっと制御関係の話かもしれませんが、
どなたかアドバイスをいただけませんか?
よろしくお願いします。

930 名前:デフォルトの名無しさん :02/12/28 22:18
>>928
lower_bound ?

931 名前:デフォルトの名無しさん :02/12/28 22:19
>>907,916
VCだと /MD オプションでランタイムライブラリにMSVCRTを使うように
するとちゃんとデストラクタも呼ばれます。スタティックリンクのLIBCだと
ダメです。たしかこれってずいぶんまえに一時期さかんに議論されていた
内容だったと思います。


932 名前:デフォルトの名無しさん :02/12/28 23:12
SOCKADDRとSOCKADDR_INのように、同じサイズの構造体があって、
例えばSOCKADDRをSOCKADDR_INに、キャストするようにコピーする方法はありますか?(ちょっと言い方が苦しいですけど)
構造体は型キャストではできないみたいなので。


933 名前:デフォルトの名無しさん :02/12/28 23:39
こういうこと?
SOCKADDR sa, *psa; SOCKADDR_IN si, *psi;
si = (SOCKADDR_IN *)&sa;
*psi = (SOCKADDR_IN *)psa;

普通はmemcpyするけどな(理由は略)。

934 名前:デフォルトの名無しさん :02/12/29 00:38
>>930
lower_boundは違うようです。
lower_boundは <= という意味で、
upper_boundは < みたいです。

935 名前:デフォルトの名無しさん :02/12/29 01:19
>>930
std::lower_bound(v.begin(), v.end(), value, std::greater());
っていうのはどう?

936 名前:デフォルトの名無しさん :02/12/29 02:15
>>928
いろいろやってみたが、なかなか難しい。
まず、std::upper_boundにstd::greaterを与える方向で調べてみた。しかし、
コンテナが逆順にソートされている事になってしまい、うまくいかない。
std::upper_boundは比較基準と同じ基準でソートされているコンテナに
しか適用できない。

次に、rbegin(), rend()を与えてみた。ところが、std::upper_boundにnormal_
iteratorを与えなさいというエラーが出てだめだった。std::upper_boundの
返り値がnormal_iteratorだかららしい。これは意外だった。

結局、方法は一つ、コンテナを逆順に並べ替えてからstd::greaterを与える
という結論に落ち着いた。

他にスマートな方法があったら教えて下さい。

937 名前:デフォルトの名無しさん :02/12/29 02:19
>>928
おっとごめん。std::setに対する処理か。std::setはすでにソートされている
から、そのソート基準を切り替えることはできないだろう。

メンバ関数upper_boundで反復子を取得し、それに対しstd::advance(-1)を
適用してはどうか。

938 名前:930 :02/12/29 02:35
upper_bound(key) がkeyより大きいはじめの値、
lower_bound(key) がkeyより大きくないはじめの値、
setは値の重複を許さない、ってことで
set<T> s;
*--s.lower_bound(key) が所要の値になる、ってのは?


939 名前:930 :02/12/29 02:36
>lower_bound(key) がkeyより大きくないはじめの値、
keyより小さくない、だった。

940 名前:デフォルトの名無しさん :02/12/29 02:40
>>938
multisetでもlower_boundの一個前でいけるだろ。
ただ、
> *--s.lower_bound(key)
これはイクナイ。
beginが返ってきたときに恐ろしいことが。

941 名前:デフォルトの名無しさん :02/12/29 02:43
こんなんでどうかな?std::setで順位もつけてテストしてみた。

typedef std::pair<int, int> PII;

struct Cmp : public std::binary_function<PII, PII, bool> {
bool operator()(PII i, PII j) {
return i.first <= j.first && i.second < j.second;
}
};

int main()
{
std::set<PII, Cmp> s;

s.insert(std::make_pair(1, 1));
s.insert(std::make_pair(1, 2));
s.insert(std::make_pair(2, 3));
s.insert(std::make_pair(3, 4));
s.insert(std::make_pair(3, 5));

std::set<PII, Cmp>::iterator pos;
pos = s.upper_bound(std::make_pair(3, 1));
pos--;

std::cout << "key = " << pos->first << ", value = " << pos->second << std::endl;
}

942 名前:デフォルトの名無しさん :02/12/29 02:45
>>940
begin()でないかテストを付けました。

if (pos != s.begin()) {
pos--;
std::cout << "key = " << pos->first << ", value = " << pos->second << std::endl;
}

943 名前:デフォルトの名無しさん :02/12/29 02:49
>>941
比較関数差し替えるのは、928の要求に合わないと思う。

944 名前:デフォルトの名無しさん :02/12/29 03:00
>>943
しかし、比較関数を差し替えないと、std::pairのようなクラスをstd::setに
挿入できないよ。

それから、lower_boundは、elem*以上*の最初の位置を算出するので、
キーの重複を許さないstd::setはいいとして、std::multisetでは同じキー
が連続する場合、最初のキーの位置を出してしまうのでまずいんでは?

upper_boundでelem*より大きい*最初の要素の位置を出して、それが
begin()でない事を確認してから--するのがいいと思う。

945 名前:デフォルトの名無しさん :02/12/29 03:01
>しかし、比較関数を差し替えないと、std::pairのようなクラスをstd::setに
>挿入できないよ。

スマソ。これは取り消します。

946 名前:デフォルトの名無しさん :02/12/29 03:03
>>928が何をしたいんだかよく分からんのだが、
”引数より小さい最初の要素”ってのはset.begin()か、コンテナ中に存在しないか、
のどっちかだと思うんだが。

947 名前:デフォルトの名無しさん :02/12/29 03:11
うーんいろいろ試してみたんだが、比較関数を差し替えない限り、std::setと
std::multisetはlower_boundでいけますね。

std::setはそもそも重複がないんだし、std::multisetは、同一のキーであっても
順序が重要ではないんだから。

upper_boundだと、同一のキーを検索した場合、それ*より大きい*キーを指して
しまうので、--しても、同一のキーを指してしまい、それ*より小さい*キーを
指してはくれない。

それからキーが同一でも順序が重要な場合はstd::multimapを使いますよね。

948 名前:デフォルトの名無しさん :02/12/29 03:11
>>946
0 1 2 3 4 5 6 7 8 9
set内がこうなってたとき、引数として5を与えたら4が帰ってきて欲しいって意味だと思うが

949 名前:デフォルトの名無しさん :02/12/29 03:19
>>948
それだと”引数より小さい最後の要素”じゃないか?

950 名前:デフォルトの名無しさん :02/12/29 03:23
>>949
おお、確かに・・・
引数の値から小さい方向に進むこと最初の、と意訳していたが・・・

951 名前:デフォルトの名無しさん :02/12/29 03:24
>>949
upper_boundの逆ってことで、推して知ってやるところだと思われ。

952 名前:デフォルトの名無しさん :02/12/29 03:42
std::vector, std::deque, std::listの場合は話はややこしくなるな。もっとも
これらのコンテナにはメンバ関数にはupperboundはないが。だから
標準アルゴリズムのstd::upper_boundを適用したと仮定して、

1 2 3 4 4 4 5 6 7
となっていたとして、upperbound(4)の逆とは、

1 2 3 4 4 4 5 6 7
    ^        ここを指すのか(lower_bound)、
1 2 3 4 4 4 5 6 7
      ^      ここを指すのかで話が違ってくる。

連想コンテナではどちらでもよい。同一キーの順序づけがないんだから。

953 名前:デフォルトの名無しさん :02/12/29 07:30
下みたいに{〜}の中で作成したオブジェクトは{〜}抜ける場合に必ず破棄されるの?
実装依存?

printf("before);
{
 foo b:
}
printf("after");

954 名前:デフォルトの名無しさん :02/12/29 08:08
>>953
当然破棄。これはCもC++も同じ。

955 名前:922 :02/12/29 09:25
>>933
解決しました。memcpyでOKでした。レスありがdございました。
SOCKADDR sock; SOCKADDR_IN soin;
memcpy( &sock, &soin, sizeof(SOCKADDR) );

956 名前:デフォルトの名無しさん :02/12/29 10:20
>>955
サイズが全く同じなら
SOCKADDR sock;
SOCKADDR_IN soin;
soin = *reinterpret_cast<SOCKADDR_IN *>(&sock);
で出来ないことはない。
一応参考までに。

957 名前:928 :02/12/29 11:44
色々ありがとうございます。

説明も悪かったみたいで、
例えばset内に 1 2 4 とある場合、引数が
5の場合4
4の場合2
3の場合2
2の場合1
1の場合エラー
0の場合エラー
という処理をしたかったんです。

結局、
if (s.empty()) return false;
pos = s.lower_bound(key);
if (pos == s.begin()) return false;
pos--;
// 以降該当したものがある場合の処理
というようにしました。

みなさんありがとうございました。

958 名前:デフォルトの名無しさん :02/12/29 17:50
激しく初歩的な質問ですみません。
class A{
public:
 A(int n); // コンストラクタ
};
class B: public A{
}
int main(){
 B x(5);
}
とやったらエラーが出るんですけど、コンストラクタって継承されないんですか?

959 名前:デフォルトの名無しさん :02/12/29 17:55
class B:public A{
public:
B(int n):A(n){}
};


960 名前:デフォルトの名無しさん :02/12/29 21:32
>コンストラクタって継承されないんですか?

yes

961 名前:デフォルトの名無しさん :02/12/30 01:26
template<typename T>T t=0;
が通る(VC)だけど、意味あるの?

962 名前:デフォルトの名無しさん :02/12/30 02:36
>>961
ちょっと訊きたいんだけど、どうしてそういうコードを書こうと思ったの?

963 名前:デフォルトの名無しさん :02/12/30 02:38
偶然書き間違えて、F7押したらエラーが出なかったの。

964 名前:デフォルトの名無しさん :02/12/30 08:12
>>961
> test.cpp(10): error C2998: '<template parameter>t': テンプレート定義にはなれません。
と言われてしまったが。

965 名前:デフォルトの名無しさん :02/12/30 09:16
961 の VC は、実はビタミン C

966 名前:デフォルトの名無しさん :02/12/30 13:29
C with classes のソースとかってどこかに落ちてないでしょうか?
検索に引っかかりにくい名前なもので探せないのです。

967 名前:966 :02/12/30 13:31
わかりづらかったような気がするので補足です。
コンパイラ(コンバータ)のソースという意味です。

968 名前:デフォルトの名無しさん :02/12/30 13:32
スレ違いじゃないか?

969 名前:デフォルトの名無しさん :02/12/30 14:39
10年以上前の代物でわ・・・

970 名前:デフォルトの名無しさん :02/12/30 16:39
そういえば、ないね
リッチーのHPにはBのソースとかあるのに
ストラウストラップのHPには昔話が見当たらない

971 名前:デフォルトの名無しさん :02/12/30 17:48
未来を見据えるC++

ところで誰も新スレ立てないけどどうして?
ちゃんとhttp://std.dkuug.dk/jtc1/sc22/wg21/も入れといてね。

972 名前:デフォルトの名無しさん :02/12/30 18:00
cfrontはけん?

http://www.unipress.com/toolkit/cfront.html

973 名前:デフォルトの名無しさん :02/12/30 18:39
スレが終了する間際なので厨房質問をさせてください。
基底 class CGorua{略};
派生1 class CMorua : public CGorua {略}
派生2 class CHorua : public CGorua {略}
派生3 class CForua : public CGorua {略}
があり、派生クラス1〜3のオブジェクトを1つずつ作成しました。
また、別のクラスとしてCAhyaがあり、オブジェクトを1つ作成しました。

派生1〜3から、CAhyaのオブジェクトを使うにはどうしたらいいのでしょうか。
グローバルでCAhya ahyahya;と宣言するのでしょうか。
どうぞよろしくおねがいします。


974 名前:デフォルトの名無しさん :02/12/30 19:05
>>973
friend class

975 名前:デフォルトの名無しさん :02/12/30 19:19
>>980
you should stand thread of continuing!

976 名前:973 :02/12/30 19:34
>>974
ありがとうございました。
やってみます。

977 名前:966 :02/12/31 00:10
>>968
微妙な所ですけど、汎用相談スレに書いて解答が得られるとも思えず、
専用スレを立てるのは明らかに荒らしなので、結局ここしかないんですよね。

>>969
文化的価値から知的興味+この間の C マガの特集を見て
コンバータ作りたいなぁ…なんて思ってたりして、その参考も含めてなんです。

>>970
エイプリールフールのジョークならあるのにね(あれはストラウストラップのページじゃないんですっけ?日本語訳しか読んだことないので不明かも)

>>972
サンクスコです。…でも商品ぽいですね…。さすがにお金だして買う気はしないです。ごめんなさい。

せっかくなので初心者さんの質問にも答えてみます。

>>973
質問の意図が不明です。public な部分を使うだけならどこからでも出来ますよ。
全体で唯一のインスタンスを使うならグローバル変数より Singleton と呼ばれる方法を使う方がスマートです(わからなければ検索サイトで Singleton を検索してみてください。)
アクセスコントロールの話の場合は >>974 さんの回答の通り friend にするのが手っ取り早い方法ですが、あまり好ましくありません。
アクセスを制限する Adapter クラスを通して使うとよいかもしれません。

ってなんかデザパタの宣教師みたいな回答になっちゃったな…。

978 名前:デフォルトの名無しさん :02/12/31 06:53
char size[sizeof(T)];

と、したときの領域を動的に削る方法ってあります?

979 名前:デフォルトの名無しさん :02/12/31 11:27
冬休みだから久しぶりに覗いてみたけど、このスレはまともですね(w

>>973
>オブジェクトを使う
とあるから、単に関連を張りたいだけの気がする。
CAhyaがプログラム中で一度しか出てこないならsingleton
多数出てくるなら、派生1〜3のコンストラクタに
ahyahyaへのポインタを渡すか、関連を張る関数を用意する。

>>978
いみふめ
静的に確保した領域は動的には変更できませんよ?
多分 vector<char> が望みのものだと思うけど

980 名前:デフォルトの名無しさん :02/12/31 12:41
placement newで質問です。

void* operator new(size_t size,void* buf){return buf;}

template<typename T,size_t reg=1>struct TSA{
enum{num=reg};
char p[sizeof(T)*num];
T* pt;
TSA(){pt=new(p)T;}
};
class X{void func(){}};
/**************************************************************/
void main(void)
{
TSA<X> tsa;
cout<<&tsa.p<<sizeof(tsa.p)<<endl;
cout<<&tsa.pt<<sizeof(tsa.pt)<<endl;
}
となっているとき、pとptのサイズが違うんですが、これって正しいのですか?
あと、アドレスも違うのですが。

981 名前:デフォルトの名無しさん :02/12/31 14:06
> これって正しいのですか?
正しい
> アドレスも違うのですが。
あたりまえ

982 名前:こうか? :02/12/31 14:10
int main()
{
 char p[100];
 char *pt;
 pt = p;
 cout<<&p<<sizeof(p)<<endl;
 cout<<&pt<<sizeof(pt)<<endl;
}
となっているとき、pとptのサイズが違うんですが、これって正しいのですか?
あと、アドレスも違うのですが。

983 名前:デフォルトの名無しさん :02/12/31 14:35
>>982
ptの「中身が」pのアドレスっていうだけだからどっちもそれで正しい

984 名前:982 :02/12/31 14:47
いや、俺は980の疑問をわかりやすく書き直しただけなんだが。

985 名前:982 :02/12/31 15:08
>>984
そうか。

986 名前:デフォルトの名無しさん :02/12/31 15:43
質問です。
sscanf( argv[1]+1, "%2x", &x );
ココのargv[1]+1の部分はどういった処理なんでしょうか。
argvはchar型なので文字列連結では無いとは思うのですが。。

987 名前:デフォルトの名無しさん :02/12/31 15:46
man sscanf

988 名前:デフォルトの名無しさん :02/12/31 15:55
そろそろ埋めるか

989 名前:デフォルトの名無しさん :02/12/31 16:07
>>986
argv は char **型じゃないの?
あんたのプログラムがどうなってるか知らんから分からんけどなー

990 名前:デフォルトの名無しさん :02/12/31 16:13
990!!

991 名前:デフォルトの名無しさん :02/12/31 16:26
ところで新スレは?

992 名前:デフォルトの名無しさん :02/12/31 16:26
992

993 名前:デフォルトの名無しさん :02/12/31 16:28
>>991
ここ
http://pc3.2ch.net/test/read.cgi/tech/1025441630/l50

994 名前:デフォルトの名無しさん :02/12/31 16:29


995 名前:デフォルトの名無しさん :02/12/31 16:36
>>994 ちょいと松
>>993でいいのか?

996 名前:デフォルトの名無しさん :02/12/31 16:43
996

997 名前:デフォルトの名無しさん :02/12/31 16:59
埋めて埋めて

998 名前:デフォルトの名無しさん :02/12/31 17:00


998!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


999 名前:デフォルトの名無しさん :02/12/31 17:03
とっとと埋め

1000 名前:デフォルトの名無しさん :02/12/31 17:03
999!!


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