【问题标题】:What is the best way to use void pointer for returning multiple type variables in C++?在 C++ 中使用 void 指针返回多个类型变量的最佳方法是什么?
【发布时间】:2015-01-09 13:04:22
【问题描述】:

我有这样的基类:

class Test {
public:
    virtual void* getValue () {}
};

然后我想创建几个实现 getValue 方法的派生类(它们在将地址转换为 void* 后会返回不同的类型变量):

class TestA : public Test {
private:
    int value;

public:
    TestA (int value) : value(value) {}

    void* getValue () {
        int* result = new int;
        *result = value;
        return (void*) result;
    }
};

在这种情况下,我正在创建要以“new”返回的变量,因此我必须在使用该方法后将其删除:

    TestA testA(5);

    int* toDelete = (int*) testA.getValue();
    int someLocalVariable = *toDelete;
    delete toDelete;

我想到的第二种方法是创建一个我想返回的值的类成员的副本,并将其仅用于 getValue() 方法:

class TestB : public Test {
private:
    double valToRet;
    double value;

public:
    TestB (double value) : value(value) {}

    void* getValue () {
        valToRet = value;
        return (void*) &valToRet;
    }
};

getValue() 方法的使用现在更简单了,但是在这种情况下,每当我使用这个类时,我都会占用更多的内存:

    TestB testB(3);

    double someOtherLocalVariable = *((double*)testB.getValue());

有没有更好的方法来实现 getValue() 方法? 我一直都知道会是什么类型,所以不用担心。

【问题讨论】:

  • “有没有更好的方法来实现getValue()方法?”把它包装成一个模板。
  • 为什么需要一个返回不相关类型的函数?
  • 如果函数期望返回不同类型的值(没有公共基类),则可以重新考虑类型系统的设计。
  • 如果结果真的是“派生类”,最好定义基类并返回指向该基类的指针。它将与所有派生类兼容。
  • 如果你总是知道类型是什么,那么你不能只调用一个相关类型的函数。 getInteger();getDouble()?

标签: c++ variables void-pointers


【解决方案1】:

您可以将Test 类包装在模板中。

template <typename T>
class Test {
public:
    virtual T* getValue () =0;
};

class TestA : public Test<int>
{
public:
    virtual int* getValue () { return new int(3); }
};

class TestB : public Test<float>
{
public:
    virtual float* getValue() { return new float(3.2); } 
};

【讨论】:

猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
相关资源
最近更新 更多