C++ 全局声明类对象,但不带参数

C++ 全局声明类对象,但不带参数,c++,class,C++,Class,我的情况是:我有一个类foo驻留在foo.cpp中,头文件foo.h包含在main.cpp中。我需要能够在main.cpp中将foo对象声明为全局变量,以便main.cpp中的所有函数都可以使用它,而不必每次都传递对它的引用。问题是,foo的构造函数需要一个变量,该变量直到main.cpp中的main函数完成一半才从用户检索。我想我可以这样做: static foo myFoo; 作为主函数上方的全局变量,在从用户检索到必要的数据后(我们称之为“变量”),我可以调用: myFoo = new

我的情况是:我有一个类foo驻留在foo.cpp中,头文件foo.h包含在main.cpp中。我需要能够在main.cpp中将foo对象声明为全局变量,以便main.cpp中的所有函数都可以使用它,而不必每次都传递对它的引用。问题是,foo的构造函数需要一个变量,该变量直到main.cpp中的main函数完成一半才从用户检索。我想我可以这样做:

static foo myFoo;
作为主函数上方的全局变量,在从用户检索到必要的数据后(我们称之为“变量”),我可以调用:

myFoo = new foo(variable);
但是,我遇到了一个错误:

错误:调用“foo::foo()”时没有匹配的函数

使用
静态foo myFoo引用行

这基本上是说,我试图声明一个foo实例,它的构造函数取零个参数,而没有参数

所以我的问题是:有没有一种方法可以在foo中声明一个标签myFoo作为一个全局变量,这样程序就可以编译,然后在传递了一个变量的情况下使用构造函数来实例化它

我知道我可以这样做:

string temp = "";
static foo myFoo(temp);
在main()上面,然后定义一些函数

myFoo.setVar(variable);

当我需要的时候。对我来说,这是非常难看的,需要包含函数setVar,它除了绕过这个问题之外没有任何实际的目的。想法?

您可以选择将静态实例设置为指针:

static foo *myFoo = NULL;

// Later...
myFoo = new foo(variable);
或者,您可能希望使用默认构造函数并改为使用
Init
方法

static foo myFoo;

// Later...
myFoo.Init( variable );
当您公开变量时,您不会将其定义为
static
。删除
static
关键字,并在标题声明中使用
extern

static foo myFoo;
该行将在静态初始化期间创建一个类型为
foo
的新对象,如果您的程序。它将调用默认构造函数(如果您没有定义一个构造函数,编译器将在某些情况下为您创建一个构造函数-您没有发布足够的代码来知道这里是否是这种情况)。请注意,如果它是在头文件中定义的,则需要
extern
it

尝试使用将
myFoo
设置为指针

myFoo = new foo(variable);
不会编译
newfoo(…)
返回一个
foo*
,而不是
foo
。如果希望它是指针,则需要将静态变量声明为

static foo* myFoo;
如果希望它是一个对象,并希望将其设置为默认值以外的其他值,则可以实现复制分配操作符并执行类似操作

foo newFoo(variable);
myFoo = newFoo;

或者提供一个初始化函数,以便在事后更改构造值(在大多数情况下更喜欢复制赋值,因为它不太容易出错)。

我相信您可能没有定义默认构造函数。定义构造函数后,不会自动定义默认构造函数。这对我很有用:

myclass.hpp:

#ifndef _MYCLASS_
#define _MYCLASS_
class myClass
{
    public:
        int I;
        myClass(int i);
        myClass();
};
#endif
myclass.cpp:

#include "myclass.hpp"

myClass::myClass(int i) : I(i) {};
myClass::myClass() : I(0) {};
main.cpp:

#include "myclass.hpp"

myClass myGlobalClassObject;

int main()
{
    myClass myLocalClassObject(1);
    myGlobalClassObject.I = 2;

    return 0;
}

您的意思是,在主函数运行到一半之前,无法正确实例化foo对象。听起来,在主函数的前半部分,对象的状态不一致。非常危险。 无论如何,有两种方法可以做到: 1) 如果要创建静态foo对象,可以为构造函数使用默认值:

class foo { public: foo( type variable = default ) { ... } ... 在main中将foo对象声明为全局对象
foomyfoo(默认值)

根据“default”在应用程序中是否有意义,您现在可以在main.cpp的函数中使用myFoo对象。如果“default”没有意义,那么在使用myFoo之前,您必须添加一个测试函数。 当然,您还需要另一个成员函数来为用户输入设置“变量”(类似于set_variable(variable);)

2) 使用指针。在main.cpp中声明一个全局
foo*myFoo
,并在使用它之前测试指针是否为空。 现在,构造函数不需要默认值,它仍然需要变量:
foo::foo(类型变量){…}
您可以使用以下命令初始化myFoo对象:
myFoo=newfoo(用户输入)

您可以测试指向NULL的myFoo指针,因为启动代码将所有未初始化的全局变量设置为0

(顺便说一句:你当然意识到全球化是不受欢迎的,因此应该避免)


祝你好运

myFoo=newfoo(变量)
你不能拥有
new
herestatic foo-myFoo;是对象和新的foo(变量);您正在将指针指定给对象吗?您的解决方案很好。但是你的意思是
静态foo*myFoo,这样
myFoo=newfoo(变量)将实际工作。
class foo {
public:
    foo( type variable ) {
        ...
    }
...