2017-11-08 19 views
0

私はそれがパラメータとしてPersonポインタを取るメソッドが必要です。これは私がヘッダファイルと私のcppファイルの両方でそれを宣言しなければならないことを意味します。それはこのように見えます。hとcppファイルのC++の競合するポインタ宣言

PersonReg.h

#pragma once 
class PersonReg 
{ 
public: 
    PersonReg(int const maxSize); 
    void addPerson(Person* personPtr); 
    ~PersonReg(); 
}; 

PersonReg.cpp

PersonReg::PersonReg(int mSize) 
{ 
    maxSize = mSize; 
} 

void add(Person* personPtr) { 
    //Do stuff 
} 

PersonReg::~PersonReg() 
{ 
} 

問題は、Visual StudioがaddPersonための関数定義が欠落していると、それを実現するための提案を与えていると文句を言いということです。そうすれば、次のようになります。

void PersonReg::addPerson(Person * personPtr) 
{ 
} 

ここで何が起こっていますか?なぜ私の実装を見つけることができないのですか?アスタリスクの周囲のスペースはどういう意味ですか?違いは何ですか?

+5

あなたは 'PersonReg :: addPerson'の定義(実装)を*持っていないからです。あなたはグローバルな非メンバ関数を持っていますが、それは 'add 'です。 –

+0

空白は無視されます。私は見る。 – xtofl

答えて

1
void PersonReg::addPerson(Person* personPtr) { 
    //Do stuff 
} 

必要なものですか?あなたは、関数の正しい名前と名前空間を言う場所を忘れてしまいました。

また、アスタリスクの周囲のスペースは問題ではないと思います。一部の人は、名前の横にある型の隣にスペースを入れません。

+0

まあ、そのエラーを修正しましたが、それでもパラメータは互換性がないと言われています。 :S私のヘッダファイルにも私のPerson.hファイルが含まれていませんか? – brulle3

+0

なんらかの理由で私は戻り値の型を取り除いた。 – Carlos

+0

"名前空間"はこれの適切な用語ですか? – xtofl

1

基本的には、関数void add(Person* personPtr) {を作成したときに、クラス内にない関数が定義されていて、それに接続していません。一方、スコープ解決演算子::を使用した場合、クラス内にプロトタイプを持つ関数がオーバーロードされました。

簡単に言えば、void PersonReg::addPerson(Person * personPtr) はクラス内の関数を指します。

void add(Person* personPtr) {を実行している場合、クラスの一部ではない別の関数を定義しています。

これが役に立ちます。

+0

_ "プロトタイプがクラス" _ "内にある関数をオーバーロードしました。私はスコープ解決演算子を使用することは、クラス内で試作した関数_overloading_を意味するとは思わない。そのプロトタイプの実装です。 –

+0

実際には両方とも、スコープ解決演算子を使用して関数のオーバーロードとその実装を行うことができます。しかし、スコープ解決演算子を使って関数を実装しているのであれば、実際にはそうではない抽象的または仮想的なC++でなければならないと私は考えています。ところで、これはスコープ解決オペレータに関する完全なドキュメントではありません。 :) – JohnnyOnPc

+0

あなたのコメントから私が得ているのは、 'Person'内のヘッダファイルに関数プロトタイプ' void add(); 'を定義した場合です。オーバーロードのプロトタイプを指定せずに、 'void Person :: add(int a)'のようなオーバーロードをcppファイルに実装できますか? –

関連する問題