3

mainwindow.cppで関数を定義すると、関数は機能しますが、radiobuttons.cppで定義し、mainwindow.cppから呼び出そうとすると、プロジェクトはコンパイルされません。

mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H        
    #include <QMainWindow>

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
        Q_OBJECT

        public:
            explicit MainWindow(QWidget *parent = 0);

            void build_radios();  //this function

            ~MainWindow();

    };    
#endif // MAINWINDOW_H

radiobuttons.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

    void MainWindow::build_radios()
     {  

    //... some code

     }

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

void MainWindow::radio_buttons();   //error: C2761: 'void MainWindow::build_radios(void)' : member function redeclaration not allowed

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

{

radio_buttons();

}
4

2 に答える 2

5

これは定義ではありません。コンパイラはこれをクラス定義外のメンバー関数の宣言と見なしますが、これは不正です。その行を削除するだけです。そもそもそこにあるべきではなく、役に立たない。

実際、一貫性を保つために、実際の定義をからradiobuttons.cppに移動します。別の実装ファイルでメンバーをmainwindow.cpp宣言するのはなぜですか?MainWindow

于 2012-12-30T22:38:37.310 に答える
3

しかし、radiobuttons.cppで定義すると...

定義せずに再宣言することを除いて。(そして、その特定のファイルにクラスのヘッダーファイルが含まれているので、それでも冗長です。)エラーメッセージは、問題が何であるかをほぼ示しています。

メンバー関数の再宣言は許可されていません

MainWindowクラスを宣言すると、void build_radios();内部に宣言があります。それ自体で、メソッドを宣言するのに十分です。.cppファイルでは、それだけを実装するだけで十分です。つまり、定義のみを提供します。ヘッダーファイルのクラスの宣言から、すでに宣言があります。

(実際には、定義もありますが、radiobuttons.cppそれはファイル内にあるはずmainwindow.cppです。クラスのすべてのメソッドを1つの実装ファイルに適合させ、複数のファイルやクラスに分散させないでください...そして。 .. と...)

于 2012-12-30T22:39:30.277 に答える