2011-02-02 20 views
2
class Base 
{ 
private: 
    static int num; 
public: 
    friend void setnum(Base obj); 
}; 

void setnum(Base obj) 
{ 
    obj.num=4; /* Error */ 
} 

フレンド関数はクラスのすべてのプライベートデータにアクセスするはずです。私はここで何が欠けていますか?私は友人機能から静的変数にアクセスすることはできません。フレンド関数からの静的変数へのアクセス

エラーcodepadから - Visual Studioのから>機能で setnum(Base)': undefined reference to ベース:: NUM」

エラー - >エラーLNK2001: 未解決の外部シンボル "プライベート: 静的int型ベース:: NUM"

+0

クラスがcppファイルに存在しました。それはちょうど基本的なコードビットでした。 –

答えて

2

あなただけの静的変数numを宣言しました。あなたはそれを定義する必要があります:

class Base 
{ 
private: 
    static int num; 
public: 
    friend void setvals(Base obj); 
}; 

// This must be in a .cpp 
int Base::num; 

void setvals(Base obj) 
{ 
    obj.num=4; 
} 

このコードは動作します。

編集:

次のように実際にあなたがsetvals()機能を実装することができます。

void setvals() 
{ 
    Base::num=4; 
} 

そして、あなたの基本クラスでは:

friend void setvals(); 

numが静的​​であるため。

+0

最初のすばらしい一見で私はこれがより有益であることがわかった –

0

静的変数は、クラスの特定のインスタンスに属しません。代わりに、可読性を向上させるために、クラス名をBase::numとし、friend関数の定義には宣言したものとは異なる署名が付いています。あなたが実際にそれを宣言しないで、静的変数を定義する必要がありますだけでなく

...

+0

あなたはobj.numとしてそれらにアクセスできます。 –

+0

あなたはアクセスできますが、その特定のインスタンスに属していることをプログラマー/リーダーに感銘します。したがって、読みやすさを向上させるために、クラス名でアクセスする必要があります。 – Mahesh

+0

それはもっと読みやすいかもしれませんが(私はそれがいつもとは思えません)、あなたは「クラス名でそれらにアクセスしなければならない」というのは間違いです。 –

4

あなたの自由な機能はsetvalsと呼ばれているが、Baseのフレンド関数はsetnumと呼ばれています。

入れ:ソース・ファイル内の

int Base::num; 

+0

5分以内に編集することは不正行為です。 :)しかし、あなたは今両方のエラーがあるので、私は私の削除します。 –

+0

@Fred Nurk:いいえ、しないでください。あなたはおそらく最初にそこに着いたでしょう。私はあなたの答えは、私の編集だった。 – peoro

+0

私はあなたが私または他の答えをコピーしたことを暗示するつもりはありませんでした。そして私は頻繁に5分以内に編集します。 :) '面、私はそれから訓練されたバッジを持っています。 –

0

別の友人:

friend void setnum(Base obj); 
     // ^^^ Not the same as vals! 
     void setvals(Base obj) 
+0

ここで私はコードのビットを貼り付けていたときに入力エラーでした、私は関数名を変更しようとしました。 –

0

C++では、.hで静的変数を宣言するだけでは不十分です。 .cppに明示的に定義する必要があります。実装の.cppに追加する必要があります。

int Base::num; 

この変数の定義が不足しているため、リンカーエラーが発生しました。

関連する問題