C++のクラスの .h と.cpp を自動生成するスクリプト

C++でクラスを大量に作るときに,同じようなファイルばっかり何個も作るのがめんどくさかったので,自動生成するスクリプトを作ってみた.要 Ruby.

実行手順は,

./ClassFileGenerator.rb author ClassName (BaseClassName)

プログラムの作者と,クラス名を引数で渡すと, .h と .cpp が自動的に生成される.(で,gvim -o で開く.)

クラス名を続けて2つ書くと,2つ目のクラスを基底クラスとしてクラスが作られる.

ClassFileGenerator.rb

#!/usr/bin/ruby
require 'date'
require 'erb'
if ARGV.length < 2
print "usage #{$0} author classname [baseclassname]\n"
exit -1
end
author=ARGV[0]
classname=ARGV[1]
baseclass=""
date=Date.today.to_s
if ARGV.length >= 3
baseclass=ARGV[2]
if !File.exist?(baseclass+".h")
system "#{$0} #{author} #{baseclass}"
end
end
if File.exist?(classname+".h") || File.exist?(classname+".cpp")
print "class #{classname} already exists.\n"
exit -1
end
h_template=ERB.new(open("H_template.erb").read)
cpp_template=ERB.new(open("CPP_template.erb").read)
open(classname+".h","w") do |f|
f.print h_template.result(binding)
end
open(classname+".cpp","w") do |f|
f.print cpp_template.result(binding)
end
system "gvim #{classname}.h #{classname}.cpp -O &"

これとは別に,以下の2つのテンプレートファイルが必要です.

H_template.erb

/*!
 * @file <%= classname %>.h
 * @author <%= author %>
 * @date Last Change:<%= date %>.
 */
#ifndef <%= classname.upcase %>_H__
#define <%= classname.upcase %>_H__
<% if baseclass!="" then %>
#include "<%= baseclass %>.h"
class <%= classname %>:public <%= baseclass %>{
<% else %>
class <%= classname %>{
<% end %>
public:
<%= classname %>();
virtual ~<%= classname %>();
protected:
private:
};
#endif

CPP_template.erb

/*!
 * @file <%= classname %>.cpp
 * @author <%= author %>
 * @date Last Change:<%= date %>.
 */
#include "<%= classname %>.h"
/*!
 * @brief デフォルトコンストラクタ
 */
<%= classname %>::<%= classname %>(){
}
/*!
 * @brief デストラクタ
 */
<%= classname %>::~<%= classname %>(){
}

ERB使ってみたかっただけなんです><

コメントする