【发布时间】:2021-02-17 16:57:22
【问题描述】:
我正在尝试用 C++ 创建一个简单的程序,它使用 2 个类 创建电影列表:Movie,其中包含一部电影的详细信息,@987654323 @,其中包含一个名称和一个电影对象的向量。重点是用户应该只与Movies 类交互,因此我选择将Movie 类的所有成员(数据和方法)设为私有。
如果我让Movie::~Movie() 保持原样,我会不断收到以下错误,但如果我在 .h 和 .cpp 中都对其进行注释,它就可以正常工作。
我已明确将Movies 类设为Movie 类的朋友,因此它可以访问其所有成员。
error from Visual Studio Community 2019
电影.h:
#pragma once
#include<iostream>
#include<string>
class Movie
{
friend class Movies;
private:
std::string name;
std::string rating;
int watchedCounter;
int userRating;
std::string userOpinion;
// methods also private because the user should only interact with the Movies class, which is a friend of class Movie
std::string get_name() const;
Movie(std::string nameVal = "Default Name", std::string ratingVal = "Default Rating", int watchedCounterVal = 0, int userRatingVal = 0, std::string userOpinionVal = "");
~Movie();
};
电影.cpp:
#include "Movie.h"
// Name getter
std::string Movie::get_name() const
{
return this->name;
}
///*
// Destructor
Movie::~Movie()
{
std::cout << "Movie destructor called for: " << this->name << std::endl;
}
//*/
// Constructor
Movie::Movie(std::string nameVal, std::string ratingVal, int watchedCounterVal, int userRatingVal, std::string userOpinionVal) : name{ nameVal }, rating{ ratingVal }, watchedCounter{ watchedCounterVal }, userRating{ userRatingVal }, userOpinion{userOpinionVal}
{
std::cout << "Movie constructor called for: " << name << std::endl;
}
电影.h:
#pragma once
#include<iostream>
#include<vector>
#include "Movie.h"
class Movies
{
private:
std::string listName;
std::vector<Movie> vectOfMovies;
static int listNumber;
public:
Movies(std::string listNameVal = "Default User's Movie List ");
~Movies();
std::string get_listName() const;
void addMovie(Movie m);
};
电影.cpp:
#include<string>
#include "Movies.h"
int Movies::listNumber = 0;
// Constructor
Movies::Movies(std::string listNameVal) : listName{listNameVal}
{
++listNumber;
listName += std::to_string(listNumber);
std::cout << "MovieS constructor called for: " << listName << std::endl;
}
// Destructor
Movies::~Movies()
{
std::cout << "MovieS destructor called for: " << listName << std::endl;
}
std::string Movies::get_listName() const
{
return this->listName;
}
//Add movie to list of movies
void Movies::addMovie(Movie m)
{
this->vectOfMovies.push_back(m);
}
还有主 .cpp 文件:
#include <iostream>
// #include "Movie.h"
#include "Movies.h"
int main()
{
Movies moviesObj;
moviesObj.get_listName();
return 0;
}
【问题讨论】:
-
为什么
Movie析构函数private?几乎倾向于将其作为错字关闭。 -
@DragoșBocancea
std::vector<Movie>试图通过内部的delete []调用调用Movie的private析构函数。因此,您要么不能使用std::vector<Movie>,而需要自己手动完成所有内存管理,要么将Movie::~Movie()设为public函数。 -
因为我只应该通过 Movies 类访问 Movie 类的成员 -- 当你创建一个析构函数(或构造函数)
private时,则没有外部类可以创建或销毁这些对象,除非有其他public方法来构造或销毁对象。 -
@DragoșBocancea -- 析构函数什么都不做或发射宇宙飞船都没关系。如果是
private,任何需要可用析构函数的实体,例如std::vector,都会发出编译器错误。 -
@DragoșBocancea 我真的不明白为什么你有一个公共的
addMovie,但是任何客户端都无法使用它,因为Movie无法构造,因为构造函数是@987654349 @.
标签: c++ visual-studio visual-studio-2019