C++言語

C++

人気の記事:

コメント

  1. jinnee より:

    初歩的な質問ですみません

    構造体とクラスってどうやって使い分けてます?

    私は判らないので、クラスしか使ってませんw

  2. jinnee より:

    C++で構造体を使う場面は通信プロトコルのプロトコルレイヤを書くとか(バイナリデータ

    を操作する場合)、組み込み装置の制御インターフェイスに使用する場面が多いんじゃ

    ないでしょうか?

    アプリケーションでわざわざ構造体を使用する場面は少ないと思います。

  3. tateisu より:

    そもそもC++ではstructは「デフォルトがpublicなクラス」という意味しかありません。

    で、それとはまた違うんですが、オブジェクトと大量に作る場合は仮想関数テーブルへのポインタが馬鹿にならないので、そういう場合は仮想関数を全く持たないようなstructを定義することが多いです。

  4. tateisu より:

    でも結局は集合単位で扱うクラスを定義する方が効率的なんですよね…

    たとえば

    struct{

    char a;

    int b;

    };

    を一万個作るよりは

    struct{

    char a[10000];

    int b[10000];

    };

    の方がメモリ効率いいでしょ。

  5. 羽月 より:

    >3

    仮想関数をまったく持たないclassと、stractは違うんですか?

    (C#の場合は違うらしい)

  6. tateisu より:

    私が書いたのはそういう話ではありません。

  7. tateisu より:

    とと、これじゃ言葉が足りないな。

    >5 さんがどういう意味でstructという言葉を使っているかわかりませんが、仮想関数を持つクラスの場合はオブジェクトごとにポインタ1個分のメモリを余計に消費します。そのポインタが指す先は、そのオブジェクトに対しての仮想関数呼び出しが実際にどの関数を呼び出すのかを示す内容で、普通は関数ポインタの配列として実装されています。

    仮想関数を持たないclass/structの場合はこのような機構は必要ないため、そういったメモリ消費はありません。

    ただしアラインメントの指定によっては有効な差がでない場合もあります。

  8. 羽月 より:

    ああ、なるほど。失礼しました。

    C++ではstructがclassと(さほど)変わらないといいながら「仮想関数のないstruct」といってたので、

    さほどの部分に大きな違いがあるのかと思ってしまいました。

    ちなみにC#の場合、structは値渡し(プリミティブ扱い)でclassはポインタ渡しになるそうです。

    Javaはポインタ渡ししかできないから、ちょっとうらやましかったりして。

  9. あち より:

    http://mixi.jp/view_enquete.pl?id=550646

    につづいて、今度は好きなネーミングとかもやってみたいかも…。

    クラス名, メンバ変数名, 関数(メソッド名)

    my_any_class, any_name, do_something

    myanyclass, anyname, dosomething

    my::any_class, any_name, do_something(できるだけネームスペースを使う)

    MyAnyClass, anyName, doSomething

    MyAnyClass, AnyName, DoSomething

    CMyAnyClass, m_lpszAny, DoSomething(Microsoft命)

    などと、考えてみたのですが、他にもありでしょうか?

  10. C++Builderさん(VCL)なら

    TMyAnyClass, FLpszAny, DoSomething

    TMyAnyClass, FlpszAny, doSomething

    とかですか?

    VCLのから継承したコンポーネント(クラス)を作成する場合はクラス名に「T」を付ける事が多いです。

    VC++なら「C」を付けるのと似ています。

  11. shelarcy より:

    3番目改定案。

    ライブラリ用

    namespace myname {

    my_any_class, name_, do_something

     // 場合によっては

     namespace myname2 {

     };

    };

    使用時

    using myname::do_something; または myname::do_something

  12. S.A.M. より:

    > そもそもC++ではstructは「デフォルトがpublicなクラス」という意味しかありません。

    いままで

    class Foo {

    public:

    int a;

    int b;

    int c;

    };

    Foo foo = { 0, 1, 2 };

    ってな初期化の仕方がclassは出来ない、structはできる、

    ってのが最大の差かな、とか思ってたんですが、class

    でも上記の初期化の仕方できますねw

    このスレ見て実験するまで知らなかったです。

    でもこの書き方(集約指定子と言うらしいですが)はコンストラクタが無い、仮想関数がない、private/protectedが無いclass/structで無ければいけないらしく、C++で普通に書いてるとほとんど出番がないですな。

    ほんとにclassとstructの差はデフォルトがpublicかprivateかの差しかないんですね。

  13. shelarcy より:

    Adobe Open Source Library が公開されました。

    http://opensource.adobe.com/

    http://japan.cnet.com/news/ent/story/0,2000047623,20081058,00.htm

    http://www.kmonos.net/wlog/48.php#_1302050303

    Boost の Mailing-list によると Boost 開発者の一人 Mat Marcus が Adobe に勤務しているだけあって、結構ヘビーに template を使用したり Boost を積極的に使用したりしています。template や Boost の好きな C++ ファンの皆様はあの Adobe も使っているんだという事実に勇気づけられるのではないでしょうか?

    なお、用意されているプロジェクトファイルは Visual Studio .NET 2003 以降(Visual Srudio .NET でも使えるかもしれないけれど、 性質上 VC 7.1 以降でないときっとコンパイルできない)と Boost.Build v2 のものです。

  14. shelarcy より:

    標準化委員会で話し合われている hash ライブラリのうち、hash 関数の部分を実装したものが Boost 入りすることになりました。

    http://thread.gmane.org/gmane.comp.lib.boost.devel/120389

  15. ひでーぬ より:

    class/struct のお話ですが。

    テンプレートで、引数の class から

    派生した class を定義している場合は、

    引数に struct が渡せなかった気がします。

    内部的には class と同一ってことで、

    渡せたらちょっと便利だなーと思ったんですが…。

    CodeWarrior コンパイラは怒ってきました(^^ゞ

    つまり、派生元に struct が使えないってことですね。

    これ仕様なんでしたっけ?

  16. shelarcy より:

    > つまり、派生元に struct が使えないってことですね。

    > これ仕様なんでしたっけ?

    手元に仕様書がないので断言はできませんが、できないと MPL が不便になるのでできないってことはないと思います。少なくとも VC と GCC ではできるはずです。

  17. ひでーぬ より:

    ゴメンナサイ

    違いました♪…>_<…

    CodeWarrior も struct 派生の class はOKでした。

    んが、派生 class ポインタを struct ポインタに入れ、

    それを dynamic_cast しようとすると、

    コンパイルエラーがでました。

    そりゃそうだって感じですね♪

    つまりこういうことです↓

    typedef struct {

      int i;

      char c;

    } a;

    class b : public a {

      short s;

    };

    a *pa = new b;

    b *pb = dynamic_cast<a*>( pa );

    テンプレート内でコレやってました。

    …なんでこんなことやってんのかって

    ツッコミはちょっとご勘弁…>_<…

  18. 青猫 より:

    >b *pb = dynamic_cast<a*>( pa );

    dynamic_cast<b*> の間違い?

  19. ひでーぬ より:

    ああもう、また間違えた><

    そうです。

    青猫さんのおっしゃる通り、dynamic_cast<b*> ですね。

  20. 萌ゑ より:

    C++では、オブジェクトのレイアウトを格納するテーブルが

    含まれていないclassもしくはstructに、基底側から派生側

    へのダウンキャストを行うためにdynamic_cast演算子を使う

    ことはできません。

    つまり、多相型オブジェクト、またはそれを指すポインタに

    しか、ダウンキャストを行う事はできず、コンパイルエラー

    になります。

    JIS-X3014(ISO/IEC 14882:2003)§5.2.7.6参照。

  21. 萌ゑ より:

    付け加えておくと、C++のdynamic_cast演算子がこのような

    仕様になっている理由は、C言語の構造体と互換性を持たせる

    ためです。

    本来ならばすべてのclassまたはstructにレイアウト情報を

    持たせればダウンキャストはすべて可能になるはずですが、

    C言語との互換性を重視したために、汚い部分が出来てしまっ

    たわけです。