C++相談室 part13

このエントリーをはてなブックマークに追加
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
      ^      ここを指すのかで話が違ってくる。

連想コンテナではどちらでもよい。同一キーの順序づけがないんだから。
下みたいに{〜}の中で作成したオブジェクトは{〜}抜ける場合に必ず破棄されるの?
実装依存?

printf("before);
{
 foo b:
}
printf("after");
>>953
当然破棄。これはCもC++も同じ。
955922:02/12/29 09:25
>>933
解決しました。memcpyでOKでした。レスありがdございました。
SOCKADDR sock; SOCKADDR_IN soin;
memcpy( &sock, &soin, sizeof(SOCKADDR) );
>>955
サイズが全く同じなら
SOCKADDR sock;
SOCKADDR_IN soin;
soin = *reinterpret_cast<SOCKADDR_IN *>(&sock);
で出来ないことはない。
一応参考までに。
957928: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);
}
とやったらエラーが出るんですけど、コンストラクタって継承されないんですか?
class B:public A{
public:
B(int n):A(n){}
};
>コンストラクタって継承されないんですか?

yes
961デフォルトの名無しさん:02/12/30 01:26
template<typename T>T t=0;
が通る(VC)だけど、意味あるの?
>>961
ちょっと訊きたいんだけど、どうしてそういうコードを書こうと思ったの?
偶然書き間違えて、F7押したらエラーが出なかったの。
>>961
> test.cpp(10): error C2998: '<template parameter>t': テンプレート定義にはなれません。
と言われてしまったが。
961 の VC は、実はビタミン C
966デフォルトの名無しさん:02/12/30 13:29
C with classes のソースとかってどこかに落ちてないでしょうか?
検索に引っかかりにくい名前なもので探せないのです。
967966:02/12/30 13:31
わかりづらかったような気がするので補足です。
コンパイラ(コンバータ)のソースという意味です。
スレ違いじゃないか?
10年以上前の代物でわ・・・
そういえば、ないね
リッチーのHPにはBのソースとかあるのに
ストラウストラップのHPには昔話が見当たらない
未来を見据えるC++

ところで誰も新スレ立てないけどどうして?
ちゃんとhttp://std.dkuug.dk/jtc1/sc22/wg21/も入れといてね
スレが終了する間際なので厨房質問をさせてください。
基底 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;と宣言するのでしょうか。
どうぞよろしくおねがいします。
>>973
friend class
>>980
you should stand thread of continuing!
976973:02/12/30 19:34
>>974
ありがとうございました。
やってみます。
977966: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)];

と、したときの領域を動的に削る方法ってあります?
冬休みだから久しぶりに覗いてみたけど、このスレはまともですね(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のサイズが違うんですが、これって正しいのですか?
あと、アドレスも違うのですが。
> これって正しいのですか?
正しい
> アドレスも違うのですが。
あたりまえ
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のサイズが違うんですが、これって正しいのですか?
あと、アドレスも違うのですが。
>>982
ptの「中身が」pのアドレスっていうだけだからどっちもそれで正しい
984982:02/12/31 14:47
いや、俺は980の疑問をわかりやすく書き直しただけなんだが。
985982:02/12/31 15:08
>>984
そうか。
986デフォルトの名無しさん:02/12/31 15:43
質問です。
sscanf( argv[1]+1, "%2x", &x );
ココのargv[1]+1の部分はどういった処理なんでしょうか。
argvはchar型なので文字列連結では無いとは思うのですが。。
man sscanf
そろそろ埋めるか
>>986
argv は char **型じゃないの?
あんたのプログラムがどうなってるか知らんから分からんけどなー
990!!
ところで新スレは?
992
>>994 ちょいと松
>>993でいいのか?
996
埋めて埋めて


998!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
とっとと埋め
999!!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。