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


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

C++相談室 part10
751 名前:デフォルトの名無しさん :02/09/10 17:23
>>746
それ、パフォーマンス悪い

752 名前:デフォルトの名無しさん :02/09/10 17:31
>>739
目的を明確に。

データベースといってもいろいろなんだが、何をしたいんだ? リレーショナル
データベースを使いたいのか、オブジェクトのシリアライズをしたいだけなのか、
そのあたりを詰めると話がまったく違ってくる。

753 名前:デフォルトの名無しさん :02/09/11 00:24
C++ のオブジェクトのシリアライズをやってくれるような
データベースなんてあるの?

754 名前:デフォルトの名無しさん :02/09/11 00:29
例えば array< T > みたいなテンプレートがあって、これを容易に vector や
list に差し替える方法ってある?

イメージ的には template <class T> typedef std::vector array;
みたいな。

755 名前:デフォルトの名無しさん :02/09/11 00:51
>>753
あるらしい。昔、エピステーメーが書いてた本で読んだ覚えがある。
(その本、捨てちゃったけど)

>>754
明らかにムダなので、ないと思われ。

756 名前:デフォルトの名無しさん :02/09/11 00:52
template< template<class> class Container, class T > … Container<T>

757 名前:755 :02/09/11 00:56
>>755
vector と list 差し替えるって話はムダだが、template を typedef したいっつー
のはあり得る話か。

ちなみに、それは無い。ただし template パラメタに template を渡す、たとえば

template <template <typename T> class Prod>
class Order {
  Prod<int> prod_;
...
};

みたいな書き方は出来るから、目的は達成できると思う。

758 名前:デフォルトの名無しさん :02/09/11 01:10
>>757
g++ とかなら、
template< template<class> class C, class T > void foo( const C<T>& array ) {
for ( typename C<T>::const_iterator i = array.begin(); i != array.end(); ++i ) {
cout << *i << endl;
}
}

vector<int> v;
foo(v);
list<float> l;
foo(l);

みたいな書き方はできるけど。

759 名前:デフォルトの名無しさん :02/09/11 01:17
>>758
template template parameter ね。ただ typedef template は、なぜか ANSI C++
の規格には存在しない。

(次期 ANSI C++ の規格に入る最右翼だとは思うけど)

760 名前:デフォルトの名無しさん :02/09/11 01:47
>>753
そういうのをOODBという。

761 名前:デフォルトの名無しさん :02/09/11 02:37
objectstore?

762 名前:739 :02/09/11 10:22
いろいろなレスを頂きありがとうございます。

シリアライズできるデータベースがあるなんて知りませんでした。
今回探しているものは、リレーショナルのほうですが
そちらにも興味があります。
よろしければ名前など教えてください。

763 名前:一週間ぶり :02/09/11 12:01
こんにちわ。

764 名前:デフォルトの名無しさん :02/09/11 13:14
enumのシンボル(?)って全部大文字じゃマクロと被って紛らわしいすかね?
enum { AHYA, UHYA }; みたいなの...

765 名前:デフォルトの名無しさん :02/09/11 13:45
>>764
個人的には大文字を打つのがめんどくさい

766 名前:デフォルトの名無しさん :02/09/11 21:33
>>764
定数であることを明記するため、俺は大文字にしてるけどな。

#define AHYA 0

これと enum { AHYA = 0 }; は同じようなもんだろ?

>>764
良いエディタを使え。

767 名前:デフォルトの名無しさん :02/09/11 22:32
typedef templatesの代わりに#defineで何とかするとどれくらい残念?

768 名前:デフォルトの名無しさん :02/09/12 00:34
age

769 名前:デフォルトの名無しさん :02/09/12 00:37
>>766
エディタで解決できる問題か?

770 名前:デフォルトの名無しさん :02/09/12 00:49
>>767
引き篭もりが首吊るくらい残念。。。

771 名前:デフォルトの名無しさん :02/09/12 01:14
>>727
おそレスだがstrstremとか使っちゃダメなのかい?

772 名前:771 :02/09/12 01:17
作ってみた。
string s("apple banana orange grape");
istrstream ss(s.c_str());
string tmp;
while (ss >> tmp) {
cout << "data = " << tmp << endl;
}


773 名前:デフォルトの名無しさん :02/09/12 01:18
#define AHO 0

enum { AHO=0 };

が同じなんですね。

774 名前:デフォルトの名無しさん :02/09/12 01:47
クラスのプライベートなメンバ変数を返すパブリックな関数で

int GetValue() { return a; }



const int& GetValue() { return a; }

って同じ事ですか?
肥大化しちゃった(std::vectorとかの)オブジェクトを参照したい時に
下の方が良いかなーとか思ったのですが、実際の所どうなんでしょう?
上のやり方だとオブジェクトの実体をまるごとコピーしてるように思えるんですけど
認識間違っていますか?

775 名前:デフォルトの名無しさん :02/09/12 02:00
>>774 間違ってない。以上。

776 名前:774 :02/09/12 02:17
>775
なるほどありがとうございます

ということは、追加で質問なのですが

class cA {
public:
  const std::string& GetSTR() { return str; }
private:
  std::string str;
}

int main() {
  cA a;
  std::string b;
  b = a.GetSTR();
  b.append("test");
  return 0;
}

というのは安全なコードでしょうか?

777 名前:774 :02/09/12 02:18
あー・・・コンストラクタ書いて無いとかいうのは別として・・・

778 名前:デフォルトの名無しさん :02/09/12 02:45
>>776
b = a.GetSTR();
でbにコピーされるんじゃ?ちなみに、
a.GetSTR().append("test");
は通らない(はず)。

779 名前:デフォルトの名無しさん :02/09/12 02:49
>>778
コピーされなきゃまずいだろ。
constにはappendできないのだから。

780 名前:774 :02/09/12 02:50
あれ・・・
std::string* b;
b = a.GetSTR();
b->append("test");
かな・・・

すみません、混乱してます

781 名前:デフォルトの名無しさん :02/09/12 02:50
>>776
GetSTR()はconstであるべきだが、それ以外は別にいいんじゃないの。

782 名前:774 :02/09/12 02:51
あーごめんなさい
appendじゃなくて、例えばfindとかの話でした。
プライベートに持ってるstd::mapのキーを
std::setに列挙して返すような場合です。

783 名前:デフォルトの名無しさん :02/09/12 03:01
>>782
それなら、直に〜.find(a.GetSTR())してもいいし、
const std::string& b = a.GetSTR();
〜.find (b)
としてもいい。

784 名前:デフォルトの名無しさん :02/09/12 03:22
何か混乱してません?>>774
落ち着いて考えてみそ。

785 名前:774 :02/09/12 03:25
上手く伝わっていなかったようです
修正版コード

class cA {
public:
  const std::map<string, int>& GetMap() { return mymap; }
private:
  std::map<string, int> mymap;
}

int main() {
  cA a;
  const map<string, int>& b;
  b = a.GetMap();
  if (b.find("test"))
    cout << "OK" << endl;
  return 0;
}

こんな感じです
>783氏からちょっとヒントを得ました


が、ここまで書いてふと気が付いたんですが
こんな実装必要ないみたいでした・・・
長々と失礼しました

786 名前:デフォルトの名無しさん :02/09/12 03:37
  const map<string, int>& b;
  b = a.GetMap();

これは許されないぞ

787 名前:774 :02/09/12 03:39
あ、はい。わかります。
ごめんなさい。

788 名前:デフォルトの名無しさん :02/09/12 10:47
>>773
(´-`)。o ( ……これだけを見ると、ぜんぜん違うと突っ込みたくなるなぁ……)


789 名前:デフォルトの名無しさん :02/09/12 11:12
>>786
これって、constじゃなきゃいいの?
「&」ってやってるのがまずい?

漏れならcAのメンバ関数にint find(string )って入れて済ますけど
嫉妬期待。

790 名前:デフォルトの名無しさん :02/09/12 11:21
>>789
参照は宣言時に初期化されなければならない。

791 名前:デフォルトの名無しさん :02/09/12 12:45
コンストラクタ中で、外部の関数に this を 渡すとまずいですか?

792 名前:デフォルトの名無しさん :02/09/12 13:16
コンストラクタから出る前に、問題の関数がthisの先を見ないなら
問題は無い。例えば
class Bar;
class Foo {
    Bar *m_ptr;
public:
    explicit Foo(Bar *ptr) : m_ptr(ptr) {}
};

class Bar {
    Foo m_foo;
public:
    Bar() : m_foo(this) {},
};
はOKだけど、Foo(Bar *)がptr->xxを含んでいたらアウト。
ただし、Barの基底クラスの非仮想関数を呼ぶ場合は、少なくとも普通の
処理系なら正常に動くはず。

793 名前:デフォルトの名無しさん :02/09/12 13:20
>>792
レスありがとう。
ルール上はアウトなんですね。

794 名前:デフォルトの名無しさん :02/09/12 13:48
便乗
VC6だと
警告 Bar() : m_foo(this) {}
OK Bar() { m_foo = this;}
となるんですが、上の書き方は言語規約上OKなのでしょうか。

auto_ptr<Foo>とかで、オーナーポインタ渡すだけの為に
auto_ptrのディフォルトコンストラクタが走るのは気持ち悪いっす。

795 名前:デフォルトの名無しさん :02/09/12 14:43
どんな警告?

796 名前:794 :02/09/12 15:01
>>795
warning C4355: 'this' : ベース メンバ初期化リストで使用されました。
非静的メンバ関数の中でのみ有効な this ポインタが基本クラスの
初期化リストで使用されました。
Microsoft の拡張機能を有効にするオプション (/Ze) を付けて
コンパイルした場合はレベル 1、それ以外ではレベル 4 の警告となります。

よく考えたら、この構文通らないと、オブジェクトを直持ちした場合
構築できないじゃん。
そんなんでいいのか C++

797 名前:デフォルトの名無しさん :02/09/12 15:58
だから、コンストラクタ内で渡した先が
そのthisの中身にアクセスしなければ合法だって言ってるじゃん

798 名前:デフォルトの名無しさん :02/09/12 16:02
あぶない使い方になる可能性もあるから警告出たって良いんじゃない?
というか、直持ちした上で他のオブジェクトに依存するような設計が悪い。

799 名前:デフォルトの名無しさん :02/09/12 16:08
すいません、お尋ねします。
浮動小数点数のscientific表記(0.02e+12とか)が何を意味しているか
わかりません。解説ページご存知でしたら教えてください。

800 名前:800get :02/09/12 16:19
>0.02e+12
ワラタ

801 名前:デフォルトの名無しさん :02/09/12 16:25
基本的には、ものすご〜く大きな数か、ものすご〜く小さな数を表していると思われ。

802 名前:799 :02/09/12 16:36
>>800
Σ(゚Д゚;)
・゚・(ノД`)・゚・イッショウケンメイカイタノニ

>>801
ありがとです。
詳細な説明があるサイト知りませんでしょうか。

803 名前:800 :02/09/12 16:50
>>799
すまぬ、勘違いしてた
仮数部・指数部
0.02e+12
だと、仮数部 0.02、指数部 12 = 200000000 ぐらいか?(0適当)
勘違いは、仮数部・指数部が逆だと思ってた
(´-`).。oO(800ゲットにうかれてたんだろうな…)

804 名前:800 :02/09/12 16:55
あっでも普通は 0.2e+11 になるから「プ」ぐらいならいいのか
ん、2.0e+10 か? 処理系によるのか?

805 名前:デフォルトの名無しさん :02/09/12 18:26
まぁ、どうでもいいんだけど、
0.02e+12なる表記が出てくることってあるの?
そもそも、こういう表記って表記の定義としては正しいの?

806 名前:デフォルトの名無しさん :02/09/12 18:26
http://yahooo.s2.x-beat.com/

807 名前:デフォルトの名無しさん :02/09/12 19:06
0.02e+12=0.02×10^12

2e10 って書いても同じ



808 名前:799 :02/09/12 19:07
例えをそんなに問い詰められても・・・
わかんないから聞いたのに・゚・(ノД`)・゚・

809 名前:デフォルトの名無しさん :02/09/12 19:11
Ae±B=A×10^±B

810 名前:デフォルトの名無しさん :02/09/12 19:14
0.00001 って長く書くよりは、 1.0e-5 って書いた方が桁数がわかりやすい

811 名前:デフォルトの名無しさん :02/09/12 19:35
799はいじめられっこ

812 名前:デフォルトの名無しさん :02/09/12 19:54
0.02e+12を笑うやつが2.0e+10とかいうのか?


813 名前:デフォルトの名無しさん :02/09/12 20:03
有効桁数を問題にしたいときは 0.02e+12 とか出てくるかも。
あと、5.2e+10 と 4.8e+11 を比べるより 0.052e+12 と 0.480e+12
のほうが解りやすいとか。

814 名前:デフォルトの名無しさん :02/09/12 20:04
800もいじめられっこ

815 名前:デフォルトの名無しさん :02/09/12 20:06
便乗で質問です。
C++のcoutでfloatなんかの数字を表示するとき、
4.8e-3 みたいな表示を禁止して、常に
0.0048…みたいな表示にするのにはどうしたらよいのでしょうか?
あと表示の有効桁数を指定することも出来るのでしょうか?

816 名前:デフォルトの名無しさん :02/09/12 20:45
>>815
指数表示をやめる・・・・・fixed
有効桁数・・・・・precision(n)

817 名前:デフォルトの名無しさん :02/09/12 21:48
>816
Thanx!できましたよ。

818 名前:デフォルトの名無しさん :02/09/12 22:00
ところで、
cout.setf(ios::fixed);
cout.precision(8);
みたいに変更した後、設定をデフォルトに戻したい場合はどうすれば宜しいのですか?

819 名前:デフォルトの名無しさん :02/09/12 23:10
>>818
cout.unsetf(ios::fixed | ios::scientific);
cout.precision(6);

