Как передать вектор объектов любого класса функции, не являющейся членом, в качестве ссылки? - PullRequest
0 голосов
/ 04 апреля 2020

Это то, что я пробовал

В прототипе функции

void display(const std::vector<movies>& v);

В определении функции

void display(const movies std::vector<movies>& v){
  std::cout<<v.get_name();
}

вызов функции

display(list1);

Когда я запускаю это, я получаю эти ошибки

  movies.cpp:52:46: error: expected unqualified-id before ‘&’ token
  void display(const movies std::vector<movies>& v){
                                               ^
  movies.cpp:52:46: error: expected ‘)’ before ‘&’ token
  movies.cpp:52:48: error: expected initializer before ‘v’
  void display(const movies std::vector<movies>& v){
                                                 ^

Редактировать После предложения от @aschepler в комментариях. Если я удалю лишние "фильмы" из определения функции. Теперь определение функции становится

void display(const std::vector<movies>& v){
  std::cout<<v.get_name();
}

Тем не менее он не скомпилируется, и теперь он показывает другое сообщение об ошибке.

movies.cpp: In function ‘void display(const std::vector<movies>&)’:
movies.cpp:53:16: error: ‘const class std::vector<movies>’ has no 
member named ‘get_name’  std::cout<<v.get_name();
                                      ^~~~~~~~~~

Мой полный код также приведен ниже, если вы хотите go через него.

Также я начинающий, поэтому, пожалуйста, будьте добры.

определение моих фильмов класса

  movies.h file
  #pragma once
  #include<string>
  #include<vector>
    class movies{
      private:
   std::string name;
   double rating;
   int times_watched;
  public:
   static int num_movies;
  movies();
  ~movies();
   movies(std::string,double,int);
   void set_name(std::string);
   void set_rating(double);
   void set_times_watched(int);
   std::string get_name() const;
   double get_rating() const;
   int get_watch_history() const;
  };
 void display(const std::vector<movies>& v);

Реализация класса

  movies.cpp file
  #include "movies.h"
  #include<iostream>
  int movies::num_movies=0;
  movies::movies()
   :name{"null"},rating{0},times_watched{0}{
      num_movies++;
  }
 movies::~movies(){
    num_movies--;
 }
 void movies::set_times_watched(int t){
    times_watched=t;
 }
 void movies::set_name(std::string nm){
     this->name=nm;
 }
void movies::set_rating(double d){
   this->rating =d;
}
std::string movies::get_name() const{
 return this->name;
}
double movies::get_rating() const{
return this->rating;
}
int movies::get_watch_history() const{
   return this->times_watched;
   }
  movies::movies(std::string na,double k,int s)
    :name{na},rating{k},times_watched{s}{
    num_movies++;
    }
    bool rating_check(double rt){
        if((rt<=5)&&(rt>=0)){
           return true;
          }else{
         return false;
       }
    }
   bool times_watched_check(int watched){
     if(watched>=0){
         return true;
       }else{
        return false;
       }
     }
void display(const movies std::vector<movies>& v){
     std::cout<<v.get_name();
   }

Основная программа

main.cpp file
#include<iostream>
#include<vector>
#include<string>
#include "movies.h"
int main(){
 std::vector<movies>list1 (1,movies());
 std::string temp {"null"},temp1;
 int num=0,flag=0;
 double temp2;
 while(temp != "n"){

 std::cout<<"enter name:";
 std::cin>>temp1;
 if(num!=0){
     for(int j=0;j<=num;j++){
         if(temp1==list1[j].get_name()){
             std::cout<<"movie already present"<<std::endl;
             flag=1;
             break;
            }
        }
    }
    if(flag==0){
         list1[num].set_name(temp1);
          temp1.clear();
    rating:
          std::cout<<"enter your rating of movie(on a scale of 5):";
          std::cin>>temp2;
          if(rating_check(temp2)){
              list1[num].set_rating(temp2);
          }else{
              std::cout<<"Invalid Input.Please Try Again."<<std::endl;
               goto rating;
          }
   times_watched:
            std::cout<<"Number of times you have watched "<<list1[num].get_name()<<":";
            std::cin>>temp2;
          if(times_watched_check(temp2)){
              if(temp2==0){
                   std::cout<<"It means,You haven't Watched the movie.\nSo please first watch the movie."<<std::endl;
                   list1.erase(list1.begin()+num);
                   goto mv;
              }else{
                  list1[num].set_times_watched(temp2);
              }
          }else{
              std::cout<<"Invalid Input.Please Try Again."<<std::endl;
               goto times_watched;
          }
          num++;
          std::cout<<"you want to add more movies:";
          std::cin>>temp;
          if((temp=="Yes")||(temp=="yes")||(temp=="YES")||(temp=="y")||(temp=="Y")){
               list1.resize(list1.size()+1);
                continue;
            }
    }
    if(flag==1){
           mv:
              std::cout<<"do you want to add any other movie:";
              std::cin>>temp;
              if((temp=="Yes")||(temp=="yes")||(temp=="YES")||(temp=="y")||(temp=="Y")){
                   list1.resize(list1.size()+1);
                   flag=0;
                    continue;
                }else{
                    if((temp=="no")||(temp=="NO")||(temp=="n")){
                        break;
                    }else{
                        std::cout<<"Invalid Input.Please Try Again."<<std::endl;
                        goto mv;
                    }
                }
    }

   }
   display(list1);
   return 0;
  }

1 Ответ

0 голосов
/ 04 апреля 2020

Он не компилируется из этой строки, потому что вы вызываете функцию для массива фильмов, когда вы можете вызвать функцию только для одного элемента.

movies.cpp:53:16: error: ‘const class std::vector<movies>’ has no 
member named ‘get_name’  std::cout<<v.get_name();
                                      ^~~~~~~~~~
                              ----->v[I].get_name(); **would compile

Возможно, цель вашей программы - иметь класс под названием Movies, который содержит вектор фильмов. В противном случае назовите этот класс mov ie (единственное число).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...