0

我正在尝试用 c++ 做这样的事情。

void showContensofArray(void *data[])
{
      //In this function have to display the values of respective objects. 
      //  Any ideas how do I do it?
}
int main(){
    A phew(xxx,abcdefg); //object of class A

    B ball(90),ball2(88);  //object of class B

    void *dataArray[2];
    dataArray[0] = &ph1;
    dataArray[1] = &ball;
    showContentsofArray(dataArray); //function
}
4

3 回答 3

1

如果你想一般地处理 data[] 中的对象(即通过调用它们的通用函数来提取描述或值)然后为你的对象定义一个类 hiracy 并在你的 showContentsofArray 函数中调用你的(通用基础上的虚拟方法类)对象指针。
这是多态的教科书示例
多态允许使用统一接口处理不同数据类型的值。”
在下面的示例中,基类 BaseObject 定义了统一接口。

class BaseObject {
    virtual string description() { return "Base object"; }
    virtual bool bounces() { return false; }
}
class B : public BaseObject {
    string description() { return "Im a B object" }
    bool bounces() { return true; }
}
class A : public BaseObject {
    string description() { return "Im an A object" }
}

void showContensofArray(BaseObject* data[], int size) {
    for (int i=0; i<size; i++) {
        cout << data[i]->description();
        if (data[i]->bounces())
             cout << "I bounce!";
    }
}

int main() {
    A phew(xxx,abcdefg); //object of class A
    B ball(90),ball2(88);  //object of class B

    BaseObject* dataArray[2];
    dataArray[0] = &ph1;
    dataArray[1] = &ball;
    showContentsofArray(dataArray);
}

将输出:

Im an A object  
Im a B object  
I bounce!  
于 2013-05-21T23:21:35.730 回答
0

只需转换回原始类型:

A* p1 = static_cast<A*>(data[0]);
B* p2 = static_cast<B*>(data[1]);
于 2013-05-21T23:17:09.213 回答
0
void showContensofArray(void *data[], int len)
{
    int i;
    for(i=0;i<len;i++){
        ((Base*)(data[i]))->print();
    }
}

每个类都应该有一个print()知道如何打印其值的方法的实现。

你也可以使用继承。

编辑:

@Ricibob 的回答是正确的,但是如果您需要在函数内部进行强制转换,则需要执行以下操作:

#include <iostream>

using namespace std;

class Base{
public:
    virtual void print()=0;
};
class A: public Base{
public:

    void print(){
        cout<<"Object A"<<endl;
    }
};

class B: public Base{
public:
    void print(){
        cout<<"Object B"<<endl;
    }
};

void showContensofArray(void* data[], int len)
{
    int i;
    for(i=0;i<len;i++){
        ((Base*)(data[i]))->print();
    }
}

int main(){
    A a;
    B b;
    void* v[2];
    v[0]= &a;
    v[1] = &b;
    showContensofArray(v,2);
    return 0;
}

你不能逃避继承。

于 2013-05-21T23:21:29.073 回答