C++从抽象类型定义类成员
C++ defining class member from an abstract type
我正在尝试将一些代码从 C# 移动到 C++ 并且我正在尝试找到实现类层次结构的最佳方法。 在 C# 中,在派生类中,可以从抽象基类类型定义类成员变量。但是,当我搜索C++资源时,似乎我只能定义 来自另一个类中的抽象类型的指针或引用变量(否则编译器显示:"无法实例化抽象类"(,但这可能会对已定义对象的生存期产生问题,因为生存期是在使用它的类之外处理的。关于当 C# 代码映射到C++时应如何实现此类继承层次结构的任何建议?
Class Person
{
public:
virtual double getSalary() = 0;
private:
int rank;
}
Class Teacher : public Person
{
public:
double getSalary();
private:
Person manager; /*<-- Compile error: error C2259: 'Person' : cannot instantiate abstract class */
}
直接回答您的问题:您不能定义抽象类型的类成员变量。在C++中,成员主要由内存大小定义,并且由于继承的类可能需要不同的内存量,因此这是不可能的。
但是,您可以使用指针或引用。
在您的情况下:
class Teacher : public Person
{
public:
double getSalary();
private:
Person* manager;
}
这存储了一个指向Person
的指针,并且由于Teacher
是一个Person
,一个类型为Teacher
的对象将是一个合法的目标。
示例性使用:我们创建一个二传手
Teacher::set_manager(Person* manager)
{
this->manager = manager;
}
并称它为喜欢
Teacher a;
Teacher* b = new Teacher;
a.set_manager(b);
(我使用二传手作为最简单的例子,不一定是因为我建议这样做。
也可能:
Teacher a;
Person* b = new Teacher;
a.set_manager(b);
(a
需要是一个Teacher
,但是,因为我们需要方法set_manager
,如果我们不想投射(
顺便说一下,这里更好的做法是使用智能指针。阅读std::shared_ptr
并为此相关。它看起来像
std::shared_ptr<Person> manager;
这里的重要区别:如果您习惯于垃圾守护进程,则需要手动释放原始指针的内存,而智能指针会在没有指向对象时自动释放内存。
也就是说,您似乎认为这些语言比它们更相似。我的建议是从头开始,从C++的基本教程开始,即使你应该碰巧是一个有成就的C#程序员。
相关文章:
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- C++令牌定义成员
- 在没有类定义的标头中定义成员变量
- 如何在类的构造函数中定义成员向量的大小
- 如何在C++中动态定义成员函数
- C++ Boost.Serialization - 用户定义成员的非侵入式序列化
- C++类 - 使用公共变量并在类外定义成员函数
- G++ - 对已定义成员函数的未定义引用
- 在哪里以及如何定义成员变量?在头文件还是实现文件中?
- 是否可以修改STL并自定义成员函数
- 从 boost::mpl:vector 类型列表中定义成员变量
- 在构造对象时定义成员函数
- 为什么定义成员函数指针变量需要类名
- 复制构造函数中的 C++ 用户定义成员
- 如何根据类参数定义成员类运算符
- 使用指向未定义成员函数的指针时的未定义引用
- 如何在运行时定义成员数组大小
- C++-在模板类之外但在头中定义成员函数
- c++在不知道对象类型的情况下定义成员函数指针
- 在特定偏移量中定义成员的结构