これが私のヘッダーファイルです:
#ifndef EXPENSE_H
#define EXPENSE_H
// includes
#include <string>
#define string std::string
#define ostream std::ostream
#define istream std::istream
namespace ExpenseManager{
class Expense{
private:
class Inner{
int sum;
string date;
};
Inner *i;
public:
Expense(int sum);
~Expense();
// Setters
void setSum(int sum);
void setDate();
// Getters
int getSum();
string getDate();
string toString() const;
friend class Inner;
};
}
#undef string
#undef istream
#undef ostream
#endif
ここに私の実装ファイルがあります:
// for switching assertions off
#define NDEBUG
// for debuging output
#define DEBUG
#define DEBUG_PREFIX "--> "
// header includes
#include "Expense.h"
#include "Time.hpp"
// includes
#include <cstdlib>
#include <iostream>
#include <sstream>
// error checking includes
#include <cassert>
#include <exception>
#include <stdexcept>
namespace ExpenseManager{
using namespace std;
class Expense::Inner{
friend class Expese;
};
Expense::Expense(int sum){
#ifdef DEBUG
clog << DEBUG_PREFIX "Constructor (1 arg) called!" << endl;
#endif
setSum(sum);
assert(sum >= 0); // assure that setter "setSum" works
i = new Expense::Inner();
}
Expense::~Expense(){
#ifdef DEBUG
clog << DEBUG_PREFIX "Destructor called!" << endl;
#endif
delete i;
}
// Setters
void Expense::setSum(int sum = 0){
#ifdef DEBUG
clog << DEBUG_PREFIX "setSum(" << sum << ") called!" << endl;
#endif
if (sum > 0){
i->sum = sum;
}
else {
// error, throw exception
#ifdef DEBUG
clog << DEBUG_PREFIX "invalid argument: " << sum << endl;
#endif
throw invalid_argument("Sum must be positive!");
}
setDate();
}
void Expense::setDate(){
#ifdef DEBUG
clog << DEBUG_PREFIX "setDate() called!" << endl;
#endif
i->date = currentDate(); // currentDate function is in Source.hpp file
assert(date != ""); // assure that setter works
}
// Getters
int Expense::getSum(){
return i->sum;
}
string Expense::getDate(){
return i->date;
}
string Expense::toString() const{
stringstream ss;
ss << i->sum << endl;
return ss.str();
}
}
問題は、実装ファイル変数 sum と date (別名、内部クラスにある変数) に到達できないことです。内部関数へのポインターを作成し、内部クラス ( i->date
, i->sum
) から情報を取得しようとしていると宣言しましたが、これは役に立ちません。私は何かが欠けています。多分あなたは問題を見つけることができますか?ありがとう。