unix上での、gccコンパイルのc言語と、g++コンパイルのc++で、c++習得を目指しています。
c言語は習得済みで、c++は「独習c++」など一般書籍レベルなら理解しています。
c++でのデザインパターンを習得しようと思い、書籍「独習c++デザインパターン」を読んで、
本文のサンプルコードを手入力し、動作確認を通じて、
c++でのデザインパターンを習得しようとしています。
残念ながら、書籍「独習c++デザインパターン」には、
サンプルプログラムのCDや、ダウンロードデータがなく、
例題の全ソースコードが添付されておりません。
本文掲載の一部のソースコードを頼りに、手入力しています。
下記ソースコードをg++でコンパイルしましたが、コンパイルエラーが表示されて困っています。
いろいろ調べましたが、どのように修正すれば良いのか分からず、
本掲示板にご質問させていただきました。よろしくお願いします。
------------------------------------------------------------------------------------------------------
[1] 質問文
[1.1] 自分が今行いたい事は何か
下記コードのコンパイルエラーを修正し、コンパイルが通って実行ファイル(a.out)が生成されたことを確認したい。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
下記プログラムコードの通り手入力し、理解した内容のコメントを挿入しました。
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
[suntana@localhost test]$ g++ test.cpp
00.cpp: 静的メンバ関数 ‘static DataObject* DataObject::create()’ 内:
00.cpp:23:24: エラー: invalid use of incomplete type ‘class FileObject’
return new FileObject;
^
00.cpp:15:7: エラー: forward declaration of ‘class FileObject’
class FileObject;
^
[suntana@localhost 01.factoryMethod]$
[1.4] 今何がわからないのか、知りたいのか
下記コードのコンパイルエラーの修正方法が知りたいです。
書きコードはファイトりメソッドの実装方法を理解するための、
前段階のコードで、今回の本質問では、ファイトりメソッドの
本来の実装はこうだよ?という解答は求めておりません。
下記コードさえ実行できれよいと考えております。
なので、コメント以外、下記コードは書籍そのままで、
できるだけそのままの形で動かしたいと思っています。
[2] 環境
[2.1] OS : Linux(centos7)
[2.2] コンパイラ名 : g++
// --------------------------------------------------------------------------
// ファクトりメソッド
// 具象クラス名を明示せずにオブジェクトを生成したい。
// これにより、クラスの切り替えが容易になる。
// FileObject(開発環境) → DataBaseObject(本番環境)
// -------------------------------------
#include <iostream>
#include <map>
using namespace std;
class FileObject; // この一行(前方参照)だけは、多数のコンパイルエラーを取る為に、私が追記した。
class DataObject
{
public:
static DataObject *create()
{
// 具象クラス名はここ1カ所だけ出現する。
return new FileObject;
}
virtual string getName(int id) = 0;
};
class FileObject : public DataObject
{
public:
FileObject()
{
// ファイルからデータを読み、m_Dataに格納する。
}
string getName(int id)
{
// 引数で指定された製品idに対する製品名をm_Dataから検索して返す。
}
private:
map<int, string> m_Data;
};
int main(void)
{
DataObject *pDataObject = DataObject::create(); // こちらには具象クラス名は登場しない(させたくない)。
string strName = pDataObject->getName(1);
}