• 14753阅读
  • 14回复

关于QT函数中的默认参数[已解决] [复制链接]

上一主题 下一主题
离线ab6500126
 
只看楼主 倒序阅读 楼主  发表于: 2011-10-11
C++中,参数是可以使用默认值的,比如function1(int a = 0),直接使用function1()也是可以的,测试下来也没有问题


默认参数是可以写在声明或定义中的,只要不同时出现就没问题。但是我在QT使用的时候,却发现只能写在声明中是怎么回事?


声明
class MainWindow:public QWidget{    Q_OBJECTpublic:    MainWindow(QWidget *parent = 0);....



定义
MainWindow::MainWindow(QWidget *parent):    QWidget(parent,Qt::Window),m_menuBar(0){....


反过来写就不可以了,报的错误

../simple_player/mainwindow.h:21:5: 附注: MainWindow::MainWindow(QWidget*)
../simple_player/mainwindow.h:21:5: 附注:   备选需要 1 实参,但提供了 0 个


顺带问一下怎样把报错改成英文的



离线dbzhang800

只看该作者 1楼 发表于: 2011-10-11
呵呵,因为你搞错了。你可以去掉所有和Q有关的东西,用ISO C++写个小程序自己测测看
离线xiangxiao
只看该作者 2楼 发表于: 2011-10-11
其实现在看到这些qt中的默认参数,特别是类定义的默认参数,我还头大了
离线ab6500126
只看该作者 3楼 发表于: 2011-10-11
回 1楼(dbzhang800) 的帖子
自己测是没问题的,C++还算是挺熟的,QT有什么特性阻止了把默认参数写在定义里?
离线dbzhang800

只看该作者 4楼 发表于: 2011-10-11
Re:回 1楼(dbzhang800) 的帖子
引用第3楼ab6500126于2011-10-11 12:27发表的 回 1楼(dbzhang800) 的帖子 :
自己测是没问题的,C++还算是挺熟的,QT有什么特性阻止了把默认参数写在定义里?

Qt 是库,不是语言。它没有任何特性会干扰编译器的运行。如果你对C++ 挺熟,Qt应该对你是透明的才对,像使用标准库、boost库一样。

对了,你可以把你的完整C++测试例子贴出来,应该也就20-30行代码的样子
离线ab6500126
只看该作者 5楼 发表于: 2011-10-11
回 4楼(dbzhang800) 的帖子
#include <iostream>
using namespace std;

class A
{
public:

    A(int *a) ;

    void print_A(){cout<<m_a<<endl;}

private:
    int m_a;
};


A::A(int *a =0)
{
    m_a = 5;

}



//class B:public A
//{
//public:
//    B(int b);
//    void print_B(){this->print_A();}


//};

//B::B(int b = 0)
//    :A(b)
//{
// int a = 0;
// a++;
//}

int main(int argc,char* argv[])
{
    A * a = new A();
    a->print_A();
return 0;
}


写在定义里这样可以过
离线ab6500126
只看该作者 6楼 发表于: 2011-10-11
我像问的就是,QT是不是会偷偷生成一个不带参数的构造函数,然后和我这个冲突了,QT刚学,不是很懂
离线dbzhang800

只看该作者 7楼 发表于: 2011-10-11
Re:回 4楼(dbzhang800) 的帖子
引用第5楼ab6500126于2011-10-11 12:38发表的 回 4楼(dbzhang800) 的帖子 :
#include <iostream>
using namespace std;
class A
{
.......

你是说,如果改成这样,就不会通过了??

  1. #include <QtGui>
  2. #include <iostream>
  3. using namespace std;
  4. class A: public QWidget
  5. {
  6. public:
  7.     A(int *a) ;
  8.     void print_A(){cout<<m_a<<endl;}
  9. private:
  10.     int m_a;
  11. };
  12. A::A(int *a=0):
  13.     QWidget(0)
  14. {
  15.     m_a = 5;
  16. }
  17. int main(int argc,char* argv[])
  18. {
  19.     QApplication app(argc, argv);
  20.     A * a = new A();
  21.     a->print_A();
  22.     return 0;
  23. }

离线dbzhang800

只看该作者 8楼 发表于: 2011-10-11
引用第6楼ab6500126于2011-10-11 12:39发表的  :
我像问的就是,QT是不是会偷偷生成一个不带参数的构造函数,然后和我这个冲突了,QT刚学,不是很懂


我能说的就是,Qt只是C++的库,你在C++中积累的任何经验都可以直接用。如果你发现哪些地方和C++不符合,肯定是C++没学好 ^_^

或者你愿意瞅瞅:

http://hi.baidu.com/cyclone/blog/item/8f8f08fa52d22f8758ee9006.html
http://blog.csdn.net/dbzhang800/article/details/6376422
...
离线ab6500126
只看该作者 9楼 发表于: 2011-10-11
回 7楼(dbzhang800) 的帖子
我的源码就是这样过不了
离线dbzhang800

只看该作者 10楼 发表于: 2011-10-11
Re:回 7楼(dbzhang800) 的帖子
引用第9楼ab6500126于2011-10-11 14:26发表的 回 7楼(dbzhang800) 的帖子 :
我的源码就是这样过不了[表情]  


不要用类似、就是这样一类的字眼。在程序中,比较忌讳这样

你完全可以编译运行一下,告诉大家,哪儿不过!

(你自己不贴自己的测试代码,我给你贴个,你又不试...)

题外:

我知道你的问题在哪儿。如果你自己写短小的测试程序,自己也很容易找出来。牢记一句话,Qt是库,不是语言。
离线ab6500126
只看该作者 11楼 发表于: 2011-10-11
回 8楼(dbzhang800) 的帖子
不对,我十分肯定这里有问题,
http://blog.csdn.net/dbzhang800/article/details/6376422

你给的这个链接,例子二,你试试把默认参数写到定义里,一定会错
离线ab6500126
只看该作者 12楼 发表于: 2011-10-11
离线dbzhang800

只看该作者 13楼 发表于: 2011-10-11
哈哈。就是没有Qt,就用你前面的例子,拆成3个文件,这样弄必然要出错啊
离线ab6500126
只看该作者 14楼 发表于: 2011-10-11
回 13楼(dbzhang800) 的帖子
哦,我懂了,默认参数无论定义在函数声明还是函数定义中,必须位于调用该函数的函数前面。

问题解决啦,3颗油啊
快速回复
限100 字节
 
上一个 下一个