2016-05-19 6 views
1

これは私の最初の投稿であり、このコミュニティに感謝し始めたいと思います。 、皆さんは素晴らしいです:)オブジェクトを持つ配列を使用してクラス内のメソッドを呼び出すと、エラー "非クラス型"、C++

残念ながら、私はこの特定の質問に対する答えは見つかりませんでした。私は自分で問題を解決しましたが、私のコードがどのように、なぜ私のコードが動作するのかを理解していません。

この投稿は私と同じ問題を抱え、解決策を探しているすべての人のためのものです。しかし、解決策がなぜ機能するのか分からないので、それはまた質問です。だから、ほとんどが、私は学ぶことに興味を持ってどのように、なぜそれが私が将来:)だから、

の私のコードでそれを実装することができますので、動作しますが、これは私のコードです:

#include <iostream> 
#include <cstdlib> 

using namespace std; 

const int number=4; 

class Person 
{ 
public: 
string name; 
int age; 
void setInfo(string _name, int _age) 
{ 
    name=_name; 
    age=_age; 
} 
void Print(Person* family, int number) //This is the method I had a problem with 
{ 
    for (int i=0; i<number; i++) 
    { 
    cout<<family[i].name<<" is "<<family[i].age<<" years old"<<endl; 
    } 
} 
}; 

int main() 
{ 
Person family[number]; //Creating an array/vector to put my objects in 

for (int i=0; i<number; i++) //The user creates people for a family of 4 
{ 

    string name; 
    int age; 

    cout<<"Name on person number "<<i+1<<": "; 
    getline(cin,name); 

    cout<<"How old is the person: "; 
    cin>>age; 
    cout<<endl; 
    cin.get(); 

    family[i].setInfo(name, age); //Here I am using a . and it works just fine 
} 

family->Print(family, number); //Works! 

    //family.Print(family, number); This does not work. 
    //Errormessage: request for member 'Print' in 'family', which is of 
    //non-class type 'Person [4]' 

return 0; 
} 

私のコードは非常に簡単ですが、私が苦労しているのは、その方法を働かせることを求めることでした。

私の質問、および私が学びたいものは、です。

なぜですか?動作しませんが、 - >はしますか? - >をいつ使うのですか?私はそれを以前に使ったことはありませんし、私のコースブックでそれを読んだこともありません。私の本には、単一のオブジェクトから呼び出されるメソッドの例だけがあり、それからobject.method()が使用されます。

別の言葉で言えば、なぜfamily [i] .setInfo(name、age)ですか;仕事はしていますが家族はありません。プリント(家族、番号); ?この特定のケースで - >を使用する必要があるのはなぜですか?非クラス型である「家族」のメンバー「印刷」の要求、「人[4]」(それはどういう意味?)

あなたの答えを読んで楽しみ:

私が手にErrorMessageがありますC++についてもう少し学ぶために:

ありがとう!

編集: は、以下のいくつかの良い答えを得たが、私も説明このビデオ見つけ - >演算子:

https://thenewboston.com/videos.php?cat=16&video=17518

そして、この(クラスへの章ポインタを):

http://www.cplusplus.com/doc/tutorial/classes/

さらに、配列をもう少し理解するために、このリンク(Alan Stokesのコメントに掲載)をご覧ください。

0家族は配列で、配列名はその最初の要素へのポインタとして機能するため

Is an array name a pointer?

+0

'family'が配列で、配列名がintの最初の要素へのポインタであるからです。だから基本的に 'family-> setInfo()'は '(&family [0]) - > setinfo()'と同じです。 – coredump

+0

'std :: vector'を使う方がずっと良いでしょう。シャープなエッジが少なくなります。 –

答えて

1

あなたfamily->Print(family, number)だけで働いていました。だから基本的にfamily->setInfo()(&family[0])->setinfo()と同じです。しかし、あなたのコンパイラが言ったように、family自体は配列(またはそれの最初の要素へのポインタ)であり、Personではないので、そのようなメンバ関数setInfo()はありません。

0

family->Printは、family[0].Printと同じ意味です。

問題は、Printが非静的メンバー関数であってはならないことです。メンバー変数は一切使用せず、渡す引数に対してのみ動作します。

最も簡単な解決策は、Personのクラス定義の外にvoid Print(Person* family, int number) {....}を移動することです。

+0

もちろん、私の代理/先生からは、クラス内にプリント機能を作成するよう特別に要求されていました。 – Elola

+0

@Elolaおそらくあなたは 'Print'関数に引数がなく、そのメンバだけを出力し、それをループで呼び出すことになっています。あなたが今持っている方法は、悪いデザインです。別のオプションは 'static 'にすることです –

+0

引数なしでどうすればいいですか?このメソッドは、クラス内のすべてのオブジェクトを出力して、ユーザーが入力したすべてのファミリのリストを作成する必要があります。 – Elola

0

配列の名前( "family"の場合)は常にその配列の最初の要素へのポインタです。

+2

名前*はそのようなポインタに変換できますが、必ずしもそうではありません –

+0

Mmm ...私はこれがルールだと思っていました。どのような場合に起こることはありませんか? –

+1

配列を参照にバインドするとき、または 'sizeof'や'& 'などを使うとき –

関連する問題