2012-03-02 8 views
0

これは、より多くのシーズニングされたC++コーダーには愚かな質問のように思えるかもしれませんが、クラスを作成し、そのクラスのオブジェクトを作成したら、作成したオブジェクトを使用してそのクラスのパブリックメソッドを呼び出します静的メソッドです。その場合は、オブジェクトまたはクラス名自体を使用して呼び出すことができます)。オブジェクトを使用せずにクラスメソッドを呼び出すか?

これはなぜ機能しますか?

関数定義:

template <typename Object> 
void printList(const List<Object>& theList) { 
    if (theList.isEmpty()) 
     cout << "Empty list!" << endl; 
    else { 
     ListItr<Object> itr = theList.first(); 
     for(; !itr.isPastEnd(); itr.advance()) 
      cout << itr.retrieve() << " "; 
    } 

    cout << endl; 
} 

ファンクションコール:

printList(myList); 

私はここで何をしないのですか?他のプログラムは、のオブジェクトを使用してprintList()と呼ぶ以外は、がクラスList<int>に属していることをどのように知っていますか?

これも途中で動作します。確認しました。私は、このような呼び出しと関数の定義方法を使用していました。今回は、関数がポインタを使って定義されていることに注意してください。

関数定義:

template <typename Object> 
void List<Object>::printList() { 
    if(this->isEmpty()) 
     cout << "Empty list!" << endl; 
    else { 
     ListItr<Object> itr = this->first(); 
     for(; !itr.isPastEnd(); itr.advance()) 
      cout << itr.retrieve() << " "; 
    } 

    cout << endl; 
} 

ファンクションコール:

myList.printList(); 
+1

'残りのプログラムは、printList()がList Listクラスに属していることをどのように知っていますか?'それはありますか? 'List 'をパラメータとするのはなぜですか?あなたが2番目の例でメンバ関数を作成するときに、これらの関数を実行している 'List ::'クラス定義外の定義。 –

+0

これはクラスのメソッドではないからです。それは単純な関数です。 –

+0

ありがとうございました - 私はそれを修正し、最初のものをメンバ関数にしました。今は呼び出すことができるオブジェクトが必要です。なぜなら、同じことが 'this'を使って行うことができるときに、オブジェクトがパラメータとして渡される必要があるのは変わったようです。 – Ambidextrous

答えて

0

ご理解の方が正しいです。 List<>について重要なことを教えてくれないか、本の重要な教訓が欠落していない限り、第2の例は第1の例より明らかに優れています。

なぜこのフラグメントはオブジェクト自体を渡す必要がありますか?

このようにコードされているためです。真剣に、あなたはおそらくあなたの本の著者である、そのコードの著者に尋ねる必要があります。

私はここで何が欠けていますか?

2つの例は同一ではありません。最初の1つは「List<>を2つ指定して、abを入力してください。は、ba.printList(b)の内容を印刷してください。、aを与えられた第二道具」には、自身の内容を印刷するaを頼む:a.printList()

本の著者は、非常に区別を説明しようとしている可能性があり、私は、彼らがしようとしているのか分かりません。あなたは、私が上記の第二の目的を達成しようとした場合のショーは、私が本を読んでいない。

を理由だけではなく、すなわちListが自分自身を印刷することができ、this

を使用しないで、 thisを使用してください。

1

はここに暗闇の中でショットを撮影していますが、Tのメンバ関数であることを、次の機能を期待していますか?

void print(const T& someT); 

これはありません。それはちょうどTを取る自由な関数です。


(それはおそらく完全に冗長である引数を取るので、メンバ関数は愚かであるが)以下は、クラス定義とメンバー関数の宣言です:

struct T { 
    void print(const T& someT); 
}; 

そして、次は同じ愚かですメンバ関数はアウトオブラインに定義:

void T::print(const T& someT) { 
    // ... 
} 

それはentirではありませんあなたがここで本当にやっていることはあなたの質問から明らかですが、最初は確かにではなく、メンバーの機能です。

+0

ありがとうございました - それを修正し、メンバー機能にしました - 私は私の質問を言い換えるべきです。呼び出しが行われるためにはオブジェクトが必要ですが、まだ私には 'this'を使ったメソッドで十分です。 – Ambidextrous

関連する問題