C++ 全局声明类对象,但不带参数
我的情况是:我有一个类foo驻留在foo.cpp中,头文件foo.h包含在main.cpp中。我需要能够在main.cpp中将foo对象声明为全局变量,以便main.cpp中的所有函数都可以使用它,而不必每次都传递对它的引用。问题是,foo的构造函数需要一个变量,该变量直到main.cpp中的main函数完成一半才从用户检索。我想我可以这样做: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
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改为code>,这样myFoo=newfoo(变量)代码>将实际工作。
class foo {
public:
foo( type variable ) {
...
}
...