我不明白C++中的某些内容,gcc 不喜欢我如何进行。
我做了:
if (!fModeMdi)
MyFirstClass* main = (MyFirstClass*) fMaino;
else
MySecondClass* main = (MySecondClass*) fMdio;
...
...
int i = main->GetNum();
我收到此错误:
file.C:211:16: warning: unused variable 'main' [-Wunused-variable]
file.C:213:15: warning: unused variable 'main' [-Wunused-variable]
file.C:219:9: error: 'main' was not declared in this scope
我无法在我的标头中声明main
,因为他的类型取决于布尔值fModeMdi
。
请问我该如何解决这个问题?
如果MyFirstClass
和MySecondClass
通过继承相关联,那么你可以按照@unkulunkulu在他的回答中建议的那样做。
但是,如果MyFirstClass
和MySecondClass
是不相关的类,则可以将模板用作:
if (!fModeMdi)
{
do_work(static_cast<MyFirstClass*>(fMaino));
}
else
{
do_work(static_cast<MySecondClass*>(fMaino));
}
其中do_work
是一个函数模板,实现为:
template<typename T>
void do_work(T *obj)
{
int i = obj->GetNum();
//do rest of the work here....
}
请注意,即使它们是相关的,此模板解决方案也可以工作!!
在 if 语句之前定义变量,并在其中赋值它怎么样?
MyFirstClass* main = 0; // use nullptr if you have access to a C++11 compiler
if (!fModeMdi)
main = (MyFirstClass*) fMaino;
else
main = (MySecondClass*) fMdio;
由于您在 if 语句中定义了它,因此在它之后,变量已经超出了范围,无法再引用。
在循环中分配 i 的值。
int i;
if (!fModeMdi){
MyFirstClass* main = (MyFirstClass*) fMaino;
i = main->GetNum();
}else{
MySecondClass* main = (MySecondClass*) fMdio;
i = main->GetNum();
}
以下内容应该有效。在 c++ 中,变量的作用域在括号 { } 内,也就是说,它只在括号内被识别。一旦你出去,程序就不知道了。
MyFirstClass* main =0;
MySecondClass* main2 =0;
if (!fModeMdi)
main = (MyFirstClass*) fMaino;
else
main2 = (MySecondClass*) fMdio;
C++ 是一种静态类型的语言,在此行
int i = main->GetNum();
编译器必须在编译时知道main
的类型(静态,因此得名)。你不能使main
的类型依赖于某个值fModeMdi
,这只在运行时是已知的。如果每个类都包含一个方法 GetNum
和其他类(在 if
语句之后使用),则可以考虑将它们移动到基类中,如下所示:
class MyBaseClass {
public:
virtual int GetNum() = 0;
}
class MyFirstClass : public MyBaseClass {
// ...
};
class MySecondClass : public MyBaseClass {
// ...
};
MyBaseClass* main = 0;
if (!fModeMdi)
main = (MyFirstClass*) fMaino;
else
main = (MySecondClass*) fMdio;
...
...
然后这是合法的
int i = main->GetNum();
实际上,正确的设计(将常用方法移动到基类)可能会完全消除对这个if
语句的需求。这就是所谓的多态性,它的全部目的是消除对这些if
或switch
语句的需求。