所以我有一个类地址,一个类名,以及一个派生自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。我做错了什么线索?感谢
答案 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
(因为这正是两者之间的差异),并删除保护。