precisionは返り値として元の精度を返すので、それを保存しておいて
あとでprecisionに与えてもよい。

820 名前:デフォルトの名無しさん :02/09/12 23:10
while( cin >> no >> ma >> en ){
 students.push_back( Student(no, ma, en));
}

こういうコードよく見るけど(マ板からの引用)、
たとえば、noの入力が失敗した場合、
続く「cin >>ma >> en」(ただし、cinはfailになってる)は
問題ないの?
俺のg++では、どこで入力に失敗しても、
変な動作を引き起こさずにすんなりwhileを抜けてくれるんだけど、
それは標準で保証されてることなのかな?
誰か知ってたら教えて。

821 名前:デフォルトの名無しさん :02/09/12 23:31
>>820
cin >> no >> ma >> en は
((cin.operator>>(no)).operator>>(ma)).operator>>(en)と同じに
なると思うから、cinが失敗した所でoperator>>が働かなくなる
ようにされているのでは?

822 名前:820 :02/09/12 23:56
>>821
レスありがとうございます。
そうですね。それで、疑問なのは、
cinがすでにfailになっている場合、
cin >> x;
は、「何もせずにcinを戻す」のか、
何かするのか、あるいは、本当は
未定義なのかということなのです。
すみません。

823 名前:デフォルトの名無しさん :02/09/13 00:40
>819
Thanx!早速試してみたいと思います。

824 名前:デフォルトの名無しさん :02/09/13 01:15
>>822
cin.fail()がtrueの時、cin.clear()を行うまで、ストリームの処理を行わないこと
が保証されているようです(C++標準ライブラリP573)

825 名前:デフォルトの名無しさん :02/09/13 01:43
見事にcinがスキップされるね。(gcc3.2)

#include <iostream>

int main()
{
int i;

std::cin.setstate(std::ios::failbit);
std::cin >> i;
}

826 名前:デフォルトの名無しさん :02/09/13 02:25
>>825
例外を投げて欲しければ

iostate exceptions(iostate except);

でマスク外さないと。

827 名前:デフォルトの名無しさん :02/09/13 15:34
>>826

単に>>824の確認してるだけでしょ?

828 名前:デフォルトの名無しさん :02/09/13 22:14
vectorって自己参照ポインタって使えないんですか?
VC5.0ではじかれますた
こんなかんじ
class foo{
・・・
  foo* pParent;
  vector<foo*> pChild;
・・・
};
できないのでfoo** pChildにしますたが・・・
(メモリ管理自力(泣めんどくさい怒))

829 名前:デフォルトの名無しさん :02/09/13 22:19
ageてみつ


830 名前:デフォルトの名無しさん :02/09/13 22:26
vector<class foo*>?

831 名前:デフォルトの名無しさん :02/09/13 22:30
>>828
それに何の問題が??

参考までに、

#include <vector>

using namespace std;

class foo{
  foo* pParent;
  vector<foo*> pChild;
};

int main(){ return 0; }

は、VC6、BCCで通りますた。

832 名前:デフォルトの名無しさん :02/09/13 22:33
bcc5.5.1で通りますた。

833 名前:デフォルトの名無しさん :02/09/13 22:36
もしかして、thisをpChild.insert()するとか?

それは何故か知らんが、VC6だったら
vector<foo> pChild;
で通るかと。

834 名前:デフォルトの名無しさん :02/09/13 22:41
と思ったら違った。。。


835 名前:デフォルトの名無しさん :02/09/13 23:49
>>833
意味が変わってる

836 名前:デフォルトの名無しさん :02/09/14 01:21
using namespace
を何も指定されていない状態に戻すには?

837 名前:デフォルトの名無しさん :02/09/14 01:28
ない

838 名前:デフォルトの名無しさん :02/09/14 01:45
{
  using namespace hoge;
  // 有効
}
// 無効

839 名前:デフォルトの名無しさん :02/09/14 10:14
class foo
{
protected:
  type obj;
  foo* p;
public:
  hoge(){p->obj=something;}<−−−−−−*
};
*って外部からobjを操作してることになるんですか?
VC5.0だと通りますたが・・・ちょっと不安

840 名前:デフォルトの名無しさん :02/09/14 12:03
objって何

841 名前:839 :02/09/14 12:26
>>840
obj:何らかの型のオブジェクトです

hoge()の呼び出し元インスタンスと違うインスタンスのpを介して
protectedにアクセスできるのか?ということです
この日本語だと外部アクセスな気がしますが・・・
んで、VC5.0だと通っちゃうんですよ(動作も意図したとおり)

842 名前:デフォルトの名無しさん :02/09/14 12:34
あーそういうことか。

アクセス保護はクラス間の約束でしかない。

以上。

843 名前:839 :02/09/14 12:53
>>842
レスありがとうございます

844 名前:デフォルトの名無しさん :02/09/14 17:01
質問です。クラスの static メンバ変数のデストラクタが呼ばれないのですが、
何かいい方法はないでしょうか?volatile をつけても駄目でした。
コンストラクタで OS からリソースを確保するクラスは
static メンバ変数にしては駄目なのでしょうか?

以下は確かめに使ったソースです。
#include <iostream>

class A{
public: A(){std::cout << "A()\n";}
public: ~A(){std::cout << "~A()\n";}
};
class B{
public: static A ainst;
};
A B::ainst; //<- コンストラクタだけでデストラクタが呼ばれない

void fun(){
static A a; //<- これはちゃんと呼ばれる
}

void main(){
fun();
}
よろしくお願いします。

845 名前:デフォルトの名無しさん :02/09/14 17:12
グローバルで
A B::ainst;
じゃない

846 名前:デフォルトの名無しさん :02/09/14 17:13
>>843
同じクラスのインスタンスのprivateメンバに触れないんじゃ
コピーコンストラクタなんて書くとき困っちゃうよね。

847 名前:845 :02/09/14 17:14
ごめん迂闊だった
グローバルでやってるね
これでいいはずだと思ったけど・・・

848 名前:デフォルトの名無しさん :02/09/14 17:15
デストラクタ走るのが main() のあとだからじゃないかな。そのタイミングだと
cout が生きてるかどうかも分からないし。

849 名前:デフォルトの名無しさん :02/09/14 17:20
main()のリターンのあと?
処理系依存っておちはない?

850 名前:844 :02/09/14 17:23
レスありがとうございます

>>845
ちなみにただのグローバル変数にした時も同じになります。

>>848
c関数 atexit() で、出来る限り最後までやってみたのですが、
main() のはじめに atexit() した関数が呼ばれたのが
上記例の fun() 内部の a のデストラクタ呼出し後で、
ここまでは確認できたのですが…

もしスタートアップルーチンが、コンストラクトとデストラクトを
逆の順番にやってくれているとすれば(希望的観測)、
コンストラクタでは std::cout が生きていて
デストラクタで生きていないっていう事は無いような気がするのですが…

