国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ バックエンド開発 C++ D での PostgreSQL ライブラリの構(gòu)築

D での PostgreSQL ライブラリの構(gòu)築

Oct 24, 2024 am 06:16 AM

Building a PostgreSQL Library in D

私は常に新しいプログラミング言語とそのフレームワークに興味がありました。これまでずっと、私の経験と好奇心はフロントエンド開発のみに広がっていました (バックエンドもいくつかやったことがありますが?)。自分のスキルを拡張することに挑戦し、D プログラミング言語に出會いました。 D は、簡単に言うと C と CPP の上級バージョンです。

Dとは何ですか?ウェブサイトには「**D は、靜的型付け、システムレベルのアクセス、および C に似た構(gòu)文を備えた汎用プログラミング言語です。 D プログラミング言語 を使用すると、高速に書き込み、高速に読み取り、高速に実行できます。

私は作品のデータベースとして PostgreSQL を使用しており、それがこのライブラリにも PostgreSQL を選択した理由です。 PostgreSQL は、現(xiàn)在企業(yè)が使用している主要なオープンソース SQL データベース システムの 1 つであり、その機(jī)能はさらに拡張されています。

カスタム ORM ライブラリを構(gòu)築する理由

D 言語をいじっているときに、満足のいくパッケージが 1 つも見つかりませんでした。パッケージはメンテナンスが停止されているか、直接クエリとして使用できるかのどちらかです。 JavaScript のバックグラウンドから、Sequalize ORM を使用しました。それは私にアイデアを與えます。D で同様のものはどうでしょうか。

そこで、少し調(diào)べてみたところ、Postgres が C 用のライブラリを提供していることがわかりました。そこで、C のバインディングを D で使用して、ORM の開発に使用してはどうだろうと考えました。 C ライブラリを D にバインドするためのソース コードを https://github.com/adamdruppe/arsd/blob/master/postgres.d から見つけました。

はじめる

要件:

  • PostgreSQL がシステムにインストールされている必要があります。 ( PostgreSQL 16 用に開発しました)
  • IDE (Zed/VSCode/Vim)
  • DMD - d 言語コンパイラ

新しいプロジェクトを作成するには、ターミナルで次のコマンドを使用します:

  1. ターミナルまたはコマンド プロンプトを開きます。
  2. プロジェクトを作成するディレクトリに移動します。
  3. 次のコマンドを?qū)g行します。
dub init <project_name>

このコマンドは、指定された名前で新しいプロジェクト ディレクトリを作成し、D プロジェクトの基本構(gòu)造をセットアップします。

  1. 次の情報(bào)を入力するよう求められます:
    • 形式 - .sdl または .json (私は json を選択しました)
    • プロジェクトの説明 (オプション)
    • 著者名
    • ライセンス (MIT、BSD など)
    • 著作権文字列
    • 依存関係の追加 (オプション)
  2. 情報(bào)を提供すると、dub はプロジェクト名で新しいディレクトリを作成し、次のファイルを生成します。
    • dub.json: プロジェクトの構(gòu)成ファイル
    • source/app.d: メインソースファイル
    • .gitignore: Git 無視ファイル
  3. 新しいプロジェクト ディレクトリに移動します: cd
  4. D プロジェクトの開発を開始できるようになりました!

これらの手順を完了すると、基本的な D プロジェクト構(gòu)造がセットアップされ、開発の準(zhǔn)備が整います。

Windows では、以下のセクションを dub.json に追加する必要があります。

dub init <project_name>

または

私が行った方法は、必要なすべての DLL ファイルを lib (手動で作成した) フォルダーにコピーし、以下のコードを追加しました。

"libs": [ "pq" ],
    "lflags-windows-x86_64": [ "-LIBPATH:C:/Program Files/PostgreSQL/16/lib/" ],
    "copyFiles-windows-x86_64": [
        "C:/Program Files/PostgreSQL/16/lib/libpq.dll",
        "C:/Program Files/PostgreSQL/16/bin/libintl-9.dll",
        "C:/Program Files/PostgreSQL/16/bin/libssl-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libcrypto-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libwinpthread-1.dll",
        "C:/Program Files/PostgreSQL/16/bin/libiconv-2.dll"
    ],

