0

これが私のヘッダーファイルです:

#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) から情報を取得しようとしていると宣言しましたが、これは役に立ちません。私は何かが欠けています。多分あなたは問題を見つけることができますか?ありがとう。

4

2 に答える 2

2

それらは私的なものであり、公的なものではありません。外部クラスはこの変数にアクセスできません (この場合はそうExpenseですexternal class)。フレンド宣言は のプライベート データを使用するためのアクセス権を に与えますが、Innerのプライベート データを使用するためのアクセス権は与えExpenseません。この関係は推移的ではありません。ExpenseInner

于 2013-10-30T12:42:39.363 に答える