851 名前:デフォルトの名無しさん :02/09/14 17:26
デストラクタで適当にファイル作って、呼出されてるかどうか
試してみては。

852 名前:844 :02/09/14 17:28
ぎゃふん! >>848 さんの言っている事が正しかったです。

std::cout が破壊された後でした。
printf で同じ事を書いたら、ちゃんと呼ばれている事が確認できました。

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


853 名前:849 :02/09/14 17:29
そうすると外部変数ってのはmain()始まる前に確保して
終わった後に解放するの?プロセスレジスタ(?名前忘れた)は
main()の前からプログラムに入ってるって事?

854 名前:849 :02/09/14 17:31
>>852
main()から始まるわけではないんですね
なんかだまされた気分

855 名前:849 :02/09/14 17:35
_cdeclとか_pascalとか関係ない?

856 名前:844 :02/09/14 17:35
>>849
C/C++ のプログラムは(通常は)スタートアップルーチンっていう
ものがリンカによって付加されてますよん。


857 名前:849 :02/09/14 17:38
>844
調べてきまつ

858 名前:849 :02/09/14 17:41
スタックポインタの初期化
グローバルポインタの初期化
ROM to RAM コピールーチン
data 領域のコピー
bss 領域のゼロクリア
main 関数へのジャンプ
よーなことやってるんですか初めて知りましつ

859 名前:デフォルトの名無しさん :02/09/14 17:55
FAQかもしれないけど、ウィンドウ(生成・破棄)のクラス化に関する質問です

要はウィンドウプロシージャがうまくクラス内に収まらないという話なのですが
staticで修飾しちゃうとメンバにアクセスできないし
CALLBACKじゃなくしてパブリックメンバにして、CALLBACKの方から呼んでやるっていうのも
ラッパークラス自体グローバルにしなきゃいけないし、そもそも隠蔽しきれてないし・・・

何かウマイ方法は無いもんでしょうか?

860 名前:デフォルトの名無しさん :02/09/14 17:58
ATLのソースを見る

861 名前:デフォルトの名無しさん :02/09/14 18:15
thisをHWNDに埋め込む。

862 名前:デフォルトの名無しさん :02/09/14 18:45
彼女の膣に鰯を突っ込む

863 名前:デフォルトの名無しさん :02/09/14 18:48
鰯→鮪

864 名前:デフォルトの名無しさん :02/09/14 18:50
メンバに別のクラスのポインタを持つクラスを作ったとして
別のクラスのポインタが無効になったら自滅するように出来ますか?

例えばこんな風にして

class A {
};

class B {
  A* child;
public:
  B(A* a) { child = a; }
};

A* testA = new A;
B* testB = new B(testA);

Aのデストラクタが呼ばれたらBも一緒に死んでいくような・・・

865 名前:デフォルトの名無しさん :02/09/14 19:12
>>864
できない。Observer/Obsavable パターン使え。

866 名前:デフォルトの名無しさん :02/09/14 19:18
AにReference Counterとフラグ付けて、デストラクタの代わりに
A::Releaseをよびだして、そこでフラグをたて、RefCountをへらして、
Bの方では適当にフラグをポーリングすればええんでないかい?

867 名前:デフォルトの名無しさん :02/09/14 20:55
自作クラス用フレンド演算子
std::ostream& operator<< (std::ostream& lhs, const myClass& rhs)
を定義した時、これが呼ばれてほしくない場面で呼ばれてしまいます。
通常は
myClass myClassInstance;
std::cout << myClassInstance;
を想定していて、これはうまく動くのですが、インスタンスの存在するアドレスを確認したくて
std::cout << &myClassInstance;
と書いた場合まで、上の演算子が呼ばれます。
operator& () はオーバーライドしてないし、したくありません。
これは operator<<(std::ostream& lhs, myClass rhs);
にする以外でうまく解決する方法はあるでしょうか?

868 名前:デフォルトの名無しさん :02/09/14 20:58
コンパイラ変えてみたら

869 名前:デフォルトの名無しさん :02/09/14 21:20
>>867
std::ostream& operator<< (std::ostream& lhs, const myClass* rhs)
を作るとか。

870 名前:デフォルトの名無しさん :02/09/15 01:23
PCだったら少なくとも3つのコンパイラは入れるよ。

871 名前:デフォルトの名無しさん :02/09/15 01:39
>>870
includeとかlibみたいな環境変数がコンフリクトしてマズーなことになったりしない?

っていうか今時そんな環境変数でディレクトリ与えるのはもしかして主流じゃない?


872 名前:デフォルトの名無しさん :02/09/15 01:41
環境変数はMSに遠慮してどこも使わなくなったね

873 名前:デフォルトの名無しさん :02/09/15 01:53
>>872
BCCは-Iとかでディレクトリを与えてたな。gccはどうなってるの?


874 名前:デフォルトの名無しさん :02/09/15 02:17
>>873
bccもgccも設定用ファイルがあるよ

875 名前:デフォルトの名無しさん :02/09/15 02:22
MSは自社製品でconfrict起こすからな<環境変数

876 名前:無能 :02/09/15 10:34
mapのデータに関数ポインタ渡してキーに関数名入れて呼ぶと楽しいよ

877 名前:デフォルトの名無しさん :02/09/15 11:32
>>873
引数で -I, -L を使って渡すか specs という設定ファイルに書いておく。
bcc で使ってる bcc32.cfg の高機能版みたいなもんだ。

878 名前:デフォルトの名無しさん :02/09/15 11:48
>>874 >>877
サンクスです。

じゃ、VC++/bcc/gccの混在も十分可能なのか。どうしよっかな〜。


879 名前:デフォルトの名無しさん :02/09/15 13:30
iniファイル管理クラスを自作していてつまづいちゃったんですが
iniファイルみたいな3層構造([section]->key->value)を
うまく管理するにはどうしたらいいんでしょうか?

stlのmapにmap持たせようとしたり、色々やってみたんですが
僕の脳味噌じゃちょっと無理みたいです...

要件としては、iniファイルの内容を何らかのカタチでメモリ上に保持して
「[section]->key」でアクセスすると「value」が返ってくる様なモノです
もっと言っちゃうとVCLのTIniFileみたいなモノです

皆さんのお知恵をお借りしたいです
(「BCB買え」とかは無しでお願いします...)

880 名前:デフォルトの名無しさん :02/09/15 13:45
>>879
map に map 持たせろ。

881 名前:879 :02/09/15 14:29
>880
うー...頑張ります

ところでこれはCの質問だと思うんですが、ついでにお願いします

char temp[] = "aaaa\0bbbb\0cccc\0dddd\0\0";
という文字列があったとして、aaaaから順番に取り出していきたい場合

std::map< std::string, std::string > mymap;
while( 0 < strlen( temp ) ) { // \0\0 が 0 であることを期待して
  mymap[temp].insert("test"); // std::stringが\0までを文字列と扱ってくれると期待して
  temp = strchr(temp, '\0') + 1; // 最初の\0までを削除したい
}

