【问题标题】:fill an array of type class inside another class在另一个类中填充类型类的数组
【发布时间】:2022-01-27 19:47:48
【问题描述】:

我是 C++ 新手,最近我开始学习便便我想创建一个类 movies 和一个类。 directors 一个类 movie 应该有一个 directors 数组,我想从控制台填充该数组。当我运行代码时,它会显示第一行和第二行并停止执行: enter image description here 这是我的代码:

#include<iostream>
#include<string>

using namespace std;

class directors{
   string name;
   string lastname;
       public:
           directors(){
               
           }
           directors(string a,string b){
               name=a;
               lastname=b;
           }
           void createdirector(){
                   cout<<"name of director:"<<endl;
                   cin>>name;
                   cout<<"last name:"<<endl;
                   cin>>lastname;
           }
       
           
};

class movie{
   string name;
   directors* director;
   public:
       film(){
           directors* director=new directors[20];
       };

       void creatmovie(){
           cout<<"name of movie"<<endl;
           cin>>name;
           director[0].createdirector();
       }   
};

int main(){ 
movie a; 
a.creatmovie(); 

}

【问题讨论】:

  • 使用std::vector。无论如何,请提取并提供minimal reproducible example 及其作为文本生成的输出。作为她的新用户,也请收下tour,阅读How to Ask
  • 作为 C++ 新手,您应该做的第一件事就是给自己一个 good C++ book
  • 您的代码甚至不应该编译:您已向movie 添加了一个film 成员,该成员使用构造函数的语法,但使用的名称与包含类的名称不同。此外,任何动态分配资源的类也应该包含释放这些资源的逻辑,通常在析构函数中,所以假设你为数组movie::director分配内存,应该有析构函数在做delete[] director;为了让它正常工作,你需要确保如果构造函数成功完成,director 要么包含通过 new[] 分配的值,要么为 null。

标签: c++ c++11 c++14


【解决方案1】:

更好的方法是使用std::vector,如下所示。使用std::vector优势 是您不必担心手动内存管理(例如明确使用newdelete)。 vector 会处理它(内存管理)。您可以使用下面给出的示例作为参考。

#include<iostream>
#include<string>
#include <vector>


class director{
   std::string name;
   std::string lastname;
       public:
           director(){
               
           }
           //use constructor initializer list
           director(std::string a,std::string b): name(a), lastname(b){
               
           }
           
           void createDirector() 
           {
                   std::cout<<"Enter name of director:"<<std::endl;
                   std::cin>>name;
                   std::cout<<"Enter last name:"<<std::endl;
                   std::cin>>lastname;
           }
           void displayDirector() const
           {
               std::cout << "Firstname: "<<name<<" Lastname: "<<lastname<<std::endl;
               
           }
       
           
};

class movie{
   std::string name;
   std::vector<director> directors; //vector of director objects
   public:
       
       //constructor that creates vector directors of size vecSize 
       movie(size_t vecSize): directors(vecSize)
       {
           std::cout << "Enter name of movie: "<<std::endl;
           std::cin >> name;
           
           //iterate through the vector and call method createDirector on each element 
           for(director &elem: directors)
           {
               elem.createDirector();
           }
       }
       
       void displayMovie()
       {
           std::cout<<"Movie's name is: "<<name<<std::endl;
           //iterate through the vector and call displayDirector on each object 
           for(const director& elem: directors)
           {
               elem.displayDirector();
           }
           
       }
};

int main(){ 
    movie a(4); //create an object of type movie. Note i have passed 4 as argument you can pass other numbers like 3,2 etc
    a.displayMovie();//display movie info

}

我做的一些修改是:

  1. director 类中使用了构造函数初始化列表
  2. director 类中添加了一个名为displayDirector 的方法
  3. movie 类中添加了一个名为displayMovei 的方法
  4. 添加了一个名为 directors 的数据成员,它是类 movie 中的 std::vector&lt;director&gt;
  5. 为类 movie 添加了一个构造函数,该构造函数初始化数据成员 directors
  6. movie 类中删除了名为film 的不必要方法
  7. 不使用using namespace std;,这是推荐的做法

以上程序的输出可见here

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2014-06-17
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多