所以我有一个类地址,一个类名,以及一个从名称派生的类人。
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
的成员。它与类 name
中name
的成员变量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);