C++ [C+;+;]变量跨.cpp文件

C++ [C+;+;]变量跨.cpp文件,c++,file,variables,C++,File,Variables,这是一个愚蠢的问题,必须是一个简单的答案,但经过几个小时的搜索,我找不到答案。我需要做的是有一对.cpp文件,比如main.cpp和help.cpp,它们有一个共享的变量vars1,既可以更改值,也可以检测该值何时更改。对我来说有意义的方法是,我只需在头文件内的类中声明变量,并将该头文件包含在两个.cpp文件中,但这似乎不起作用 这是我的代码副本: #include <iostream> #include <fstream> #include <Windows.h&

这是一个愚蠢的问题,必须是一个简单的答案,但经过几个小时的搜索,我找不到答案。我需要做的是有一对.cpp文件,比如main.cpp和help.cpp,它们有一个共享的变量vars1,既可以更改值,也可以检测该值何时更改。对我来说有意义的方法是,我只需在头文件内的类中声明变量,并将该头文件包含在两个.cpp文件中,但这似乎不起作用

这是我的代码副本:

#include <iostream>
#include <fstream>
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include "variables1.h"

using namespace std;

int main(){
variables1 vars1;

do {
    cout << "Welcome\n If you need help, type 'yes' now\n";
    cin.getline(vars1.input, 1024);
    if (strcmp(vars1.input, "yes") == 0 || strcmp(vars1.input, "Yes") == 0){
        vars1.helpvar = true;
        cin.get();
    }
    else{
        cout << "Okay then, glad that you know your way around\n";
    }
    cin.clear();
    cout << "What would you like to do?\n";
    cin.getline(vars1.input, 1024);
    if (strcmp(vars1.input, "logon" ) == 0 ) {

    }
} while (0 == 0);
}

实际上,您正在为主文件和help.cpp创建两个不同的对象,并分别为它们设置helpvar变量。您想要的是让help.cpp和main都使用一个对象,只修改helpvar变量的一个实例。

将帮助函数更改为与

int help(const variables1& myHelpobject ){
    if (myHelpobject.helpvar == true) {
            cout << "detecting";
    }
}
您之前所做的是创建一个独立的帮助对象


这里我们在main中创建对象,然后将对它的引用传递给函数。

使用的技术取决于变量的用途

如果它是某种全局参数,您必须在所有代码中使用,最简单的方法是将其定义为全局变量:

extern variables1 vars1;  //outside all functions 
主文件:

variables1 vars1;  // outside all functions
int main(){
...
}
在variables1.h或使用变量的其他cpp文件中:

extern variables1 vars1;  //outside all functions 
但是,在类中初始化和维护这些变量的代码也应该在类中定义。例如,构造函数应在默认情况下定义这些值,例如启用或禁用帮助


如果变量用于在代码的不同部分之间进行通信,特别是如果某些代码的主要目标是处理这些变量的内容,那么最好通过将变量作为参数传递(如果通信是双向的,则通过引用(&))或通过值来明确这一点

发布的代码有两个主要问题:

int help()
永远不会运行

需要调用此函数才能运行。无论
vars1.helpvar的值是多少,都不会有这样的操作。您永远不会看到
检测“
输出

考虑添加带有函数定义的help.hpp,并从
main
调用函数

vars1.helpvar
不在main和
int help()之间共享

目前您有两个
variables1
的实例,
helpvar
是一个成员变量,因此每个实例都有一个单独的副本

你可以:

  • 使
    helpvar
    成为
    variables1
  • main
    help
    之间共享一次
    变量1的实例

  • 静态变量的使用很可能会在以后出现设计问题,因此我倾向于选择2。

    您从哪里得到错误?您可以使用
    extern T variable
    或静态成员变量来共享它。首先在
    private
    部分的一个类中声明变量,并使用允许该值的
    public
    函数使用此类实例时要修改的变量的。在此例程中,您可以在更改此值时触发需要发生的过程。请记住,你说分享价值不仅重要,而且当价值确实改变时,它也触发另一个过程。我建议一些开始的C++文章,在这个例子中“最简单”在长时间内不等同于“右测试”。我猜总结它的一个好方法是“我最不想让你在同行代码审查中受到抨击。“同行代码审查是短期的。“长期运行”是指应用程序在10年内仍在运行并可维护。在某些情况下,使用所有可用的语言构造使某些全局参数全局化更容易,而不是通过在任何地方强制附加与函数本身不相关的参数来争论函数设计。但这是一个需要逐案讨论的架构问题。这是逐案的。然而,使用全局架构是正确的架构选择的情况随着代码库的大小和复杂性呈指数级下降,这正是您引用的原因:可维护性。如果在一个线程中只有两个函数访问给定的全局函数,那么语义很容易理解。如果10个函数在2个线程中执行,则很困难。如果在20个线程中执行200次,这几乎是不可能的。在项目开始时,最好不要使用globals来避免这个问题;然而,这正是你刚刚教这个新程序员要做的。我不想不惜一切代价推广全局变量。我只是说在某些情况下它们是有用的,我们不应该被教条蒙蔽。如果编写多线程,我在回答中提出的建议完全可以管理:拥有一个适当的类并控制对变量的访问,将允许内置一些互斥访问控件,或者在不改变项目其余部分设计的情况下定义原子。
    variables1 vars1;  // outside all functions
    int main(){
    ...
    }
    
    extern variables1 vars1;  //outside all functions