C++相談室 part81

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2010/06/01(火) 15:14:34
これライセンスはなんだ?
953デフォルトの名無しさん:2010/06/01(火) 15:46:41
C.C. 0
954デフォルトの名無しさん:2010/06/01(火) 18:45:12
#ifndef _fwstream_h_
規格書10ぺん読み直してこい
955デフォルトの名無しさん:2010/06/01(火) 18:52:43
_fwstream_h_ // '_'で始まる識別子

#include <malloc.h> // #include <cmalloc>ではない

class stringadr : public std::string // std::stringの継承

// 0 ではなく NULL の使用
// DWORD その他WinAPI の使用
// 「fstreamをfwstreamで置き換えれば使える。」 "..." が L"..." ではないので使えない
// Cスタイルキャストの使用
// std::size_t が size_t ではない
// 識別子"motosize" (笑)
956デフォルトの名無しさん:2010/06/01(火) 19:07:16
boostでもstdでもいいけどshared_ptrってweak使わなくてもメモリ確保しちゃうじゃん
あれ循環しないってわかってる時には使わないようにしたいんだけどそういうオプション無いの?
957デフォルトの名無しさん:2010/06/01(火) 19:15:02
細かいところだけどintとlongの使い分けがよくわからんな。ビット数保証したいなら
__int32と__int64の方が気持ち良くない?
| long a = (long) (iti - b * (1 << 31));
| int n = SetFilePointer ( fp, a, &b, FILE_BEGIN );
何コレ。DWORDをintに突っ込むな。
958デフォルトの名無しさん:2010/06/01(火) 21:28:25
規格屋はなぜthisを参照にしなかったのか。アホだったのか
959デフォルトの名無しさん:2010/06/01(火) 21:30:45
thisがreferenceではなくpointerなのはD&Eに理由が書いてあったけど具体的な内容はわすれた
960デフォルトの名無しさん:2010/06/01(火) 21:35:35
intとlongとDWORDはどれでもいいけど。警告・エラー出たら書き換えた。
ほぼすべての箇所で32bit符号なし整数よく64bitいるのはファイル位置とサイズの所。
std::stringの継承は良くないの?
テストコードで動いたからアップしたけど。手直ししてみるよ。
ライセンスはCC0で。
961デフォルトの名無しさん:2010/06/01(火) 21:38:15
>>959
日本語版の47ページに書いてあるじゃん

「thisを導入した時はまだ、リファレンスというものはなかった。」
962デフォルトの名無しさん:2010/06/01(火) 21:41:39
おれっちメンバ呼ぶときは必ずthis->つけちゃう方なんやけど〜
963デフォルトの名無しさん:2010/06/01(火) 21:59:35
thisは「* const」なの?
964デフォルトの名無しさん:2010/06/01(火) 22:01:16
>>960
#include <iostream>
#include <string>

class A : public std::string {
public:
 ~A() { std::cout << "~A()" << std::endl; }
};

int main() {
 std::string* p = new A;
 delete p;
}
965デフォルトの名無しさん:2010/06/01(火) 22:02:09
昔はthisを書き換えられた気がする
今はできないから*const
966デフォルトの名無しさん:2010/06/01(火) 22:11:16
どっちもデストラクタ呼ばれるな


#include <iostream>
#include <string>
using namespace std;

class A : public std::string {
public: ~A() { std::cout << "~A()" << std::endl; } };


class B {
public: ~B() { std::cout << "~B()" << std::endl; } };

int main() {
A* p = new A; delete p;
B* q = new B; delete q;
}
967デフォルトの名無しさん:2010/06/01(火) 22:11:46
std::mapである条件を満たした値をまとめて消したいんだけど、
そんな関数,ファンクタ,定形句、そういったものって何か無いかな?
968デフォルトの名無しさん:2010/06/01(火) 22:15:13
>>966
std::string* にして delete できない
969デフォルトの名無しさん:2010/06/01(火) 22:17:06
std::for_each()にラムダ式を組み合わせるとか
970デフォルトの名無しさん:2010/06/01(火) 22:19:28
typedef std::map<T> Map;
Map m;

for (Map::iterator it = m.begin(); it != m.end(); ) {
 if (...) {
  m.erase(it++);
 } else {
  ++it;
 }
}
971デフォルトの名無しさん:2010/06/01(火) 22:29:15
>>968
stringと関係無いだろ。

#include <iostream>
using namespace std;

class A {
public:
A() { std::cout << "A start" << std::endl; }
~A() { std::cout << "A end" << std::endl; } };

int main() {
void *p = new A; delete p; }
972デフォルトの名無しさん:2010/06/01(火) 22:40:05
>>971
おいおい
仮想デストラクタって知ってるか?
973デフォルトの名無しさん:2010/06/01(火) 22:44:22
>>960
こんなレベルじゃ怖すぎて使えないなwww
974デフォルトの名無しさん:2010/06/01(火) 22:51:51
メモリバッファとアドレスのペアを内部で使うだけでnewとかdeleteしてない。
あと、他所でもメモリ管理は手間かかるからstringで代替えしてる。
用途的にはこれでも一緒だけど、アクセスが一段階増えてみた目良くない。

class string_adress {
public:
string buf;
long long adress;
}
975デフォルトの名無しさん:2010/06/01(火) 22:53:52
newで生成してるわけではないから別に問題はないが
何故継承した
976デフォルトの名無しさん:2010/06/01(火) 22:58:30
string_adress x; と宣言したとき
x.buf[n]とx.adressより、
x[n]とx.adressの方が良いからだよ。
977デフォルトの名無しさん:2010/06/01(火) 23:09:43
>>970
やはり自分でループ書いて一個一個やるしか無いのかな

