外部变量 - 我应该放在哪里?

Dav*_*log 2 c++ extern

我正在开发一个小程序.我使用Qt作为GUI.我有2个表格/课程.MainWindowAddProductDialog.

std::string在我们两个都需要一个变量(确切地说是一个).我需要在AddProductDialog(例如std::string decl = "";)的事件中定义它,我需要在我的MainWindow的函数中使用它的值.

我以为我可以将这个变量放在一个头文件中,每个头文件都包含但显然它不起作用.

现在它有效,但我认为这不是一个好的风格.我在main.cpp中声明并定义了它.

main.cpp:

//includes ...
...

std::string descr; //The variable I need

int main(){ /* blah blah */ }
Run Code Online (Sandbox Code Playgroud)

MainWindow.cpp:

void MainWindow::on_AddProductOptions_clicked()
{
    extern std::string descr;
    AddProductDialog *adp = new AddProductDialog(this);
    adp->setModal(true);

    if(adp->exec() == QDialog::Accepted)
        _Description = descr; //_Description is a private variable of my MainWindow Class
}
Run Code Online (Sandbox Code Playgroud)

AddProduct.cpp

void AddProductDialog::on_cmdOkay_clicked()
{
    extern std::string descr;
    descr = "";
    done(QDialog::Accepted);
}
Run Code Online (Sandbox Code Playgroud)

这当然是有效的.但是有没有办法在标题中声明这个变量并包含它以便我可以使用它?

我一开始尝试过类似的东西,但总是会导致错误:

//include guard
extern std::string descr;
//include guard
Run Code Online (Sandbox Code Playgroud)

主窗口

//include header
//...
std::string descr = "";
//...
Run Code Online (Sandbox Code Playgroud)

addproductdialog

//include header
//...
extern std::string descr;
descr = "whatever";
Run Code Online (Sandbox Code Playgroud)

Bal*_*Pal 5

在我的指南中,您严格禁止在实现文件中使用extern声明.在功能块或命名空间范围内.

Externs必须出现在客户端包含的.h文件和定义它的文件中.这样可以更容易地发现类型或属性的差异.当您将冗余限制为单个实例时,还可以更轻松地进行维护.