2017-11-03 7 views
0

クラス内で動的配列を使用しようとしていますが、「静的でないメンバーは特定のオブジェクトに相対的でなければなりません。ここにコードがあります。クラス内で動的配列を使用しているときにエラーが発生しました

class Calendar 
{ 
    private: 
     static int holidayCount; 
     int * holidayDates = new int[10]; 

    public: 
     static void addHolidayCount() 
     { 
      holidayCount++; 
     } 

     static int getHolidayCount() 
     { 
      return holidayCount; 
     } 

     static void addHolidayDate(int day, int month, int year) 
     { 
      holidayDates[0] = 1; 
     } 
}; 

メインの機能でこの同じタイプのセットアップを使用すると、エラーは発生しません。例:

int * holidayDates = new int[10]; 
holidayDates[0] = 1; 

私はここで何らかの種類の構文エラーがあると推測していますが、わかりません。

+1

静的メンバーはあなたが非静的フィールドを使用することはできません – texasbruce

+0

非静的メンバ(私は '' holidayDates意味にアクセスすることはできません)静的メソッド( 'addHolidayDate') –

+0

私は参照してください。私はそれを認識していたはずです。そしてそこには、コピーして貼り付けるという危険性があります。ありがとう。 – Kahless

答えて

1

あなたのholidayDatesメンバー変数は静的ではないので、作成する各カレンダーオブジェクトに対して別々のholidayDatesポインター(および配列)があります。

一方、addHolidayDate()メソッドはstaticとマークされているため、特定のCalendarオブジェクトのコンテキスト外で実行されます。

つまり、holidayDatesからaddHolidayDate()にアクセスしようとすると、コンパイラは使用する予定のholidayDatesポインタを知る方法がありません。したがって、エラーメッセージ。

解決策は、静的にもholidayDatesにするか、addHolidayDate()を非静的にすることです。

0

holidayDatesは静的メンバーではなく、静的関数で直接アクセスすることはできません。

0

staticメンバー変数と関数は、クラスのすべてのインスタンスから独立しています。彼らは使用するクラスのインスタンスを必要としません。

staticメンバー変数と関数は、クラスのインスタンスでのみ使用できます。

コードの問題は、addHolidayDateです。これは、メンバー関数staticと定義されています。したがって、どのインスタンスにも関連付けられていません。一方、メンバー変数holidayDatesは、staticメンバー変数ではありません。クラスのインスタンスでのみ使用できます。

私は、addHolidayDateメンバー関数であることを示唆しています。static

// Don't use static 
void addHolidayDate(int day, int month, int year) 
{ 
    holidayDates[0] = 1; 
} 
0

静的メソッドでは非静的フィールドにアクセスすることはできません。だから、addHolidayDateここ

class Calendar { 
private: 
    static int holidayCount; 
    int * holidayDates = new int[10]; 

public: 
    void addHolidayCount() 
    { 
     holidayCount++; 
    } 

    int getHolidayCount() 
    { 
     return holidayCount; 
    } 

    void addHolidayDate(int day, int month, int year) 
    { 
     holidayDates[0] = 1; 
    } 
}; 

ためstaticを削除し、このクラスを使用する方法の例です:

int main() 
{ 
    Calendar* c = new Calendar(); 
    c->addHolidayDate(1, 2, 3); 
    return 0; 
} 
関連する問題