で期待通りの動作をしてくれるでしょうか?
ちょっとwhileが絡んでくると、怖くてテストランできない...

882 名前:デフォルトの名無しさん :02/09/15 14:36
>>879
COMPOSITE にすれば?
ini ファイルというよりレジストリになるからちょっとオーバースペックか?

直前の話題とかぶるけど、なんで MS は VC の設定にレジストリ使わないんだろう?
レジストリは階層構造つきの環境変数的な意味合いじゃなかったんだろうか?
他社への嫌がらせなのかな?

883 名前:879 :02/09/15 15:35
>882
それってデザインパターンですよね
日曜PGなので理解が浅いですが、実装できるか頑張ってみます

そりゃそうと>881じゃコンパイル通らないですね...
ちょっと長いですけど実コードから抜粋

メンバ変数 std::map< std::string, std::map< std::string, std::string > > Entry;
に、Entry[section][key] = value の形でデータを収めたい

 コードは次レス(入りきらなかった...)

パッと見ておかしなところがあったら教えて下さい
よろしくお願いします

884 名前:879 :02/09/15 15:35
char* SecTemp = (char*)calloc(sizeof(char), 2048);
DWORD hRetSec = GetPrivateProfileSectionNames(SecTemp, sizeof(SecTemp), FilePath.c_str());
if (hRetSec > 0) {
  char* KeyTemp = (char*)calloc(sizeof(char), 2048);
  while(0 < strlen(SecTemp)) {
    DWORD hRetKey = GetPrivateProfileSection(SecTemp, KeyTemp, sizeof(KeyTemp), FilePath.c_str());
    if (hRetKey > 0) {
      char* key = (char*)calloc(sizeof(char), 128);
      char* value = (char*)calloc(sizeof(char), 128);
      while (0 < strlen(KeyTemp)) {
        strncpy(key, KeyTemp, strcspn(KeyTemp, "=")); // "AA=aa\0BB=bb\0CC=..."の"AA"にあたる部分を取り出す
        KeyTemp = (strchr(KeyTemp, '=')+1); // "AA="の部分を削除(前詰め)
        strcpy(value, KeyTemp); // "aa\0BB=bb\0CC=..."の"aa"にあたる部分を取り出す
        Entry[SecTemp][key] = value;
        KeyTemp = (strchr(KeyTemp, '\0')+1); // 最初の\0までを削除(前詰め)
      }
      free(key);
      free(value);
    }
    SecTemp = (strchr(SecTemp, '\0')+1); // 最初の\0までを削除(前詰め)
  }
  free(KeyTemp);
}
free(SecTemp);

885 名前:デフォルトの名無しさん :02/09/15 15:48
> パッと見ておかしなところ
3行目以降見てないけど…

