2016-06-18 22 views
-1

私のmainwindow.cppでは、呼び出しが行われます。コールはボタンクリックイベントで発生するはずです。エラーはcannot call member function 'void Foo::setFooAttributes(A&, B&, C&, D&)' without objectと表示されます。QT、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); 

} 

機能自体は、次のようになります。私はここにペーストpastebin source

私が最初Foo::なしsetFooAttributes(a,b,c,d);を呼び出してみましたが、それは私を与えたでfoo.hという含む残りのコードを入れて

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(); 

} 

エラーのようなエラー 'setFooAttributes' was not declared in this scope

+2

質問は基本的なC++です。 Foo :: setFooAttributesを呼び出す方法は、静的関数にのみ適用されます。さもなければ、エラーが言っていることを正確に行う必要があります。クラスFooのオブジェクトを持っています。 Foo f; f.setFooAttributes(); – mvidelgauz

+0

こんにちは。 a.setAttributes、b.setAttributesなどの代わりに、複数のオブジェクトの属性を一度に設定したいと思います。呼び出しは、 "setFooAttributes(a、b、c、d);"コンパイラはスコープを掴んだ。私はスコープの問題を修正する方法を知りませんでしたので、上記のようにしました – Ranfan

+0

あなたは関数を非クラス関数にすることができます。それをクラスから移動し、 'Foo ::'なしで呼び出すだけです。 – Bugfinger

答えて

3

Foo::setFooAttributesstatic memこれは "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を4つの個々の変数の代わりに配列に挿入する)。

ループや可変アトリビュートテンプレート関数を使用してこれを改善することもできますが、これを練習問題として残しておきます。

+0

例外的な回答ありがとうございます!私たちが話題になっているうちに、mainwindow.hのA、B、C、Dオブジェクト宣言がエラーを出している理由を知ることはできません。 "class does not a type?"それは最初に問題の機能を静的に変更したときに起こりました。さらに、コンパイラはエラー "以前に期待されていたprimary-expression 'を悩ましています。トークン "。それはsetFooAttributesのすべてのメンバ初期化のためにそう言います – Ranfan

+0

ああ。 'MainWindow'は' Foo'のメンバーではなく、正しいクラスですか?だから、 'MainWindow.ui'はそれぞれの場合に' MainWindow :: ui'となるはずです。これはもちろん、 'ui'メンバは静的であると仮定しています。そうでなければ、それを静的にするか、クラスを介してインスタンスメンバーにアクセスしようとする 'MainWindow'インスタンスへの参照を使用する必要があります。 「クラスは型を指定しない」ということに関しては、おそらくそうではありませんか?実際にA、B、C、Dという名前の型がありますか?あなたはそれらの宣言を表示しません。 – davmac

関連する問題