Linux または macOS では、PostgreSQL 開発ライブラリがインストールされ、適切にリンクされていることを確認(rèn)する必要があります。通常、これを行うには、システムのパッケージ マネージャーを通じて適切なパッケージをインストールします。たとえば、Ubuntu または Debian ベースのシステムでは、次のように使用できます。

"copyFiles-windows": [
        "libs/*.dll"
    ],
    "lflags-windows": [
        "/LIBPATH:$PACKAGE_DIR/libs"
    ],
    "libs": [
        "pq"
    ]

必要なライブラリをインストールして適切にリンクしたら、PostgreSQL で動作するように D プロジェクトのセットアップに進(jìn)むことができます。

C バインディングの実裝:

D の C バインディングは次のとおりです。

sudo apt-get install libpq-dev

これで、D でこれらの関數(shù)を簡単に使用できるようになりました。
これは、基本的な例外処理のコードです:

module postgres.implementation.implementationc;

extern (C)
{
    struct PGconn
    {
    }

    struct PGresult
    {
    }

    void PQfinish(PGconn*);

    PGconn* PQconnectdb(const char*);

    int PQstatus(PGconn*); // FIXME check return value

    const(char*) PQerrorMessage(PGconn*);

    char* PQresultVerboseErrorMessage(const PGresult* res,
        PGVerbosity verbosity,
        PGContextVisibility show_context);
    PGresult* PQexec(PGconn*, const char*);
    void PQclear(PGresult*);

    PGresult* PQprepare(PGconn*, const char* stmtName, const char* query,
        ulong nParams, const void* paramTypes);

    PGresult* PQexecPrepared(PGconn*, const char* stmtName,
        int nParams, const char** paramValues,
        const int* paramLengths, const int* paramFormats, int resultFormat);

    int PQresultStatus(PGresult*); // FIXME check return value

    int PQnfields(PGresult*); // number of fields in a result
    const(char*) PQfname(PGresult*, int); // name of field

    int PQntuples(PGresult*); // number of rows in result
    const(char*) PQgetvalue(PGresult*, int row, int column);

    size_t PQescapeString(char* to, const char* from, size_t length);

    enum int CONNECTION_OK = 0;
    enum int PGRES_COMMAND_OK = 1;
    enum int PGRES_TUPLES_OK = 2;
    enum int PGRES_FATAL_ERROR = 7;
    enum PGContextVisibility
    {
        PQSHOW_CONTEXT_NEVER,
        PQSHOW_CONTEXT_ERRORS,
        PQSHOW_CONTEXT_ALWAYS
    }

    enum PGVerbosity
    {
        PQERRORS_TERSE,
        PQERRORS_DEFAULT,
        PQERRORS_VERBOSE,
        PQERRORS_SQLSTATE
    }

    int PQgetlength(const PGresult* res,
        int row_number,
        int column_number);
    int PQgetisnull(const PGresult* res,
        int row_number,
        int column_number);

    int PQfformat(const PGresult* res, int column_number);

    alias Oid = int;
    enum BYTEAOID = 17;
    Oid PQftype(const PGresult* res, int column_number);

    char* PQescapeByteaConn(PGconn* conn,
        const ubyte* from,
        size_t from_length,
        size_t* to_length);
    char* PQunescapeBytea(const char* from, size_t* to_length);
    void PQfreemem(void* ptr);

    char* PQcmdTuples(PGresult* res);

}

  • PGSqlException: 標(biāo)準(zhǔn)の D Exception クラスを継承するカスタム例外クラス。 PostgreSQL 固有のエラーを処理するように設(shè)計(jì)されています。
  • フィールド:
    • code: エラーコードを格納します
    • sqlState: SQL 狀態(tài)を保存します
    • message: エラーメッセージを保存します
  • コンストラクター: PGconn* (PostgreSQL 接続) とオプションの PGresult* (クエリの結(jié)果) を受け取ります。詳細(xì)なエラー情報(bào)を抽出するための PQresultVerboseErrorMessage および PQerrorMessage。
  • DuplicateKeyException: 重複キー エラーを処理するための単純な例外クラス。メッセージ パラメーターのみを受け取り、それを基本例外クラスに渡します。

