【发布时间】:2015-06-01 10:48:40
【问题描述】:
一个类返回'int',其他类返回'double'。两个类的接口中方法“GiveMeTheValue”的签名是什么。 我想编译以下代码:
class Interface
{
public:
virtual arbitrary_type GimeMeTheValue(void) {};
};
class TakeInt : public Interface
{
public:
arbitrary_type GimeMeTheValue(void) {
return 10;
}
};
class TakeDouble : public Interface
{
public:
arbitrary_type GimeMeTheValue(void) {
return 3.14;
}
};
int main()
{
Interface * obj;
obj = new TakeInt();
cout << obj -> GimeMeTheValue() << endl; // It's 10, thank you
obj = new TakeDouble();
cout << obj -> GimeMeTheValue() << endl; // Oh it's 3.14, I love you c++
}
当然没有这样的“arbitary_type”。 这行得通...
class Interface
{
public:
virtual void * GimeMeTheValue(void) {};
};
class TakeInt : public Interface
{
public:
void * GimeMeTheValue(void) {
int value = 10;
int * ptr = &value;
return ptr;
}
};
class TakeDouble : public Interface
{
public:
void * GimeMeTheValue(void) {
double value = 3.14;
double * ptr = &value;
return ptr;
}
};
int main()
{
Interface * obj;
obj = new TakeInt();
cout << *( (int *) (obj -> GimeMeTheValue()) ) << endl;
obj = new TakeDouble();
cout << *( (double *) (obj -> GimeMeTheValue()) ) << endl;
}
处理“void *”相当复杂。有没有其他想法来实现一些简单的东西(比如第一个代码示例)?谢谢。
【问题讨论】:
-
您返回指向局部变量的指针。永远不要这样做:-)。
-
virtual void * GimeMeTheValue(void) {};不 发出关于不返回值的编译器警告?这似乎是variant类型的合适候选者。正如所写,这会在多个位置调用未定义的行为 -
WhozCraig,是的,未定义的行为。但是还有其他选择吗?我的所有类都需要一个(!)虚函数名称。但是每个类都返回自己的值类型。那么签名是什么?!
-
@Pleeea,它看起来是一个不错的 variant 类型的候选者;一种能够表示多种基本类型的类型,(当然,在任何给定时间只能表示一种)。
-
在这段代码的情况下,
Interface类实际上并不是一个通用接口的好候选——派生类做不同的事情并返回不同的结果。尽管它们具有相似的签名,但它们并不相同。这是模板基类而不是具体抽象基类的候选对象。
标签: c++ interface virtual void void-pointers