classに関するdotsargのブックマーク (8)

  • C++クラス設計に関するノート

    C++が他のオブジェクト指向言語と比べて難しいのは、やはりメモリ管理をプログラマが自分でしなければいけない点だと思います。よくよく注意しないと、削除し忘れたり、同じオブジェクトを2度削除してしまうというエラーが発生します。このノートでは、オブジェクトを「値オブジェクト」と「参照オブジェクト」というカテゴリに分け、詳細設計の段階で注意すべき点を整理しておきたいと思います。 0. はじめに 私自身今までいくつかのプログラミング言語を使ってきましたが、C++ が他のオブジェクト指向言語と比べて難しいのは、やはりメモリ管理をプログラマが自分でしなければいけない点だと思います。例えば、 Person* person = new Person(); と生成したオブジェクトは、使い終わったら次のように削除しなければなりません。 delete person; 生成してすぐ削除するなら簡単なのですが、実際に

    C++クラス設計に関するノート
  • 共変型の戻り値とオーバーライドルールの緩和 | 闇夜のC++

    C++では、一般的に戻り値だけが異なるメソッドをオーバーライドすることはできません。 struct Base { virtual int func() = 0; }; struct Derived : public Base { float func() override; // エラー!戻り値型が違うぞ! };引数が違えば別関数と扱われ、単にメソッドが増えるだけなのですが、引数が同じ場合はオーバーライド対象なので、このコードはコンパイルエラーとなります。 ただし、戻り値の型が異なっていても、その型が共変型であるならばコンパイルエラーにはなりません。 オーバーライドする仮想関数の戻り値の型は、オーバーライド元の関数のものと同じか、または「共変(covariant)」でなければならない。 __C++ランゲージクイックリファレンス ……聞き慣れないですね。 要するに「戻り値の型がクラス型の参照

  • 右辺値参照とムーブコンストラクタの使い方 - C++ プログラミング

    C++ ではお馴染みの代入演算子ですけど、通常は、左辺の値を右辺の値で置き換えるという動作をします。 従来からの C++ のクラスの代入演算子では、左辺のクラスが右辺の値を受け取って処理をするような定義になっています。 右辺の値は書き換えられないので、たとえば右辺の値を左辺が引き継いで使用するとき、右辺の値がポインタだったりする場合には、大抵はどんなときでも、右辺の値を新しい値としてまるごと複製しなければいけなくなります。 このとき、もしもそのまま右辺のポインタを左辺に設定してしまうと、左辺と右辺の両方で同じポインタを使ってしまうため、たとえば左辺と右辺のどちらかが解放されるときに、もう片方でも使用中のポインタが示すメモリを開放してしまう恐れがあります。 そのため、ポインタが指す先のメモリを丸ごとコピーして新しい値として設定する必要があるのですが、それにかかるコストが大きい場合に問題になる

  • 【C#】ジェネリック引数付きコンストラクタ - 浮遊島

    C#では テンプレート型のコンストラクタに引数が渡せません using System; public class Foo<T> where T : new() { public Foo() { new T(1); } } `T': cannot provide arguments when creating an instance of a variable type 詳細:Compiler Error CS0417 Type.GetConstructor 使用すれば解決可能です using System; public static class Generic { public static T Construct<T,P1>(P1 p1) { return (T)typeof(T).GetConstructor(new Type[]{typeof(P1)}).Invoke(new ob

    【C#】ジェネリック引数付きコンストラクタ - 浮遊島
  • C++のPimplイディオム - たーせる日記

    最近読んだ『C++のためのAPIデザイン』というに興味深い技法が紹介されていてちょっと感動したので備忘録。 きっかけ C++で、あるクラスのヘッダを以下のように書いたとしましょう。 MyClass.h #ifndef MyClass_h #define MyClass_h class MyClass { public: MyClass(); virtual ~MyClass(); private: // API利用者に使わせたくない関数 void privateFunc(); }; #endif このとき、MyClassの利用者には「privateFunc()」というメンバ関数の存在が丸見えになってしまっています。 利用者は人様が作ったクラスのアクセス指定子を無効化する手段を持っているため、たとえば以下のように書くと、なんとMyClassの外側から合法的にprivateメンバにアクセスで

    C++のPimplイディオム - たーせる日記
  • C++11時代におけるクラスの書き方 - イグトランスの頭の中

    記事は、C++11 Advent Calendar 2011 : ATNDの2日目の記事です。 C++のclassは様々な使い方ができます。後発のほかの言語ではいくつもの概念に分かれているものも、C++ではすべてclassということもあります。 そこで、C++でclassを定義する際も、classと一括りにせず、自分がいったいどんなclassを書こうとしているのか明確に意識するとよいのではないだろうかと考えました。そのために、私なりのclassの分類をまとめ、この記事を書くことにしました。 これは、各々のプログラミング言語の経験により違いが出ることと思います。異論もあると思いますので、ご自身でも考えてみるとよいと思います。 以下、この記事では4種類に分類しています。 1つ目は「オブジェクト指向プログラミング (OOP) を実現するクラス」です(長いので以下OOPクラスと略します)。 vi

    C++11時代におけるクラスの書き方 - イグトランスの頭の中
  • クラスの operator を定義するとき、戻り値の型はどうすべきか

    クラスの operator を定義するとき、戻り値の型はどうすべきかのまとめ。 全体まとめ 代入演算(「=」) 和差積商(「+」「-」「*」「/」) 自身に対する和差積商(「+=」「-=」「*=」「/=」) 比較演算(「==」「!=」「<」「>」) 配列アクセス(「[ ]」) 実装例 参考 サンプルクラス 以下のクラスに、 operator を定義するとします。 class CPoint3d { public: double x, y, z; CPoint3d(double a = 0, double b = 0, double c = 0) : x(a), y(b), z(c) {} }; 全体まとめ 演算の連鎖ができるように、戻り値の型を void ではなく、ユーザー定義型にする。 自身を返す関数は、戻り値の型を、非const参照にする。 ユーザー定義型の一時オブジェクトを返す関数は、

  • C#3.0の匿名クラスでメソッド(もどき)が定義できる件 - coma2n’s diary

    C#3.0の匿名クラスってプロパティしか定義できないけど、プロパティの型をDelegateにすればメソッドみたいに振る舞うプロパティを定義できる事に気が付いた。 class Program { static void Main(string[] args) { var obj = new { Greet=(Func<string, string>)((name) => "Hello " + name) }; Console.WriteLine(obj.Greet("coma2n")); Console.Read(); } } まぁ、たいして使い道は無いんだけどね。

    C#3.0の匿名クラスでメソッド(もどき)が定義できる件 - coma2n’s diary
  • 1