メンバ関数の引数としてオブジェクトの配列をとれる?

このQ&Aのポイント
  • VC++6.0 on W2Kを使っている初心者です。メンバ関数の引数にオブジェクトの配列を指定する方法を教えてください。
  • プログラムは、数字を入力して猫のオブジェクトを作成し、それぞれに番号を付けます。猫の名前を聞くと、その猫の名前を教えてくれます。そして、別のクラスのオブジェクトが、選択した猫がおいしいと言います。
  • プログラムのコードは上記にあります。オブジェクトの配列を引数にとるメンバ関数のエラーを修正する方法を教えてください。
回答を見る
  • ベストアンサー

メンバ関数の引数としてオブジェクトの配列をとれる?

VC++6.0 on W2Kを使っている初心者です。 表題のとおりですが、具体的なプログラムは下のようです。 また、*部分に相当するところもエラーになるのですが、 どのように変えればよいのでしょうか? なお、プログラムの内容そのものには意味はなく 単に動作確認のためのサンプルです。 実行すると、 「How many cats do you create?」 と聞かれるので、数字を入力すると、 Nekoオブジェクトが生成され、i番目の猫にはiという名が付けられます。 そして、「何匹目を鳴かせますか?」と聞かれるので、 数字を入力すると、 「My name is i-th cat.」 と答えられ、さらに、Inuが、 「i-th cat is tasty.」 と答える、という内容になっています。 #include <iostream> #include <string> using namespace std; class Neko { int name; public: Neko(){} Neko(int n):name(n){} void setname(int n){name=n;} int getname(){return name;} void naku(int n) const; }; void Neko::naku(int i) const { cout <<"My name is "<<getname()<<"th cat."<<endl;・・・* } class Inu { public: Inu(){} void naku(int i) const; }; void Inu::naku(int i)const{ cout <<i<<"th cat is tasty."<<endl; } int main() { int i; int num; int temp; Neko *x; Inu y; cout <<"How many cats do you create?"<<endl; cin >>num; x=new Neko[num]; for(i=0;i<num;i++){ x[i].setname(i); } cout <<"何匹目を鳴かせますか?"<<endl; cin >> temp; x[temp].naku(); y.naku(temp); }

noname#108554
noname#108554

質問者が選んだベストアンサー

  • ベストアンサー
  • HogePiyo
  • ベストアンサー率57% (24/42)
回答No.1

#include <iostream> #include <string> using namespace std; class Neko { int name; public: Neko(){} Neko( int n ):name( n ){} void setname( int n ){ name = n; } int getname() const { return name; } // *** const オブジェクトにしました。 void naku() const; // *** 見たところ引数は必要ない }; // const オブジェクトに対して非 const オブジェクトを getname を呼び出すと // ウチの環境で警告が出ました。 void Neko::naku() const { cout << "My name is " << getname() << "th cat." << endl; // ・・・* } class Inu { public: Inu(){} void naku( int i ) const; }; void Inu::naku( int i ) const { cout << i << "th cat is tasty." << endl; } int main(){ int i; int num; int temp; Neko *x; Inu y; cout << "How many cats do you create ?" << endl; cin >> num; x = new Neko[ num ]; for( i = 0; i < num; i++ ){ x[i].setname(i); } cout << "何匹目を鳴かせますか?" << endl; cin >> temp; x[ temp ].naku(); y.naku( temp ); }

noname#108554
質問者

お礼

たびたびの投稿、お手数おかけします。 やっぱりこの方法しかないですよね・・・ 実は質問を出した後、思いついたのがこのやり方だったのですが、 x[i].setname(i); この辺が、ちょっと冗長かな?と思っていた次第です。 ありがとうございました。

