【问题标题】:Constructor can't access inherit class private int构造函数无法访问继承类私有 int
【发布时间】:2018-12-12 21:12:41
【问题描述】:

类点工作正常,它正在创建 x、y 点。代码:

point.h 文件

#ifndef POINT_H
#define POINT_H

namespace pt
{
    class Point
    {
        int x, y;
    public:
        Point();
        Point(int x, int y);
        int getX();
        int getY();
    };
}
#endif // POINT_H

point.cpp 文件

#include "point.h"

pt::Point::Point()
{
    this->x = this->y = 0;
}

pt::Point::Point(int x, int y)
{
    this->x=x;
    this->y=y;
}

int pt::Point::getX()
{
    return this->x;
}

int pt::Point::getY()
{
    return this->y;
}

同时,当我尝试在 main 中创建新的 Point3D 类时,它将继承 Point x, y 坐标并添加 z 以创建第三维,新的构造函数无法访问 Point 类的 x, y。错误是: 1. 'int pt::Point::x' 在 Point3D constr 中的第一个和第二个 this-> 是私有的。 2. 两者都“断章取义”

main.cpp

#include <iostream>
#include "point.h"

int main()
{
    class Point3D : public pt::Point
    {
        int z;
    public:
        getZ()
        {
            return this->z;
        }

        Point3D(int x ,int y, int z)
        {
            this->x=x;
            this->y=y;
            this->z=z;
        }
    };
    return 0;
}

感谢您的帮助。

【问题讨论】:

  • 我把标题弄错了——对不起。我的意思是继承类:(
  • 如果您的标题有误,请edit您的帖子进行修正。评论它只是白噪音。
  • 派生类无法访问基类的private 成员。他们可以访问protected 成员。派生类不是朋友。任何怀有敌意孩子的父母都会明白有必要对某些事情保密,即使是对后代也不例外。从哲学上讲,在软件设计中也是如此
  • @Peter 后裔无法访问您的私人信息,但好朋友可以! -- 已经过时了,但您应得的 :p
  • @Peter 任何有敌对父母的孩子也明白这种需要:)

标签: c++


【解决方案1】:

要使派生类可以访问xy,您应该使它们受到保护:

class Point
{
protected:
    int x, y;
public:
    Point();
    Point(int x, int y);
    int getX();
    int getY();
};

默认情况下,类成员的可见性为private(请注意,这与结构默认值不同,其中结构成员默认为public)。关于该主题,请参阅this answer

顺便说一句,初始化xy 的惯用方式是这样写:

Point3D(int x ,int y, int z) : pt::Point(x,y)
{
    this->z=z;
}

那么,您无需将xy 设为受保护,它们可以保持私密。

你甚至可以这样写:

Point3D(int x ,int y, int z) : pt::Point(x,y), z(z)
{}

【讨论】:

  • 旁注优于主注。
  • 我认为惯用的方式可以变得更惯用。或者换句话说:“你忽略z”?
  • @StoryTeller 我没听懂,什么意思?
  • 啊,抱歉。我正在沉迷于互联网模因。喜欢thisthis
  • @OlivierSohn:不会的。如果我是你,我会从“最好的方法,在一英里之外,是编写你的构造函数”开始,然后是你的第三个 sn-p,然后是当前构成你答案第一部分的文本。跨度>
猜你喜欢
  • 2021-03-26
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多