【发布时间】: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