このプロジェクトに取り組みながら、例外やその他の狀況をさらに追加していきます

次に、接続コードを記述するためのimplementation/core/core.d ファイルを作成します。

module postgres.implementation.exception;

public:
import std.conv;

private import postgres.implementation.implementationc;

class PGSqlException : Exception
{
    string code;
    string sqlState;
    string message;
    this(PGconn* conn, PGresult* res = null)
    {
        if (res != null)
        {
            char* c = PQresultVerboseErrorMessage(res, PGVerbosity.PQERRORS_VERBOSE, PGContextVisibility
                    .PQSHOW_CONTEXT_ALWAYS);
            char* s = PQresultVerboseErrorMessage(res, PGVerbosity.PQERRORS_SQLSTATE, PGContextVisibility
                    .PQSHOW_CONTEXT_ALWAYS);
           string ss = to!string(c);
           import std.string:split;
           this.code = to!string(ss.split(':')[1]);

            this.sqlState = to!string(s);
        }
        const char* m = PQerrorMessage(conn);

        this.message = to!string(m);
        super(this.message);
    }
}

class DuplicateKeyException : Exception
{
    this(string message)
    {
        super(message);
    }
}

上記のコードの重要なポイント:

  • Postgres クラス: PostgreSQL データベース接続を表します。
    • 接続の作成、クエリ、準(zhǔn)備されたステートメントの実行を管理します。
    • 前に定義した C バインディングを使用して、PostgreSQL ライブラリと対話します。
  • QueryResult クラス: データベース クエリの結(jié)果をカプセル化します。
    • クエリ結(jié)果を構(gòu)造化形式で保存します。
    • PostgreSQL から返されるさまざまなデータ型と形式を処理します。
  • エラー処理: PostgreSQL エラーのカスタム例外処理を?qū)g裝します。
  • 接続管理: 接続が失われた場合の自動再接続試行が含まれます。
  • 準(zhǔn)備されたステートメント: パラメーター バインディングを使用した準(zhǔn)備された SQL ステートメントの実行をサポートします。
  • メモリ管理: デストラクター (~this()) を使用してリソースを適切に解放します。
  • UTF-8 サポート: デフォルトで接続エンコードを UTF-8 に設(shè)定します。

この実裝は、D アプリケーションが PostgreSQL データベースと対話するための高レベルのインターフェイスを提供し、C API の低レベルの詳細(xì)の多くを抽象化します。

接続モジュールが見つかりません」という IDE 警告/エラーが表示される可能性があります

接続モジュールを作成しましょう:

_internal/connection.d ファイルを作成し、次のコードを追加します:

dub init <project_name>

SQL の定數(shù)とその他のオプションを追加します:

_internal/consts.d

"libs": [ "pq" ],
    "lflags-windows-x86_64": [ "-LIBPATH:C:/Program Files/PostgreSQL/16/lib/" ],
    "copyFiles-windows-x86_64": [
        "C:/Program Files/PostgreSQL/16/lib/libpq.dll",
        "C:/Program Files/PostgreSQL/16/bin/libintl-9.dll",
        "C:/Program Files/PostgreSQL/16/bin/libssl-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libcrypto-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libwinpthread-1.dll",
        "C:/Program Files/PostgreSQL/16/bin/libiconv-2.dll"
    ],

モデルテンプレートの作成

D は、非常に汎用的なコードを作成できる機(jī)能である テンプレート メタプログラミング をサポートしています。これは、D には C のものと似た テンプレート があることを意味しますが、より強(qiáng)力で柔軟です。
D のテンプレートの ABC | D ブログ