> char* SecTemp = (char*)calloc(sizeof(char), 2048);
> DWORD hRetSec = GetPrivateProfileSectionNames(SecTemp, sizeof(SecTemp),
sizeof はいやん。

886 名前:デフォルトの名無しさん :02/09/15 15:52
リークし捲りなので、std::stringを使おう。

887 名前:879 :02/09/15 16:06
> DWORD hRetSec = GetPrivateProfileSectionNames(SecTemp, sizeof(SecTemp),

DWORD hRetSec = GetPrivateProfileSectionNames(SecTemp, sizeof(*SecTemp),
                                          ~~
でした...

(char*)calloc(sizeof(char), 2048); はマズイですか?
callocって「バイト数*長さ」で領域確保するんだと思ってましたがどうなんでしょう?

888 名前:879 :02/09/15 16:10
あと>886は無理じゃないですか?
GetPrivateProfileSectionNames関数にstd::string渡せないし
実体渡ししたとして、その挙動(ポイント先の確からしさ)は保証されてないし

889 名前:879 :02/09/15 16:12
>888
× 実体渡し
○ 直アクセスでポインタ渡し

890 名前:デフォルトの名無しさん :02/09/15 16:18
char* SecTemp; なら、
sizeof(SecTemp) -> 4
sizeof(*SecTemp) -> 1

891 名前:879 :02/09/15 16:21
あそうか、ポインタがポインタ持ってるんだから
sizeof(**SecTemp)か......な?
全然理解が足りてないですね僕...

892 名前:デフォルトの名無しさん :02/09/15 16:22
>>888
そういうときはフツーstd::vector<char>を使う。

893 名前:デフォルトの名無しさん :02/09/15 16:27
char t[1024]のときtの型はchar[1024]で、sizeof(t)は1024
char *pなら、pの型はchar*, (*p)の型はchar、 (**p)はエラー。
sizeofで要素数が分かるのは配列(と構造体)のときだけ。
ポインタの要素数はsizeofではわからない。

894 名前:879 :02/09/15 16:36
>893
理解しました...
では
char* SecTemp = (char*)calloc(sizeof(char), 2048);
なら
(sizeof(char)*2048);
が正解ですか?

>892
でもstlのコンテナ群って、自分のインターフェース以外が内容を書き換えちゃった場合
その後の挙動は保証されてないですよね?

895 名前:デフォルトの名無しさん :02/09/15 16:38
sizeof(char)は常に1だから、普通は単に2048とする。
(普通、はdefineとか使うんだろうが。笑い)

896 名前:デフォルトの名無しさん :02/09/15 16:41
>>894
vector<T> (T != bool) の内部データはTの配列として使えることが保証されてる。

> (sizeof(char)*2048);
正解。…だが、 sizeof(char) は常に1なので単に2048でも可。
あと意味的には calloc( 2048, sizeof(char) ); が正しいのではなかろうか。

897 名前:879 :02/09/15 16:46
恥かいたけど1つ(2つ)賢くなりました
ありがとう

898 名前:デフォルトの名無しさん :02/09/15 17:36
文字ベースのC++の(簡単な)入門が終わりました。
これからBCBでGUIなんかやりたいのですが、
よい参考書を教えていただけないでしょうか。

899 名前:デフォルトの名無しさん :02/09/15 17:46
>>898
Delphiの参考書ならなんでも可。
Object Pascal->C++の手動コンバートはなかなか面白いよ。

900 名前:デフォルトの名無しさん :02/09/15 18:38
>>896

> vector<T> (T != bool) の内部データはTの配列として使えることが保証されてる。

ソースきぼん。以前、別所でその問題について議論されてたのを
思い出した。


901 名前:896 :02/09/15 19:10
More Exceptional C++ の48ページによると
> This was fixed in 2001 as part of Technical Corrigendum #1 to
> the C++ standard, which now requires that the contents of
> a vector are stored contiguously, just like an array
とな。いや、俺もTC1の現物は見たこと無いんだけど。

902 名前:デフォルトの名無しさん :02/09/15 19:10
>>900
Effective STL に書いてある。

ANSI C++ の規格書には記述がないんだが、後で採択された amendament に
書いてあるそうだ。(俺は確認してない)

903 名前:デフォルトの名無しさん :02/09/15 21:10
デバッグすると,ある変数の値に-1.#IND000000000と入っていたのですが,これは何を意味するのでしょうか?
(INFなら無限大なのは知っています)
よろしくお願い致します

904 名前:898 :02/09/15 21:12
>>899
マジすか?Pascalなんてわかりません。(涙

知りたいのは、GUIまわり(コンポーネントって言うんですか)なので、
Pascalわからないでもよかったりします?

905 名前:デフォルトの名無しさん :02/09/15 21:27
>>903
不定値(#IND)

906 名前:デフォルトの名無しさん :02/09/15 21:28
>>903
インド人(#IND)

907 名前:デフォルトの名無しさん :02/09/15 23:05
>>904
899です。
俺もDelphiは全くやる気はないけど、何せBCBのいい参考書が全然ない
ですからね。VCL部分は全くと言っていいほど共通なので、必ず役に立ち
ますよ。

ただ、C++には独自の関数を多数備えているので、VCLでできる事でも
C++でやった方が良い場合もいくつかあります。

Object PascalとC++間のコンバートには一種の規則のようなものがあり
ますが、それをうまくまとめたHPをまだ知りません。実際に試してみられ
るのが一番の近道です。

俺はここでよく質問しています。
「C Builder相談室 Part3」
http://pc3.2ch.net/test/read.cgi/tech/1016065855/

908 名前:デフォルトの名無しさん :02/09/15 23:08
C++ユーザーのためのVCL入門リンク
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999486538&res=7

909 名前:デフォルトの名無しさん :02/09/15 23:09
コンストラクタで例外投げてくる可能性がある関数を呼ぶのってマズいですよね・・・

インスタンス生成時に1回だけしか呼んで欲しくない処理を実装したいんですけど
何かウマイ方法はないですか?
それとも複数回呼ばれた場合の処理を盛り込んだ方が賢いですか?

910 名前:デフォルトの名無しさん :02/09/15 23:21
> コンストラクタで例外投げてくる可能性がある関数を呼ぶのってマズいですよね・・・
何故?
それがインスタンス生成に絶対欠かせない関数呼び出しなら、
失敗して例外を投げた時はコンストラクタも失敗とするべきだし、
上手く呼び出せなくても何とかなる関数なら、コンストラクタの中で
try - catch で適切に対処すればよいだけ。

911 名前:デフォルトの名無しさん :02/09/15 23:23
>910
もし例外が起こりうる関数より下でnewとかしてた場合
デストラクタで無効なdeleteしちゃったり
最悪デストラクタが呼ばれない(コンストラクタが完走していないので)
とかいう事になっちゃいませんか?

912 名前:デフォルトの名無しさん :02/09/15 23:35
>>911
Effective C++ とか読んだ方が良いかもしれんな。コンストラクタ中で例外が
発生した場合には、対応するデストラクタは呼ばれないことが保証されている。
したがって、コンストラクタ中で後始末が必要な操作をする場合には

1. コンストラクタ内に try - catch を書いて後始末
 catch した後で throw; で例外をさらに外に投げる

2. メンバ変数やローカル変数としてスマートポインタを使う

いずれかで攻める。

913 名前:909 :02/09/15 23:44
なるほど
ありがとうございました

914 名前:904 :02/09/16 00:09
>>907
>>908
ありがとうございました。だいぶわかってきました。
(それにしても、BCBは不人気なのかと心配になってきました。)

915 名前:デフォルトの名無しさん :02/09/16 01:10
>>914
BCBが不人気というよりも、Delphiの出来が良すぎて皆そちらに流れて
しまうからでしょう。

もしくはC++使いはVisual C++(.NET)に流れてしまいます。結果として
BCBユーザーは少なくなってしまっているのかもしれません。

VCLはObject Pascalで書かれているので、C++との相性に今一つ難が
あるような気がします。しかし、それでも無理矢理にでも他言語に介入
できるのはC++の大きな強みだと思います。

BCBに慣れたら、Visual C++(.NET)への移行もできます。でもVCLが
便利なので、MFCが嫌になるでしょうけど。

916 名前:デフォルトの名無しさん :02/09/16 03:11
横から便乗質問。

俺は半分趣味のMFCプログラマ(全然人気のないシェアとか書いてる)
なんだけど、.NETになって迷ってる。(プロじゃないのに質問すまん。)
MFCのサポートは打ち切りらしいし、マネジッドでC#もどきをするなら、
いっそC#の方がいいのかとも思うし。
でも、C++は好きで(なじんでて)捨てるつもり気にはなれない。
結局、Builderに行こうかなあとも思うんだけど、いまいちマイナー感が。
やっぱり、参考書籍の少なさや、Delのおまけって感じが少し不安。
でも>>915なんか見ると、やっぱ、BCBでいいのかとも思うし。

VC++/MFC屋の人は、どうするつもり?

917 名前:デフォルトの名無しさん :02/09/16 03:16
>>916
> MFCのサポートは打ち切りらしいし、
VC++.net には新バージョンの MFC 入ってるけど。

918 名前:デフォルトの名無しさん :02/09/16 03:26
>>916
C#も結構イイよ。

919 名前:デフォルトの名無しさん :02/09/16 09:02
マクロやら関数宣言やらよく使うインスタンスにextren
つけたりしている.hファイルをほぼ全ての.cppでインクルードするのは
何かまずいことがありますか?
あ、他の.hファイルでインクルードする時は
#define HOGE
#include "hoge_def.h"
#undef HOGE
で"hoge_def.h"側でHOGEが定義されてたらexternを避けるとしてます

920 名前:デフォルトの名無しさん :02/09/16 09:37
>919
逆でしょ
共通ヘッダファイルに

#ifndef ___hoge_def
#define ___hoge_def
  (内容を適当に)
#endif // ___hoge_def

としておけば、多重定義にならない

921 名前:デフォルトの名無しさん :02/09/16 10:29
>>919
「ほぼ全ての.cppでインクルード」っては、ヤだな。
機能ごとに別ファイルに分類して、必要なものだけを
インクルードすべきじゃないのか。

922 名前:デフォルトの名無しさん :02/09/16 10:30
乱数を均等に作るにはどうすればいいですか?
3600の内、1〜15を当たりにすると1/240に収束するのに
7200の内、1〜30を当たりにすると1/280に収束します。なぜ?

923 名前:デフォルトの名無しさん :02/09/16 10:38
疑似乱数生成器は何使ってるの?

924 名前:デフォルトの名無しさん :02/09/16 10:42
>>922
好みのテーブルを作れ
つか、均等に(等間隔で)出てきたらそれはすでに乱数ではない

925 名前:デフォルトの名無しさん :02/09/16 10:55
例えばRAND_MAXが32767だったら
3600で割った余りは1〜367が選ばれやすいから
均等でなくなるってことですか?

926 名前:デフォルトの名無しさん :02/09/16 11:04
>>925
そう。単純にはその余りの部分が出たら捨てるといい。

927 名前:デフォルトの名無しさん :02/09/16 11:07
クジを32768本にして当たりを136本にしたら
ちゃんと1/240に収束するようになりました。
もっとスマートな解決法があればよかったのですが・・・
なにぶん初心者なもので。

928 名前:デフォルトの名無しさん :02/09/16 11:09
根が深い問題だからスマートな解決法はないと思ったほうがいいよ

929 名前:デフォルトの名無しさん :02/09/16 11:15
一番スマートなのは剰余から除算に変えること。
ただ、整数で演算を行うと誤差が出てくる。

930 名前:デフォルトの名無しさん :02/09/16 11:17
余りがその誤差に転化しただけでは?

931 名前:デフォルトの名無しさん :02/09/16 11:26
>>930
剰余は乱数の性質を変化させるけど、
除算は乱数の性質を変化させない。
除算後に表現できる数値の範囲で精度が保たれる。

932 名前:デフォルトの名無しさん :02/09/16 11:28
>>930
乱数ジェネレータの種類によるけどね。
普通の実装は剰余法だから、普通は931の言うことは正しい。

933 名前:デフォルトの名無しさん :02/09/16 11:32
インラインメンバ関数を、実装をクラス宣言と一緒じゃなくて別に書く場合、
"inline"キーワードは宣言と実装のどっちに書くのが正しいんですか?
どっちに書いてもVCとBCCではOKみたいだけど、ちょっと気になるので。

934 名前:デフォルトの名無しさん :02/09/16 11:37
オブジェクト指向ってなんぞや?

935 名前:デフォルトの名無しさん :02/09/16 11:40
>>932
ためしてみたが偏ったよ。

936 名前:932 :02/09/16 11:42
なにが?

937 名前:デフォルトの名無しさん :02/09/16 11:42
>>935
試したソースを出せ。
何か勘違いしてるだろおまえ

938 名前:デフォルトの名無しさん :02/09/16 11:43
>>933
どっちに書いてもOKじゃなくて、
どっちに書いても無視される。

939 名前:デフォルトの名無しさん :02/09/16 11:43
どっちでもいいはず。
漏れは実装側に inline を書きます。inline の無い実装が
ヘッダにあると気持ち悪いので。

940 名前:デフォルトの名無しさん :02/09/16 11:45
>>935
偏るのは当然だと思うが

941 名前:デフォルトの名無しさん :02/09/16 11:48
>>939
実装にinlineを書くと同じコンパイル単位にある関数にしか展開されないはず

942 名前:デフォルトの名無しさん :02/09/16 11:49
除算によって・・・って具体的にどんなコードになるの?
わかってる人(プ)書いてみてよ

943 名前:デフォルトの名無しさん :02/09/16 11:52
inlineて#defineと同じじゃなかった?
コンパイラから見えないと、展開できなかったと思ふ
アクセサなんかは .h に入れないと意味ナイト

944 名前:デフォルトの名無しさん :02/09/16 11:54
>>941
inline を宣言側と実装側に書いた場合とで振る舞いが変わってくるという
ことでなのしょうか。どちらの場合でも実装は .h ファイルに書きますよね。

945 名前:デフォルトの名無しさん :02/09/16 11:54
>>942
バーカ。お前なんかに見せてやんねーよ!
素人は除算で十分。

946 名前:デフォルトの名無しさん :02/09/16 11:56
>>942
rand() / (RAND_MAX / double(max));
rand() * (1.0 / RAND_MAX) * max;

普通に↑じゃないのか?

>>945
その除算を知りたがっているのでは

と、マジレスしてみるテスト。

947 名前:943 :02/09/16 11:59
すみません、ageてしまいました。

>>944
いや、>>941さんは .cpp で inline 宣言するケースを言ってるのだと
.h で宣言とは別に inline にするのならばどちらも一緒

948 名前:939 :02/09/16 12:00
>inline の無い実装が ヘッダにあると気持ち悪いので。
の補足ですが、ヘッダファイルで
class T { inline void foo(); };
void T::foo() {}
が気持ち悪いので
class T { void foo(); };
inline void T::foo() {}
としているという意味です。

949 名前:943 :02/09/16 12:13
すまん、混乱してきた。

.h ---------------------------------------------
class T {
 int get0() { return 0; } // インライン展開される
 int get1();
 inline int get2();
 int get3();
};
inline int get1() { return 1; } // インライン展開される
int get2() { return 2; } // インライン展開される

.cpp ------------------------------------------------
inline T::get3() { return 2; } // このファイル内だけでインライン展開される

で、get1かget2かって話?

950 名前:デフォルトの名無しさん :02/09/16 13:02
>>920
本題から外れるが、_ から始まる識別子は処理系が使うから避けた方が良い。
以前に、それでハマったことがある。

(それ以降は UUID 入れるようにした)

951 名前:デフォルトの名無しさん :02/09/16 14:20
>950
処理系が予約してるのって「__〜」(アンダスコア2個)までじゃなかったでしたっけ?
だからあえて3個にしてるんですけど、実際どうなんでしょう

952 名前:デフォルトの名無しさん :02/09/16 14:49
規格書には、「_ で始まる名前はグローバルな名前空間 (と ::std) で
使うために予約されている」 とある。
あと、「__ を含む名前、または _[A-Z] で始まる名前は、任意の用途で
使うために予約されている」とも書いてある。

953 名前:デフォルトの名無しさん :02/09/16 18:22
>>951それはC++で予約されてる名前だろ
_から始まる名前(2つ、3つ連続している物も含む)はC言語の頃から予約されてた
んで、C++になって明示的に_2つが予約されて、C言語用のキーワードと差別化が
計られた。

_3つ以上が予約されているのは現在も変わらず。

954 名前:デフォルトの名無しさん :02/09/16 18:32
WyvernでMP3聞きながらコンパイルしてる漏れは逝ってヨシですか?

955 名前:デフォルトの名無しさん :02/09/16 20:08
>>954
漏れも昔よくやってた。Pentium/120MHzのノートでな(w


956 名前:teset :02/09/17 03:41
double d;
__asm {
 movq d, mm0
emms
}
cout<<d<<endl;

957 名前:デフォルトの名無しさん :02/09/17 23:22
VBのVariant型変数と同じように扱えるC++のクラスってどっかに落ちてないかな。

958 名前:デフォルトの名無しさん :02/09/17 23:31
Win32SDKのVALIANT使え。

959 名前:デフォルトの名無しさん :02/09/17 23:32
>>957
boost::any とか。c++なので当たり前だがキャストが
色々要ってVariantよりは面倒だけど。

960 名前:デフォルトの名無しさん :02/09/17 23:55
CからC++への差分だけを学習させてくれ

961 名前:デフォルトの名無しさん :02/09/17 23:55
せめてクラスは全部objectだったら良かったのにね。

962 名前:デフォルトの名無しさん :02/09/18 00:20
conservation

963 名前:デフォルトの名無しさん :02/09/18 00:34
すべての親がvoidオブジェクトと考えるのはどうだ。

964 名前:デフォルトの名無しさん :02/09/18 00:45
>>963
でvoidオブジェクトはどのようにして扱う?

965 名前:デフォルトの名無しさん :02/09/18 00:52
>>960
柏原正三「標準C++の基礎知識」(ASCII)
っつー本で俺は学んだが。ちょうどC++を学びたいCプログラマ向け。


966 名前:デフォルトの名無しさん :02/09/18 00:54
>>963
ということにしたいのですね :-)

…はともかく、void じゃなくて void* だよな。

967 名前:デフォルトの名無しさん :02/09/18 01:02
全てはストラウストラープ氏の碁石のままん

968 名前:デフォルトの名無しさん :02/09/18 01:24
(´д`)ママン・・・

969 名前:デフォルトの名無しさん :02/09/18 01:26
いまさら文法の不備を指摘したところでもう手遅れ。

970 名前:デフォルトの名無しさん :02/09/18 02:57
>>966
publish()メソッドで本を出版します

971 名前:デフォルトの名無しさん :02/09/18 03:19
http://pc3.2ch.net/test/read.cgi/tech/1028553308/
でややすれ違いを指摘されたので、、こちらで。

>374 名前:デフォルトの名無しさん sage 投稿日:2002/09/18(水) 03:03
>オブジェクトを直接宣言する場合と、
> CTest oObj(Hoge);
>一旦ポインタの形で宣言しnewする場合は、
> CTest* pObj;
> pObj = new CTest(Hoge);
>どのように使い分ければいいのでしょうか?
>
>375 名前:デフォルトの名無しさん sage 投稿日:2002/09/18(水) 03:10
>スコープを外れても残したい時はnew。
>きっとここよりC++スレ向きの質問。

staticのようなイメージで捕らえればよいでしょうか?

972 名前:デフォルトの名無しさん :02/09/18 03:24
Cで、autoな配列(int hoge[10]を使うべきか、
malooc(int *p=malloc(10*sizeof(int));)を使うべきかは
割と簡単に分かるとおもう。ぶっちゃけると、前者が
CTest oObj(Hoge)で、後者がnew CTest(Hoge)。

973 名前:デフォルトの名無しさん :02/09/18 03:34
>972
おおよそのイメージがつかめました。
これからMDIのソースを見て勉強します。
どうも有り難う。

974 名前:デフォルトの名無しさん :02/09/18 03:38
>>973
あれでわかるなんてすごいな。

> Cで、autoな配列(int hoge[10]を使うべきか、
> malooc(int *p=malloc(10*sizeof(int));)を使うべきかは
> 割と簡単に分かるとおもう。ぶっちゃけると、前者が
割と簡単にわかるというけど、これ難しいと思うんだけど。


975 名前:デフォルトの名無しさん :02/09/18 03:42
>974
スタックに置かれるか、ヒープに置かれるか、
その辺の違いだと判断しました。

976 名前:972 :02/09/18 04:51
そーかー、漏れはCでポインタバリバリのあとにC++に逝ったからなぁ。
今では危ない仮定なのかな?

977 名前:デフォルトの名無しさん :02/09/18 10:11
コンパイラ実装に関する質問です。
テンプレート関数なキャスト演算子を定義したテンプレートクラスの実体を使ったとき、
VC6だとコンパイルは通るのですが、実行時にプログラム自身が落ちてしまいます。
BCC だとちゃんと対応する型に変換できるのですが、
これは VC が馬鹿なのか、BCC が融通を利かせすぎなのか、私の書き方が間違っているのか
どれなのかわかりません。この動作は標準では許容されるのでしょうか?

template<typename T>
class TemplateClassX{
 private: T val_;
 
 public: template <class U>operator U(){
  std::cout << typeid(U).name();
  return val_;
 }
};

void main(){
 TemplateClassX<int> i = 10; // ここはそういうコンストラクタがあると思ってください。
 long l = i; // vc6 だとプログラムが落ちます、bcc ではちゃんとキャスト演算子が展開されるようです。
}

978 名前:デフォルトの名無しさん :02/09/18 10:43
>>977
特におかしい所があるとは思えん。
コンストラクタが間違っているのか、あるいは
VCのtypeid(long)が壊れているか、だろうな。

979 名前:!963 :02/09/18 12:53
>>966
Hoge *が指すのはHogeかそのサブクラスである。
ならばvoid *が差すのはvoidかそのサブクラスであるとするのが良い。
という事でないかと。

980 名前:デフォルトの名無しさん :02/09/18 12:54
>>977
> std::cout << typeid(U).name();
この行を削っても落ちるね。
VC はメンバ関数テンプレートの展開が甘いんじゃないかな。

981 名前:デフォルトの名無しさん :02/09/18 13:00
>>960
差分「だけ」というが、C++ - C >>>> C という罠

982 名前:デフォルトの名無しさん :02/09/18 14:58
>>979
void*はvoidのポインタではない罠

983 名前:デフォルトの名無しさん :02/09/18 14:59
罠多すぎ。。

984 名前:デフォルトの名無しさん :02/09/18 15:17
>>979
「voidを指す」の意味がわかりません。

985 名前:デフォルトの名無しさん :02/09/18 15:38
void 型へのキャストって「変数(の値)が一度も使用されていない」
などの警告を回避する目的以外にどんな場合で使われるんだろう。

986 名前:デフォルトの名無しさん :02/09/18 15:45
>>985
煽りじゃないが,一応void型じゃなくてvoid*型な。

987 名前:デフォルトの名無しさん :02/09/18 15:49
>>986
?

988 名前:デフォルトの名無しさん :02/09/18 16:05
あ?
(void)printf()?

989 名前:デフォルトの名無しさん :02/09/18 16:12
>>988
printf() を void キャストするとどうなるんですか?

990 名前:デフォルトの名無しさん :02/09/18 17:43
>>989
lint の警告(戻り値が捨てられている)が出なくなる。

991 名前:でぃふぉるとは名無しさん :02/09/18 17:51
・lintが静かになる。
・I/O error処理なしの糞Cプログラムに。
・そういうことにしたいのですね:)

992 名前:でぃふぉるとは名無しさん :02/09/18 17:52
あ、
・compilerが"pop"する確信を持てるようになる。
を忘れた(w

993 名前:デフォルトの名無しさん :02/09/18 18:11
>>989-990
lint 対策ですか。関数の戻り値までチェックしてるんですね。
ありがとうございました。

994 名前:993 :02/09/18 18:12
ありゃまちがえた、
>>990-991

995 名前:デフォルトの名無しさん :02/09/18 18:47
新スレ立てれなかった。誰か立てて下さい。

996 名前:デフォルトの名無しさん :02/09/18 19:11
996

997 名前:997! :02/09/18 19:37
↓お前が必ず立てろ。

998 名前:v(^・^)v :02/09/18 19:54
次スレだす
http://pc3.2ch.net/test/read.cgi/tech/1032345774/
スレ立ててから続きを書こうと思ったらOSが落ちゃったよ。

999 名前:デフォルトの名無しさん :02/09/18 20:10
やっぱり次すれがたったのね。

1000 名前:デフォルトの名無しさん :02/09/18 20:11
ついで。


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