関連するQ&A

  • vectorに格納されたオブジェクトの廃棄

    次のようなテストプログラムを作ってみました。 OSはVineです。 #include <iostream> #include <string> #include <vector> using namespace std; class Neko{ string name; public: Neko(){} Neko(string n):name(n){} void SetName(string n){name=n;} void Naku() const; }; void Neko::Naku() const{ cout << "名前は" << name << endl; } int main(){ int i; int num; string temp; vector <Neko> x; for(i=0;i<num;i++){ Neko *y=new Neko; x.push_back(*y); } for(i=0;i<num;i++){ cout << "名前を入力" << endl; cin >> temp; x[i].SetName(temp); } for(i=0;i<num;i++)x[i].Naku(); delete [] x;・・・※ } 廃棄(※のところ)するとき、これでは コンパイルエラーになってしまいます。 for文で回しても同じです。 どのように書けばよいのでしょうか? vectorにはポインタではなくオブジェクトが 入っていることに注意してください。

  • 4つの異なる二次配列を関数で表示

    二次配列と関数の問題です。 [日本語訳]displayArray7を呼ぶ関数を書きなさい。その関数は二次配列を一つの引数として受け取り、その内容を画面に表示すべきである。その関数は下のいずれの配列でも動作するようにしなさい。プログラムを書いてその関数を評価しなさい。 4つの配列とも一次の項(?)の数が違うじゃないですか。しかも関数を呼ぶときは配列[5][7]などはいらないですよね? (displayArray7(hours);だけ) だから、各配列の一次の項がどんな数字を持っているのかを関数displayArray7に送ることが出来ず、どのように表示してよいのか分かりません(今は一応最大値50で表示しています)。どのようにすればよいのでしょうか? 教えてください。お願いします。 #include <iostream> using namespace std; void initialize(int array[][7]); void displayArray7(int array[][7]); int main() { int hours[5][7]; int stamps[8][7]; int autos[12][7]; int cats[50][7]; initialize(hours); displayArray7(hours); initialize(stamps); displayArray7(stamps); initialize(autos); displayArray7(autos); initialize(cats); displayArray7(cats); return 0; } void initialize(int array[50][7]) { int i, j; for(i=0; i<50; i++) for(j=0; j<7; j++) array[i][j] = 0; } void displayArray7(int array[][7]) { int i, j; cout << "\t1\t2\t3\t4\t5\t6\t7" << endl << endl; for(i=0; i<50; i++){ cout << i+1 << ":"; for(j=0; j<7; j++){ cout << "\t" << array[i][j]; } cout << endl << endl; } }

  • qsortの引数について

    以下のプログラムがあります。 int compare( const char **name1, const char **name2 ) { return strcmp( *name1, *name2 ); } int main( void ) { char *names[] = { "rand", "calloc", "malloc" }; int num = sizeof names / sizeof names[0]; qsort( names, num, sizeof( names[0] ), (int (*)(const void *, const void * ))compare ); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~この部分 return 0; } 上の「~~~」の上の部分のqsort関数の第4引数のキャストの意味が 分かりません。なぜ関数の前に引数が書かれるのでしょうか? またintの後にある(*)は「int型のポインタ」と言う意味なのか、 compare関数のポインタなのかも分かりません。 ご回答よろしくおねがいします。

  • 配列受け渡し

    要素数nであるint型配列xから値がkである要素の添え字を返却する関数(ただし、値がkである要素が存在しなければ-1を返却するものとし、そのような要素が複数存在する場合は、先頭側の最も小さい添え字を返却する)を作成しています。 #include<iostream.h> #include<iomanip.h> int search(int x[],int n,int k) { int i,j; int result=-1; for(i=0;i<n;i++){ if(x[i]==k){ result=i; return(result); } else return(-1); } } int main(void) { const int ninzu = 5; int height[ninzu]; cout << ninzu << "要素:\n"; int i; for (i = 0; i < ninzu; i++) { cout << setw(2) << i+1 << "番目:"; cin >> height[i]; } cout << "検索要素は?:"; int target; cin >> target; int result=search(height, ninzu, target); if(result==-1) cout<<"ないよ"<<endl; else cout<<result+1<<"番目が"<<target<<endl; return (0); } このようにしたのですが、うまくいきません。また、複数の要素が発生したときの返却の仕方がわかりません。 どなたかアドバイス等よろしくお願いします。

  • POJ 2718

    #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; int numbers[10]; int length; int n; int permutation(int num[10]){ int i; int oneco=0; for(i=0;i<length;i++){ if(num[i]){oneco++;} } int length2 = length-oneco; if((oneco==length)||(oneco==0)){return 1000000000;} if(abs(length2-oneco)>=2){return 1000000000;} vector<int> one; vector<int> two; for(int i=0;i<length;i++){ if(num[i]){one.push_back(numbers[i]);} else{two.push_back(numbers[i]);} } int len1 = one.size(); int len2 = two.size(); //cout << len1 << len2 << endl; // int num1[10];int num2[10]; vector<int> num1; vector<int> num2; //cout << one[1] << one[2] << endl; int count1=0;int count2 = 0; sort(one.begin(),one.end()); sort(two.begin(),two.end()); do{ int num=0; for(int i=1;i<len1;i++){ int onei = one[i]; for(int i2=0;i2<i;i2++){ onei = onei*10; } num = num + onei; }//cout << num << endl; if(one[0]==0){num = num;} else {num = num + one[0];} num1.push_back(num); //cout << num << endl; count1++; }while(next_permutation(one.begin(),one.end())); do{ int num = 0; for(int i=1;i<len2;i++){ int twoi = two[i]; for(int i2 =0;i2<i;i2++){ twoi = twoi*10; } num = num + twoi; // cout << num << endl; }//cout << "here" << num << endl; if(two[0]==0){num = num;} else {//cout << num ; num = num + two[0]; //cout << " " << num << endl; } num2.push_back(num); //cout << "here" << num << endl; count2++; }while(next_permutation(two.begin(),two.end())); int ans = 1000000000; //cout << len2; int dummy1 = 1; for(int x=1;x<len1;x++){ dummy1 = dummy1*10; }//cout << dummy1; int dummy2 = 1; for(int x=1;x<len2;x++){//cout << dummy2<< endl; dummy2 = (dummy2)*10; //cout << dummy2<< endl; }//cout << dummy2; for(int i=0;i<count1;i++){//cout << num1[i] << dummy1 << endl; if((num1[i]%dummy1)==num1[i]){if(num1[i]!=0){continue;}} for(int i2=0;i2<count2;i2++){ if((num2[i2]%dummy2)==num2[i2]){if(num1[i]!=0){continue;}} ans = min(ans,abs(num1[i]-num2[i2])); } } return ans; } //int permutation(int i[10]){return 1;} int dfs(int i,int num[10]){ if(i==length) return permutation(num); num[i]=0; int ans1 = dfs(i+1,num); num[i]=1; int ans2 = dfs(i+1,num); return min(ans1,ans2); } int main(){ cin >> n; getchar(); for(int i=0;i<n;i++){ /*for(length=0;length<10;length++){ cin >> numbers[length]; char c = getchar(); if(c=='\n'){break;} }*/ string str; while(1){ char c = getchar(); if(c=='\n'){break;} str += c;} length = 0; for(int i2=0;i2<str.length();i2=i2+2){ numbers[length] = (int)str[i2]-'0'; length++; } // cout << length; int dummy[10] = {0,0,0,0,0,0,0,0,0,0}; cout << dfs(1,dummy) << endl; } } 上記のどこが間違っているか教えてください。POJの2718です。書いてあるテストは通りました。

  • 再帰関数を用いて配列の合計を求める

    かなり(約三時間)悩んでまだ分からないので質問します。 再帰関数を用いて配列の中の数字(floatで定義されている)の合計を求めるプログラムを作っています。階乗を求めるプログラムの例を見ながらやっているのですがもう降参です。簡単だと思ったんですけど配列と組み合わせでもう頭がパニックです。どなたか答え(またはヒント)を教えてください。 よろしくお願いします。 なお、下のプログラムは私が1から作りましたので完全に間違っている可能性大です。参考にしないでください。(^^ゞ #include <iostream> using namespace std; float recur(int numF); int main() { int num; float sum; cout << "Enter an integer number: "; cin >> num; //再帰関数なんてこうやれば使わなくても出来るのに~! // for(i=0; i<num; i++) // sum += array[i]; sum = recur(num); cout << "The sum of all the numbers: " << sum << endl; return 0; } float recur(int numF) { int i; float array[numF]; //定数式が必要です、と怒られる for(i=0; i<numF; i++) return array[i] += array[i-1]; //ここに再帰の式が必要 }

  • なぜエラーになるのかわかりません

    入力した文字列からthがいくつ含まれるのかというプログラミングを作りたいのですが>if( sentence[i] == 'th' )の部分で 「比較において定数が範囲外」というエラーがでてしまいます。eなどひとつの文字でならでないのですが・・・よくわからないので教えてください #include <iostream.h> main() { const int Max_Length = 80 ; char sentence[Max_Length] ; int count ; int th ; for(;;){ // 文字列の入力 cout << "\n 文字列を入力して下さい(英数字のみ) >> " ; cin.getline( sentence, Max_Length ) ; // 文字数を数える count = 0 ; while( sentence[count] != '\0' ){ count++ ; } //thの数を数える th = 0 ; for( int i = 0 ; i <= count ; i++ ){ if( sentence[i] == 'th' ) th++ ; } // 文字列の再表示と結果の表示 cout << "\n 文字列= " << sentence << endl ; if( th == 0 ) cout << "thは含まれません" << endl ; cout << "thの数は" << th << endl ; } }

  • 条件の配列

    表題の件に付いて質問させていただきます。 複数の条件分岐を簡便に記述する方法を探しております。 簡単な例でいいますと、 int main(){  int value=3;  if(value==0)std::cout <<"value="<<0 <<std::endl;  if(value==1)std::cout <<"value="<<1 <<std::endl;  if(value==2)std::cout <<"value="<<2 <<std::endl;  if(value==3)std::cout <<"value="<<3 <<std::endl; } 上記プログラムの複数の条件分岐をfor文をもちいてかきかえる場合、conditionクラスを作成して class condtion{ private:  int *a;  int b; public  void SetPointer(int* value){a=value}  void SetVal(int val){b=val}  bool isTrue(){   if(*a==b){return true;}   else{ return faulse;}  } } int main(){  int value=3;  condition c[4]; //クラス  for(int i=0;i<4;i++){   c[i]->SetPointer(&value);   c[i]->SetVal(i);  }  for(int i=0; i<4; i++){   if(c[i].isTrue())std::cout<<"i="<<i<<std::endl;  } } と実装できそうな気がするのですが、(上記プログラムは動作確認しておりません。) 変数が増えたり、条件が複雑になると少々繁雑になってしまいそうな気がしております。 もっと簡便に条件分岐を配列として処理する方法は存在しますか? 関数ポインタなどがつかえるのでしょうか? アドバイスよろしくお願いいたします。

  • c++ で *の逆三角旗を作りたいです

    普通の三角旗はできましたが逆三角旗が分かりません 例えば3と入力したら * ** *** ** * こんな感じで出力させたいのですが考え方が分かりません 普通の方のコードはこんな感じです int i, j; cin>>num; for (i = 1;i <= num;++i) { for (j=1;j<=i;j++) { cout << "*"; } cout << endl; } for (i = 1;i <= num-1 ;i++) { for (j=1;j<=num-i;j++) { cout << "*"; } cout << endl; } cout << endl;

  • 可変引数をconstで参照渡し

    以下のようなクラスをconstの参照渡しでうけとる、可変引数を持つ関数を作りたいのですが、以下のようにしてもうまくいきません。 何か良い方法はないものでしょうか? template<class TT> class vector3{ public:  enum{NUM=3};  TT x[NUM];  void Sum(const int num,...); }; template<class TT> void vector3<TT>::Sum(const int num,const ...){  int i,j;  va_list list;  va_start(list,num);  for(i=0;i<NUM;i++){   x[i]=va_arg(list,&vector3<TT>).x[i];  }  for(j=1;j<num;j++){   for(i=0;i<NUM;i++){    x[i]+=va_arg(list,&vector3<TT>).x[i];   }  }  va_end(list); }

専門家に質問してみよう