如果我在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();
}
答案 0 :(得分:5)
这不是定义,编译器将其视为类定义之外的成员函数的声明,这是非法的。只需删除该行。它不应该在那里,它没有用处。
实际上,将实际定义从radiobuttons.cpp
移至mainwindow.cpp
以保持一致性。为什么在不同的实现文件中声明MainWindow
成员?
答案 1 :(得分:3)
但是当我在radiobuttons.cpp中定义它时......
除非您定义,但重新声明。 (甚至那是多余的,因为你有特定文件中包含的类的头文件。)错误消息几乎说明了问题所在:
不允许成员函数重新声明
当您声明MainWindow
类时,内部有void build_radios();
声明 - 这本身就足以声明该方法。在.cpp文件中,仅仅实现它就足够了,i。即提供仅的定义 - 您已经有一个声明,来自头文件中类的声明。
(事实上,你也有一个定义,但是在radiobuttons.cpp
文件中 - 它应该在mainwindow.cpp
中。将类的所有方法都放在一个实现文件中,不要将它们分布在多个文件和类中......以及......和......)