Erase-Removeイディオム的なものがあったらいいなと思ってたんだが…
978デフォルトの名無しさん:2010/06/01(火) 23:14:26
クラスとして動作するstringに変数を追加して
その追加した変数を外部からしか操作しないってのは
俺には違和感大有り

見た目悪くても構造体にすべきだろう
979デフォルトの名無しさん:2010/06/01(火) 23:19:05
別々の定義でもいいんだけど。用途的にはこれでもいいけど。

string buf;
long long adress;

関数での受け渡しの時に一変数の方が見やすい。
見た目、書く量減らすには継承になった。駄目か?
980デフォルトの名無しさん:2010/06/01(火) 23:22:45
なにが問題なのか分かってて、隠蔽もできてるんなら使っても良いよ
981デフォルトの名無しさん:2010/06/01(火) 23:32:20
変数はDWORDとsize_tと__int64に統一するか。
あとfopenも追加しよう。
DWORD (unsigned long) はWINAPIの要請で使うしかないな。
HTTP(S)も同じ操作にしようと思っているところ。
982デフォルトの名無しさん:2010/06/02(水) 00:04:03
>>979
コード公開したいなら他人が弄り易いコードにすれば?
仮想デストラクタとか多重継承とかを考えれば普通そこで継承はない。
983デフォルトの名無しさん:2010/06/02(水) 02:56:51
コード見る限り、addressはinaddrとoutaddrみたいな単独の変数にしてもよかったんじゃないか?
まあstringadrでもいいけどせめてprivateにしよう。
というかなぜprivateにしなかったし。

itiって最初何のことか分からんかった。
984デフォルトの名無しさん:2010/06/02(水) 07:01:35
構造体でいいんじゃない
985デフォルトの名無しさん:2010/06/02(水) 07:34:17
ここまでadressのスペルミスに言及なし。
986デフォルトの名無しさん:2010/06/02(水) 07:36:34
>>983がこっそり直してる
987デフォルトの名無しさん:2010/06/02(水) 15:19:22
set<int> age;
age.insert( 0 );

set<int>::iterator itr = age.find(0);
if( itr != age.end() ){
 *itr = 1; // 38行目
}

をコンパイルすると、
hoge.cpp:38: error: assignment of read-only location ‘itr.std::_Rb_tree_const_iterator<_Tp>::operator* [with _Tp = int]()’
というエラーが出てくるのですが、原因が分かりません。
どうしたら解決できるでしょうか?
988デフォルトの名無しさん:2010/06/02(水) 15:54:09
templateの練習のために自作スマポ作ってみた物の
やっぱりboost使っておけばいいじゃんという結論に落ち着いてなんだかなぁ

自作スマポ練り込んで使ってる人って居ます?
989デフォルトの名無しさん:2010/06/02(水) 15:54:26
>>967 ageの目的は?
990デフォルトの名無しさん:2010/06/02(水) 15:55:03
多分だけど、setは格納してる値でソートするから、
外部から書き換えられるとソートされた
状態を維持できない(かもしれない)。
たから書き込み禁止にしてるんじゃないかな。
対処としては、検索して見つかったのをeraseして、新たな値をinsertする、とかじゃないかな。
991989:2010/06/02(水) 16:05:28
GCC だからそうなった。
GCCについて part9
992デフォルトの名無しさん:2010/06/02(水) 17:04:14
>>988
scoped_ptrに動的削除子とdeep copyの機能持たせただけのやつは自作してけっこう使ってる
自作でshared_ptr以上のものってなるとしんどいけど、shared_ptrじゃオーバーだろって時は自作してもいいんじゃね?
993デフォルトの名無しさん:2010/06/02(水) 17:29:11
>>987

std::setのイテレータはconst_iteratorってちゃんとエラーに出てるじゃん
insert()で入れなされ
994デフォルトの名無しさん:2010/06/02(水) 18:26:30
オブジェクトの配列を引数として渡すことはできるでしょうか?
{
Object obj[8]

func( obj );
}

func( Object *obj ){

obj[0]->getobj();
obj[1]->getobj();
}

みたいな、わかりづらくてすみません。
995デフォルトの名無しさん:2010/06/02(水) 18:30:44
>>994
当然

オブジェクトのリファレンスも渡す事ができる

template <int N>
func(Object (&obj)[N])
{
}
996デフォルトの名無しさん:2010/06/02(水) 18:31:34
>>994
おっとまった

obj[0]->getobj();
obj[1]->getobj();

これはおかしいな

obj[0].getobj();
obj[1].getobj();

こうか

obj->getobj(); だろ
997デフォルトの名無しさん:2010/06/02(水) 18:57:48
ツリー構造のテンプレートライブラリってあります?
998デフォルトの名無しさん:2010/06/02(水) 19:03:27
setとか2分木の可能性
触れる部分は少ないが
参考にはなる
999デフォルトの名無しさん:2010/06/02(水) 19:13:06
というかリファレンスじゃないと渡せないだろ。
即値で渡すと配列型からポインタに変換されてしまって動かないし、要素数書いても無視される。
一方でリファレンス使えば勝手に変換されることもないので、
テンプレートで要素数推論してObject[N]型へのリファレンスで渡せば問題なく通る。
1000デフォルトの名無しさん:2010/06/02(水) 19:24:13
void func(int *p, size_t n);

template <size_t N> void func(int (&a)[N])
{
func(a, N);
}

通はこうするよ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。