D's テンプレートの主な特徴:

  1. コンパイル時(shí)の型チェック: テンプレートはコンパイル時(shí)にチェックされ、型の安全性が確保されます。
  2. コード生成: テンプレートを使用して、さまざまな型または値に特化したコードを生成できます。
  3. 可変引數(shù)テンプレート: D は、型や値を含む任意の數(shù)の引數(shù)を取ることができるテンプレートをサポートします。
  4. 靜的 if と mixin: これらを使用すると、條件に基づいてコンパイル中にコードを生成および操作したり、(mixin を使用して) 文字列ベースのコードを挿入したりできます。

次に、テンプレート クラスを作成しましょう。

モデル.d

次に、https://github.com/rodevasia/sequelized/blob/main/source/postgres/model.d のコードをファイルに貼り付けて使用します

提供された GitHub リンクからコードを調(diào)べてみましょう:

"copyFiles-windows": [
        "libs/*.dll"
    ],
    "lflags-windows": [
        "/LIBPATH:$PACKAGE_DIR/libs"
    ],
    "libs": [
        "pq"
    ]

このコードは、D でテンプレート クラス Model を定義します。その主要なコンポーネントの內(nèi)訳は次のとおりです。

  1. モジュール宣言: コードは postgres.model モジュールの一部です。
  2. インポート: クラスで使用するために、さまざまな標(biāo)準(zhǔn) D ライブラリとカスタム モジュールがインポートされます。
  3. テンプレート クラス: モデル クラスは、型パラメーター T を持つテンプレートとして定義されます。これにより、クラスがさまざまな型で動作できるようになります。
  4. クラス メソッド: このクラスには、save()、update()、delete()、find() などのデータベース操作用のメソッドがいくつか含まれています。
  5. コンパイル時(shí)リフレクション: このコードは、D のコンパイル時(shí)機(jī)能を使用して、型 T のフィールドを検査し、適切な SQL クエリを生成します。
  6. SQL クエリの生成: getInsertQuery() や getUpdateQuery() などのメソッドは、T 型の構(gòu)造に基づいて SQL クエリを動的に作成します。
  7. データベース対話: このクラスは、Connection オブジェクトを使用して PostgreSQL データベースと対話します。

動作するためのコードはすべて私たちが書きました。ここを図書館にしましょう。これを dub.json に追加します

dub init <project_name>

ライブラリの使用:

新しいプロジェクトを作成しましょう:

"libs": [ "pq" ],
    "lflags-windows-x86_64": [ "-LIBPATH:C:/Program Files/PostgreSQL/16/lib/" ],
    "copyFiles-windows-x86_64": [
        "C:/Program Files/PostgreSQL/16/lib/libpq.dll",
        "C:/Program Files/PostgreSQL/16/bin/libintl-9.dll",
        "C:/Program Files/PostgreSQL/16/bin/libssl-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libcrypto-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libwinpthread-1.dll",
        "C:/Program Files/PostgreSQL/16/bin/libiconv-2.dll"
    ],

dub.json にライブラリを依存関係として追加します

"copyFiles-windows": [
        "libs/*.dll"
    ],
    "lflags-windows": [
        "/LIBPATH:$PACKAGE_DIR/libs"
    ],
    "libs": [
        "pq"
    ]

アプリd

sudo apt-get install libpq-dev

コードを分解して、その主要コンポーネントを説明しましょう:

輸入品

コードは、標(biāo)準(zhǔn)ライブラリと Sequalized ライブラリから必要なモジュールをインポートします。

  • std.stdio: 基本的な入出力操作用
  • postgres._internal.connection: データベース接続の詳細(xì)を処理します
  • postgres.implementation.core: PostgreSQL 操作のコア機(jī)能
  • postgres.model: データベース モデルを定義するためのモデル ミックスインを提供します
  • postgres._internal.consts: ライブラリで使用される定數(shù)値が含まれます

主な機(jī)能

メイン関數(shù)は、Sequalized ライブラリの使用方法を示します。

  • 接続の詳細(xì)を含む DatabaseConnectionOption オブジェクトを作成します
  • これらのオプションを使用して Postgres オブジェクトを初期化します
  • Example クラスのインスタンスを作成します
  • sync() を呼び出して、データベース內(nèi)に対応するテーブルを作成します
  • textField の値を設(shè)定し、データベースにレコードを挿入します

クラス例

