You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:50:33