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

时间:2018-01-18 21:42:07

标签: c++ compiler-errors

所以我有一个类地址,一个类名,以及一个派生自name的类。

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(char * initial_name, char * street, char * zip): 
name(initial_name)
{
   a_address.address(street, zip);
}

当我尝试访问a_address时,它告诉我无效使用address :: address。我做错了什么线索?感谢

3 个答案:

答案 0 :(得分:1)

  

编译错误是我定义人员构造函数时的错误,

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

  

访问a_address它告诉我无效使用address :: 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() {}

答案 1 :(得分:0)

您的name类有一个名为name的成员变量。因为这个原因,你的代码不能在这里编译。

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

你可以像这样设置a_address

a_address = address(street, zip);

答案 2 :(得分:0)

您可以访问成员变量a_address,因为它是基类中的protected;但是您无法访问类address中的成员变量,因为您没有从address派生。对于班级address,您是一个陌生人,并且您无权访问其protected成员。

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