このクラスはデータベース テーブルのモデルを定義します:

  • モデル ミックスインを使用して ORM 機(jī)能を継承します
  • id と textField の 2 つのフィールドを定義します
  • @Type、@PmKey、@unique などの屬性を使用してフィールド プロパティを指定します

完全なプロセスは含めていません。それはあなたが調(diào)べてください:)

私のプロジェクトに貢獻(xiàn)したい場合は、ここにリポジトリへのリンクがあります:
https://github.com/rodevasia/sequelized

以上がD での PostgreSQL ライブラリの構(gòu)築の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

c c Jul 15, 2025 am 01:30 AM

STD :: Chronoは、現(xiàn)在の時(shí)間の取得、実行時(shí)間の測定、操作時(shí)點(diǎn)と期間の測定、分析時(shí)間のフォーマットなど、時(shí)間の処理にCで使用されます。 1。STD:: Chrono :: System_Clock :: now()を使用して、現(xiàn)在の時(shí)間を取得します。 2。STD:: CHRONO :: STEADY_CLOCKを使用して実行時(shí)間を測定して単調(diào)さを確保し、DurateR_CASTを通じてミリ秒、秒、その他のユニットに変換します。 3。時(shí)點(diǎn)(Time_Point)と期間(期間)は相互運(yùn)用可能ですが、ユニットの互換性と時(shí)計(jì)エポック(エポック)に注意を払う必要があります

Cでスタックトレースを取得する方法は? Cでスタックトレースを取得する方法は? Jul 07, 2025 am 01:41 AM

主にCでスタックトレースを取得するための次の方法があります。1。LinuxプラットフォームでBackTraceおよびBackTrace_Symbols関數(shù)を使用します。コールスタックと印刷記號情報(bào)を取得することを含めることにより、コンパイル時(shí)に-RDYNAMICパラメーターを追加する必要があります。 2。WindowsプラットフォームでCaptureStackBackTrace関數(shù)を使用すると、dbghelp.libをリンクし、PDBファイルに依存して関數(shù)名を解析する必要があります。 3. Google BreakPadやBoost.StackTraceなどのサードパーティライブラリを使用して、スタックキャプチャ操作をクロスプラットフォームして簡素化します。 4.例外処理では、上記の方法を組み合わせて、キャッチブロックにスタック情報(bào)を自動的に出力します

cのポッド(平易な古いデータ)タイプとは何ですか? cのポッド(平易な古いデータ)タイプとは何ですか? Jul 12, 2025 am 02:15 AM

Cでは、POD(PlainOldData)タイプは、単純な構(gòu)造を持つタイプを指し、C言語データ処理と互換性があります。 2つの條件を満たす必要があります。MEMCPYでコピーできる通常のコピーセマンティクスがあります。標(biāo)準(zhǔn)のレイアウトがあり、メモリ構(gòu)造は予測可能です。特定の要件には、すべての非靜的メンバーが公開されており、ユーザー定義のコンストラクターまたはデストラクタがなく、仮想関數(shù)や基本クラスがなく、すべての非靜的メンバー自體がポッドです。たとえば、structpoint {intx; inty;}はpodです。その用途には、バイナリI/O、Cの相互運(yùn)用性、パフォーマンスの最適化などが含まれます。タイプがstd :: is_podを介してポッドであるかどうかを確認(rèn)できますが、c 11の後にstd :: is_triviaを使用することをお勧めします。

CからPythonを呼び出す方法は? CからPythonを呼び出す方法は? Jul 08, 2025 am 12:40 AM

CでPythonコードを呼び出すには、最初にインタープリターを初期化する必要があります。次に、文字列、ファイルを?qū)g行するか、特定の関數(shù)を呼び出すことでインタラクションを?qū)g現(xiàn)できます。 1。py_initialize()でインタープリターを初期化し、py_finalize()で閉じます。 2。pyrun_simplefileを使用して文字列コードまたはpyrun_simplefileを?qū)g行します。 3. pyimport_importmoduleを介してモジュールをインポートし、pyobject_getattringを介して関數(shù)を取得し、py_buildvalueのパラメーターを構(gòu)築し、関數(shù)を呼び出し、プロセスリターンを呼び出します

