如何通过指针数组访问类的成员函数?

How can I access a class's member function via an array of pointers?

本文关键字:成员 函数 访问 何通过 指针 数组      更新时间:2023-10-16

我有一个非常标准的类,其中包含一些公共成员函数和私有变量。

我的问题最初源于不能动态命名我的类的对象实例,所以我创建了一个类类型的指针数组:

static CShape* shapeDB[dbSize];

我有一些提示来获取要传递给构造函数的字段的信息(这似乎有效):

shapeDB[CShape::openSlot] = new CShape(iParam1,sParam1,sParam2);

openlot正确递增,所以如果我要创建另一个CShape对象,它将有下一个指针指向它。下一段代码不起作用,并且一直崩溃:

cout << shapeDB[2]->getName() << " has a surface area of: " << shapeDB[2]->getSA() << shapeDB[2]->getUnits() << endl;

指针数组在main之外全局声明,get()函数在返回字符串或整数的类中是公共的。我不确定我做错了什么,但我确定与指针设置有关的东西。我写这段代码是为了尝试学习更多关于类/指针的知识,并且因为我找不到其他人尝试这样做而被严重难住了。

我也很好奇CShape的新实例被命名…?如果有任何其他方法可以动态创建对象实例并跟踪名称,以便能够为成员函数访问它们,我将洗耳恭听。

我已经尝试了各种指针引用/取消引用的排列,但大多数都无法编译。如果有人认为有帮助,我可以发布更大块或所有的代码。

class CShape {
    int dim[maxFaces];
    int faces;
    string units;
    string type;
    string name;
    bool initialized;
    int slot;
public:
    static int openSlot;
    CShape();
    CShape(int, string, string); // faces, units, name
    ~CShape();
    void initialize(void);
    // external assist functions
    int getA(void) {
        return 0;
    }
    int getSA(void) {
        int tempSA = 0;
        // initialize if not
        if(initialized == false) {
            initialize();
        }
        // if initialized, calculate SA
        if(initialized == true) {
            for(int i = 0; i < faces; i++)
            {
                tempSA += dim[i];
            }
            return(tempSA);
        }
        return 0;
    }
    string getUnits(void) {
        return(units);
    }
    string getName(void) {
        return(name);
    }
    // friend functions
    friend int printDetails(string);
};
// constructor with values
CShape::CShape(int f, string u, string n) {
    initialized = false;
    faces = f;
    units = u;
    name = n;
    slot = openSlot;
    openSlot++;
}

我的猜测是你使用CShape构造函数来增加CShape:: openlot ?您可能在读取指针之前更改了它的值,因此指针存储在不同的位置。

尝试用固定值替换openSlot以排除此CShape::选项。

——code was added——

我很确定这就是问题所在,构造函数在赋值之前执行,这意味着lhs。

将在CShape:: openlot增加后计算。