C++クラスのstatic変数を初期化する

July 21,2017 12:03 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

C++クラスのstatic変数を初期化する方法を紹介します。

1.はじめに

C++クラスのメンバ変数は普通、newでインスタンスを作る際に初期化するのですが、staticな変数で初期化は一度だけ行いたいという状況が発生しました。

ということでその要件を満たすためのサンプルを作ってみました。

2.staticな変数を1度だけ初期化する

具体的には、newの前にstatic変数を初期化し、そのあとインスタンスを作るというものです。

sample.h

class Sample {
private:
    int bar;
public:
    static int foo;
    Sample(int number);
    void display();
};

sample.cpp

#include <iostream>
#include "sample.h"
 
int Sample::foo;
 
Sample::Sample(int number) {
    bar = number;
}
void Sample::display() {
    std::cout << foo << " " << bar << std::endl;
}

test.cpp

#include "sample.h"
 
int main() {
    Sample::foo = 999;
    Sample* a = new Sample(100);
    a->display();
    return 0;
}

実行

% g++ sample.cpp test.cpp
% ./a.out
999 100

ということで、newする前に初期化したstatic変数をインスタンスからアクセスしても値が保持されていることが確認できました。

サンプルではpublicにして、外部から直接アクセスしていますが、static関数を用意すればprivateでも大丈夫だと思います。

Comments [0] | Trackbacks [0]

Workflowプラグイン(多段階承認・日時指定・グループ選択・複数承認版)リリース

July 19,2017 12:33 AM
Category:[ワークフロー]
Tag:[]
Permalink

本ブログで公開中のMovable Type用「Workflowプラグイン」の多段階承認版に、日時指定・グループ選択・複数承認機能を追加した版をリリースします。

イメージ
イメージ

以下、主な機能について紹介します。

1.日時指定承認

既存のWorkflowプラグインでは日時指定承認が行えませんでしたが、新しくリリースしたWorkflowプラグインでは最終承認者の日時指定承認が行えます。

日時指定承認

公開後の日時指定承認も可能です。

2.複数承認

既存のWorkflowプラグインでは、通常の1段階承認および多段階承認について、それぞれの段階で1名しか承認行為を行えませんでしたが、新しくリリースしたWorkflowプラグインでは2名以上が承認行為を行えるようになりました(その順位に登録された承認者が全員承認しないと、次承認者が承認を行えないか、記事の公開が行われません)。

複数承認設定は、承認者作成画面にある「複数承認」の項目を設定します。

複数承認

承認者の設定状況確認や内容の修正は、「ワークフロー」→「承認者一覧」の管理画面から行えます。

承認者一覧

承認時、他の同順位承認者が未承認の場合、承認エリアに「現在同順位承認者の承認待ちです。」というメッセージを表示します。

メッセージ

3.グループ選択

既存のWorkflowプラグインでは、多段階設定で1つのグループしか作成できませんでしたが、新しくリリースしたWorkflowプラグインでは複数のグループを作成・選択できるようになりました。

選択方法は、ライターがステータスを「未公開(承認待ち)」にすると「承認依頼」エリアに「承認グループ」というグループ選択用プルダウンが表示されるので、ここから選択します(このプルダウンを選択しない状態で承認依頼すると警告が表示されます)。

グループ選択

グループを選択すると、プルダウンメニューの下に承認依頼メールの送信ユーザーが表示されます。

グループ選択

承認者が承認依頼または承認・差し戻しするときの記事編集画面およびプレビュー画面では、ライターの選択したグループが固定された状態で表示されます。選択されたグループに所属していない承認者は、記事の承認はできません。

承認者

「ツール」→「プラグイン」→「Workflow」→「設定」で「ライターによる承認グループ変更」を「使用する」にすれば、ライターは公開された記事の承認依頼時にグループを変更できるようになります。

ライターによる承認グループ変更

グループ作成方法は、グループ設定を行いたいウェブサイトまたはブログ管理画面の「ツール」→「プラグイン」→「Workflow」→「設定」をクリックし、「グループ機能」のプルダウンから「使用する」を選択して「変更を保存」をクリック。

グループ機能

グループ設定を行いたいウェブサイトまたはブログ管理画面の「ワークフロー」→「グループ新規作成」をクリック。

グループ新規作成

下記の項目を設定して「保存」をクリック。

  • グループ名:グループ名を入力。ここで入力した名称がライターのグループ選択プルダウン等に反映されます
  • グループID:グループ名に対応する任意のIDを半角英数・アンダーバーで入力
  • 説明:グループの説明を入力
  • 承認:この承認者に属するユーザー名を入力。複数のユーザーを設定する場合、改行で区切って入力
  • 承認者:このグループに属する承認者ID(注:承認者のユーザー名ではありません)を改行で区切って入力。入力順番に制限はありません

グループ作成画面

設定状況の確認や内容の修正は、「ワークフロー」→「グループ一覧」から行えます。

グループ一覧

4.プラグインの詳細

新バージョンのWorkflowプラグインの詳細につきましては、下記のページからご確認いただけます。

Workflowプラグイン
プレビュー画面

Comments [0] | Trackbacks [0]

CからC++のクラスを利用する方法

July 12,2017 12:03 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

CからC++のクラスを利用する方法を紹介します。

1.問題点

下記のC++プログラムを作りました。

foo.h

class Foo {
public:
    Foo();
    int abc(void);
};

foo.cc

#include "foo.h"
#include <iostream>
 
Foo::Foo() {}
 
int Foo::abc(void) {
    std::cout << "OK\n";
}

このC++プログラムをCのプログラムからアクセスしたいのですが、方法が分かりません。

ということで、CからC++のクラスを利用する方法を紹介します。

2.CからC++のクラスを利用する

やり方は色々あると思いますが、ここではC++プログラムにCからアクセスするためのラッパーを追加する方法を紹介します。

foo.h

#ifdef __cplusplus
extern "C" {
#endif
 
class Foo {
public:
    Foo();
    int abc(void);
};
 
void construct();
void execute();
void destruct();
 
#ifdef __cplusplus
}
#endif

ヘッダfoo.hには、ラッパー関数construct()、execute()、destruct()を宣言し、全体を「extern "C"」で括ります。「extern "C"」については「extern "C"の意味」をご覧ください。

foo.cc

#include "foo.h"
#include <iostream>
 
Foo::Foo() {}
 
int Foo::abc(void) {
    std::cout << "OK\n";
}
 
Foo *foo;
void construct() {
    foo = new Foo() ;
}
 
void execute() {
    foo->abc();
}
 
void destruct() {
    delete(foo);
}

foo.ccでは各ラッパー関数からクラスにアクセスするよう実装します。

Cのプログラム(test.c)は次のように書きます。

test.c

extern construct();
extern execute();
extern destruct();
 
int main() {
    construct();
    execute();
    destruct();
}

C++のラッパー関数はextern宣言します。

ビルドは、C++のコンパイルはg++、Cのコンパイルはgcc、リンケージはg++で行います。

% gcc -c test.c
% g++ -c foo.cc
% g++ -o a.out foo.o test.o

その他、上記のサンプルではラッパー内でnewを実施しないと実行時にセグメンテーションフォルトになったため、もしかしたらコンストラクタの実装が必要かもしれません。

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages