C++の学習者です。Visual Studio Community 2015の上で、教本を使って勉強しています。
その中でproxy class のサンプルコードがあり、忠実にキーボードから入力してビルドしようとしたのですが、添付画面写真のようなエラーメッセージが出て、出来ませんでした。
ちゃんとクラスの定義ファイルもありますので、「識別子がクラス名でも名前空間名でもありません。」などというメッセージがどうして出るのかわかりません。
詳しい方がいらっしゃいましたら、どうぞ教えて頂きたく、お願いいたします。
プロジェクトに含まれるソースファイルやヘッダーファイルなどを下にコピーしてあります。
(1) メインプロジェクトファイル :
// ConsoleApplication84.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
// example of proxy class
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cstring>
#include <new>
using namespace std;
#include "interface.h"
int main()
{
Interface i(5);
cout << "interface contains : " << i.getValue()
<< " before setValue()" << endl;
i.setValue(10);
cout << "interface contains : " << i.getValue()
<< " after setValue()" << endl;
return 0;
}
(2) Implementation クラスのヘッダー... クライアントから隠しておきたいクラス
#pragma once
// header file for class Implementation
// example of proxy class
class Implementation {
public:
// constructor
Implementation(int v)
: value(v) // initialization syntax
{
// empty body
}
// set value to v
void setValue(int v)
{
value = v;
}
// return value
int getValue() const
{
return value;
}
private:
int value;
};// end class definition
(3) Interface クラスのヘッダー ... Implementation の proxy class
#pragma once
// header file for Interface class
class Implementation; // forward class declaration
// use this format when a pointer or reference to
// class Implementation is used
// do not write as " #include "inplementation.h" "
class Interface { // this is the proxy class of Implementation class
public:
Interface(int);
void setValue(int);
int getValue() const;
~Interface();
private:
Implementation *ptr; // use a pointer to an object in Implementation class
};
【4】Interface クラスの関数定義
// interface.cpp
// definition of member function for Interface class
#include "interface.h"
#include "implementation.h"
#include "stdafx.h"
// constructor
Interface::Interface(int v)
: ptr (new Implementation(v)) // initialize pointer
{
// empty body
}
// set value function
void Interface::setValue(int v)
{
ptr->setValue(v);
// do not take the form of assigning the value to the private pointer ptr
// but use the public function of setValue() of Implementation class through pointer ptr
// this way the client(or main() program ) of class Implementation does not access to
// the actual inside code of the class definition
}
// return value
int Interface::getValue() const
{
return ptr->getValue();
}
// destructor
Interface::~Interface()
{
delete ptr;
}
お礼
ご回答いただき、有難うございました。 "stdafx.h" を ファイルの先頭に置き換えてみたら、正常にコンパイルできました。#include にもちゃんとした順序があるのですね。今までは気にしたこともありませんでした。いい勉強になりました。