3

如果我在 mainwindow.cpp 中定义函数,则该函数可以工作,但是当我在 radiobuttons.cpp 中定义它并尝试从 mainwindow.cpp 调用它时,项目将无法编译。

主窗口.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

单选按钮.cpp

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

    void MainWindow::build_radios()
     {  

    //... some code

     }

主窗口.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.cppmainwindow.cpp。为什么要MainWindow在不同的实现文件中声明一个成员?

于 2012-12-30T22:38:37.310 回答
3

但是当我在 radiobuttons.cpp 中定义它时...

除了你没有定义而是重新声明它。(即使这也是多余的,因为您在该特定文件中包含了类的头文件。)错误消息几乎说明了问题所在:

不允许成员函数重新声明

当你声明MainWindow类时,你在void build_radios();里面有声明——它本身就足以声明方法。在 .cpp 文件中,仅实现它就足够了,即仅提供定义-您已经有一个声明,来自头文件中的类声明。

(实际上,您也有一个定义,但它在radiobuttons.cpp文件中 - 它应该在mainwindow.cpp. 将类的所有方法放入一个实现文件中,不要将它们分散在多个文件和类中......并且。 .. 和...)

于 2012-12-30T22:39:30.277 回答