2016-06-18 81 views
-1

在我的mainwindow.cpp中是调用的地方。呼叫应该发生在点击按钮的事件上。错误说cannot call member function 'void Foo::setFooAttributes(A&, B&, C&, D&)' without objectQT,C++不能在没有对象的情况下调用成员函数

void MainWindow::on_generateButton_clicked() 
{ 

    setCreator(ui->interfaceCreatorName->text()); 
    setAlternateName(ui->interfaceAlternateName->text()); 
    setDomain(ui->interfaceDomain->text().toInt()); 
    QString filename = getCreator() + "'s " + getAlternateName() + ".txt"; 
    QFile file(filename); 
    A a; B b; C c; D d; 
    Foo::setFooAttributes(a,b,c,d); //ERROR: cannot call member function without object 
    generateTop(file); 
    generateMiddle(file); 
    generateSecondaryMid(file); 
    generateLast(file); 
    generateTertiaryMid(file, a, b, c, d); 

} 

函数本身看起来像这样:

void Foo::setFooAttributes(A &aFoo, B &bFoo, C &cFoo, D &dFoo){ 

    aFoo.stopPoint = MainWindow.ui->aInterfaceStopPoint->text().toDouble(); 
    aFoo.rate = MainWindow.ui->aInterfaceRate->text().toInt(); 
    aFoo.domain = MainWindow.ui->aInterfaceDomain->text().toInt(); 
    aFoo.length = MainWindow.ui->aInterfaceLength->text().toInt(); 

    bFoo.stopPoint = MainWindow.ui->bInterfaceStopPoint->text().toDouble(); 
    bFoo.rate = MainWindow.ui->bInterfaceRate->text().toInt(); 
    bFoo.domain = MainWindow.ui->bInterfaceDomain->text().toInt(); 
    bFoo.length = MainWindow.ui->bInterfaceLength->text().toInt(); 

    cFoo.stopPoint = MainWindow.ui->cInterfaceStopPoint->text().toDouble(); 
    cFoo.rate = MainWindow.ui->cInterfaceRate->text().toInt(); 
    cFoo.domain = MainWindow.ui->cInterfaceDomain->text().toInt(); 
    cFoo.length = MainWindow.ui->cInterfaceLength->text().toInt(); 

    dFoo.stopPoint = MainWindow.ui->dInterfaceStopPoint->text().toDouble(); 
    dFoo.rate = MainWindow.ui->dInterfaceRate->text().toInt(); 
    dFoo.domain = MainWindow.ui->dInterfaceDomain->text().toInt(); 
    dFoo.length = MainWindow.ui->dInterfaceLength->text().toInt(); 

} 

我把代码的其余部分,包括贴在这里pastebin source

我第一次尝试调用setFooAttributes(a,b,c,d);没有Foo::但是这给了我foo.h中错误如'setFooAttributes' was not declared in this scope

+2

问题是关于基本的C++。您调用Foo :: setFooAttributes的方式仅适用于静态函数。否则,你需要做的是错误所说的 - 拥有Foo类的对象。 Foo f; f.setFooAttributes(); – mvidelgauz

+0

嗨,ty快速回复。我想一次为多个对象设置属性,而不是a.setAttributes,b.setAttributes等。理想情况下,调用将是“setFooAttributes(a,b,c,d);”但编译器对范围持怀疑态度。我不知道如何解决范围问题,所以我如上所示 – Ranfan

+0

您可以使该函数成为非类函数。只要将它移出课程并在没有'Foo ::'的情况下调用它。 – Bugfinger

回答

3

让你的Foo::setFooAttributes a static mem ber函数,因为它不在“this”实例上运行。

当你在这,你可能会考虑删除所有重复,以更好地遵循DRY(不要重复自己)原则:

template <typename A> static void Foo::setFooAttributes(A &aFoo, int iface) { 

    aFoo.stopPoint = MainWindow.ui->interfaceStopPoint[iface]->text().toDouble(); 
    aFoo.rate = MainWindow.ui->interfaceRate[iface]->text().toInt(); 
    aFoo.domain = MainWindow.ui->interfaceDomain[iface]->text().toInt(); 
    aFoo.length = MainWindow.ui->interfaceLength[iface]->text().toInt(); 

} 

static void Foo::setFooAttributes(A &aFoo, B &bFoo, C &cFoo, D &dFoo){ 

    setFooAttributes(aFoo, 0); 
    setFooAttributes(bFoo, 1); 
    setFooAttributes(cFoo, 2); 
    setFooAttributes(dFoo, 3); 
} 

(这需要你到每个{a,b,c,d}InterfaceStopPoint转换,{a,b,c,d}InterfaceRate,{a,b,c,d}InterfaceDomain{a,b,c,d}InterfaceLength)转换为数组,而不是四个单独的变量)。

你甚至可以通过使用循环或变量模板函数来改善这一点,但我会把它作为练习。

+0

谢谢你的特殊答案!当我们谈论这个话题时,你不会知道为什么mainwindow.h中的A,B,C,D对象声明给出了错误:“类没有声明类型”?它发生在我第一次将功能改变为静态时。此外,编译器现在抱怨错误“之前的预期主表达式”。令牌“。它对于setFooAttributes – Ranfan

+0

中的每个成员初始化都这样说。 'MainWindow'是一个类,正确的,不是'Foo'的成员?因此,在任何情况下,'MainWindow.ui'都应该是'MainWindow :: ui'。这当然假设'ui'成员是静态的;如果不是,那么你需要使它成为静态的,或者使用对试图通过类访问实例成员的'MainWindow'实例的引用。关于“班级不命名”,也许它不是?实际上是否有名为A,B,C和D的类型?你不显示任何他们的声明。 – davmac

相关问题