尝试访问基类的受保护数据成员时出现编译错误
Compile error when trying to access protected data member of base class?
所以我有一个类地址,一个类名,以及一个从名称派生的类人。
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);
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?