C++使用友元类仍无法访问私有成员,疑惑拷贝构造器关联问题
问题:友元类无法访问Movie私有成员的编译错误
我在C++代码中尝试通过友元类访问Movie类的私有成员,但出现编译错误,相关代码如下:
#include <iostream> #include <string> #include <vector> using namespace std; class Movie { private: std::string name{}; std::string rating{}; int watched{}; friend class movies; // 此处存在拼写错误 public: Movie(std::string name_val, std::string rating_val, int watched_val = 0); // copy constructor Movie(const Movie &source); //// this constructor }; Movie::Movie(std::string name_val, std::string rating_val, int watched_val) :name{name_val}, rating{rating_val}, watched{watched_val}{} Movie::Movie(const Movie &source){ name = source.name; rating = source.rating; watched = source.watched; } class Movies { private: std::vector<Movie> movie_obj; public: void get_movie_byname(Movie &abc) { std::cout << abc.name; }; // 此处访问abc.name报错 };
编译错误信息如下:
main.cpp:53:53: error: 'std::string Movie::name' is private within this context 53 | void get_movie_byname(Movie &abc) { std::cout << abc.name; }; | ^~~~ main.cpp:11:21: note: declared private here 11 | std::string name {}; | ^~~~
排查与结论
- 曾误解问题:以为友元类仅能访问当前对象的私有成员而非所有对象
- 曾困惑点:移除Movie类的拷贝构造器后错误消失,无法理解拷贝构造器与友元的关联
- 最终问题根源:友元声明时的拼写错误——将实际定义的类名
Movies(首字母大写)误写为小写的movies,导致Movies类并未被正确授予友元权限,因此无法访问Movie的私有成员name。
内容的提问来源于stack exchange,提问作者Dnyaneshwar Thombre
相关产品推荐
相关产品推荐

