尝试访问基类的受保护数据成员时出现编译错误

Compile error when trying to access protected data member of base class?

本文关键字:编译 错误 数据成员 受保护 访问 基类      更新时间:2023-10-16

所以我有一个类地址,一个类名,以及一个从名称派生的类人。

class address
{
     public:
     address(char * street, char * zip);
     protected:
     char * street;
     char * zip;
};
class name
{
     public: 
     name( char * initial_name);
     protected:
     char * name;
     address a_address;
};
class person : public name
{
     public:
     person(char * name, char * street, char * zip);
}

编译错误是当我定义 person 构造函数时,它看起来像这样:

person::person(char * initial_name, char * street, char * zip): 
name(initial_name)
{
   a_address.address(street, zip);
}

当我尝试访问a_address时,它告诉我地址::地址的使用无效。有什么线索可以看出我做错了什么吗?谢谢

编译错误是当我定义 person 构造函数时,

您在这里有命名混淆。你有一个名为 name 的类,它有一个名为 name 的成员。它与类 namename的成员变量protected访问无关。您可能希望将变量更改为 a_name 或不同于 name 的其他变量。

访问a_address它告诉我地址::地址的使用无效

不能在对象上调用构造函数。这就是您尝试执行的操作:

a_address.address(street, zip);

您需要在 name 中创建适当的构造函数,并将参数从 person 传递到 name

这是您发布的代码的更新版本,可为我编译和构建。

class address
{
   public:
      address(char * street, char * zip) : street(street), zip(zip) {}
   protected:
      char * street;
      char * zip;
};
class name
{
   public: 
      name(char * initial_name, char * street, char * zip);
   protected:
      char * a_name;
      address a_address;
};
name::name(char * initial_name, char * street, char * zip) :
      a_name(initial_name), a_address(street, zip)
{
}
class person : public name
{
   public:
      person(char * initial_name, char * street, char * zip);
};
person::person(char * initial_name, char * street, char * zip) : 
      name(initial_name, street, zip)
{
}
int main() {}
你可以

访问成员变量a_address,因为它在基类中protected;但你不能访问类address内的成员变量,因为你不是从address派生的。对于类address,您是一个陌生人,并且无法访问其protected成员。

你的结构不是很面向对象,这就是为什么你会遇到这样的麻烦。类address应该有一个构造函数,您可以使用其详细信息调用该构造函数,并且address本身处理其内部成员的 assignemnet。如果从类外部访问成员,则仅将它们用作简单的数据结构。这很好,但它不是面向对象的编码,如果你想以这种方式工作,你应该class更改为struct(因为这正是两者之间的区别(,并删除受保护的。

您的name类有一个名为 name 的成员变量。 因此,您的代码无法在此处编译。

此外,person类在类声明后需要一个分号。

你可以像这样设置a_address

a_address = address(street, zip);