Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使静态;多态性;成员变量_C++ - Fatal编程技术网

C++ 如何使静态;多态性;成员变量

C++ 如何使静态;多态性;成员变量,c++,C++,基本上,我在这里要做的是为每种派生的形状类型创建一个ID。(正方形为1,圆圈为2,以此类推) 如何生成具有多态功能的静态成员变量?如何创建getter和setter class Shape { public: Shape() {} static int ID; }; class Square : public Shape { public: Square() {} }; class Circle : public Shape { public: Circle

基本上,我在这里要做的是为每种派生的形状类型创建一个ID。(正方形为1,圆圈为2,以此类推) 如何生成具有多态功能的静态成员变量?如何创建getter和setter

class Shape {
public:
    Shape() {}
    static int ID;
};

class Square : public Shape {
public:
    Square() {}

};

class Circle : public Shape {
public:
    Circle() {}

};

class Person {
public:
    int shape_type_ID
    Shape* ptr;
    Person(){}
};

int Shape::var{ 5 };
这是这个问题的副本吗?

编辑: 在我当前的设计中,Person的每个实例都包含一个指向某个形状对象的指针(我不确定指针的类型)。我想限制每个Person对象只能引用一种派生类型的形状

例如,人员1的指针只能参考圆,人员2的指针只能参考正方形,人员3的指针只能参考三角形


但是我想要一个单人类和一种指针(可能是形状)。从理论上讲,这应该是可以做到的。其中一个问题是,人对象的数量应该与形状派生类型的数量相同(一个用于正方形,一个用于圆形,一个用于三角形)。我如何知道要创建多少Person对象?

当您需要多态性时,应该使用
虚拟
方法,而不是
静态
成员

class Shape {
public:
    virtual int ID(){ return 0; }
    virtual ~Shape(){}
};

class Square : public Shape {
public:
    virtual int ID() override { return 1;}
};

class Circle : public Shape {
public:
    virtual int ID() override { return 2; }
};

如果确实需要的话,可以这样做,但我建议只在base中创建一个接受id的构造函数,并将其从孩子传递给父母

int getNextId()
{
静态int lastId{0};
返回lastId++;
}
模板
int getDerivedId()
{
静态int id{getNextId()};
返回id;
}
结构基{
};
结构派生0最终版本:基本版本{
};
结构派生1最终版本:基础{
};
int main(){
返回!(getDerivedId()==0&&getDerivedId()==1);
}

你说的“多态功能”到底是什么意思
static
virtual
相反,方形对象将访问其自己版本的ID,圆形对象将访问其自己版本的ID成员并手动为每个派生类型分配一个ID,但这不是一个好的设计模式。这是一项很难自动化的任务,因为多态性被设计为可扩展的。没有一个派生类型可以确保它知道所有其他派生类型。由于没有简单的方法自动枚举类型,因此在某种程度上,您最终需要自己手动枚举它们。通常,如果您的设计关心从基类指针或引用唯一标识具体类型,则表明它可能错误地使用了多态性。在少数情况下,它是正确的或必需的,但通常表示错误。而不是考虑是否可以改变你的设计,不需要这样的<代码> ID >代码>。你真正需要的是<代码> ID <代码>?不同的类型是不同的类型,通常作为“ID”已经足够了。另一方面,对于多态性,你会试图不区分不同的子类型。为什么要使用多态性呢?simgple构造函数将执行以下操作:same@Ymahari因为OP要求多态性。我不知道OP到底需要什么,所以我只是发布了最明显的。欢迎投票:P