cのパラメーターとして関數(shù)を渡す方法は? cのパラメーターとして関數(shù)を渡す方法は? Jul 12, 2025 am 01:34 AM

Cには、関數(shù)をパラメーターとして渡す3つの主な方法があります。関數(shù)ポインター、STD ::関數(shù)式とラムダ式、およびテンプレートジェネリックを使用しています。 1。関數(shù)ポインターは最も基本的な方法であり、単純なシナリオまたはCインターフェイスに適していますが、読みやすさが低いです。 2。STD:: LAMBDA式と組み合わせた関數(shù)は、現(xiàn)代のCで推奨される方法であり、さまざまな呼び出し可能なオブジェクトをサポートし、タイプセーフです。 3.テンプレートジェネリックメソッドは、最も柔軟で、ライブラリコードまたは一般的なロジックに適していますが、コンピレーション時(shí)間とコードボリュームを増やす可能性があります。コンテキストをキャプチャするラムダは、std :: functionまたはテンプレートを介して渡す必要があり、関數(shù)ポインターに直接変換することはできません。

Cのヌルポインターとは何ですか? Cのヌルポインターとは何ですか? Jul 09, 2025 am 02:38 AM

anullpointerincは、aspocialvalueIndicationating notpointtopointtonyvalidmemorylocation、および炎癥を起こしたことをsusedafelymanageandcheckpointerseforeferencing.1.beforec 11,0orullwasuse、butnownullptrispreredandtypeTy.2

std :: cで作業(yè)をどのように移動しますか? std :: cで作業(yè)をどのように移動しますか? Jul 07, 2025 am 01:27 AM

std :: moveは実際には何も移動せず、オブジェクトをrvalueリファレンスに変換するだけで、オブジェクトを移動操作に使用できることをコンパイラに伝えます。たとえば、文字列の割り當(dāng)ての場合、クラスが移動セマンティクスをサポートする場合、ターゲットオブジェクトはコピーせずにソースオブジェクトリソースを引き継ぐことができます。ローカルオブジェクトの返卻、コンテナの挿入、所有権の交換など、リソースを転送し、パフォーマンスに敏感なリソースを譲渡する必要があるシナリオで使用する必要があります。ただし、動く構(gòu)造なしでコピーに退化するため、亂用するべきではなく、元のオブジェクトステータスは動き後に指定されていません。オブジェクトを通過または返すときに適切に使用すると不要なコピーを回避できますが、関數(shù)がローカル変數(shù)を返す場合、RVO最適化が既に発生する可能性があるため、STD ::移動を追加すると最適化に影響を與える可能性があります。エラーが発生しやすいことには、まだ使用する必要があるオブジェクトの誤用、不必要な動き、および動機(jī)付け不可能なタイプが含まれます

Cの抽象クラスとは何ですか? Cの抽象クラスとは何ですか? Jul 11, 2025 am 12:29 AM

抽象クラスの鍵は、少なくとも1つの純粋な仮想関數(shù)が含まれていることです。クラスで純粋な仮想関數(shù)が宣言されると(virtualvoiddosomething()= 0;)、クラスは抽象クラスになり、オブジェクトを直接インスタンス化することはできませんが、ポインターまたは參照によって多型を?qū)g現(xiàn)できます。派生クラスがすべての純粋な仮想関數(shù)を?qū)g裝していない場合、抽象クラスのままです。抽象クラスは、描畫アプリケーションの描畫際の形狀クラスの設(shè)計(jì)や、CircleやRectangleなどの派生クラスによるdraw()メソッドの実裝など、インターフェイスまたは共有動作を定義するためによく使用されます。抽象クラスを使用したシナリオには、次のものが含まれます。直接インスタンス化されるべきではないベースクラスの設(shè)計(jì)、複數(shù)の関連クラスに統(tǒng)一されたインターフェイスに従うことを強(qiáng)制し、デフォルトの動作を提供し、サブクラスが詳細(xì)を補(bǔ)足する必要があります。さらに、c

See all articles