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

时间:2013-11-26 20:37:56

标签: c++ class

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

static foo myFoo;

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

myFoo = new foo(variable);

我收到了一个错误:

  

错误:没有匹配函数来调用'foo :: foo()'

引用static foo myFoo;

所以它基本上是说我试图用一个带零参数的构造函数声明一个foo实例,当没有参数时。

所以我的问题是:有没有办法将foo中的标签myFoo声明为全局变量,以便程序编译,然后实际上可以使用带有变量的构造函数实例化?

我知道我可以做这样的事情:

string temp = "";
static foo myFoo(temp);

在main()之上,然后在我可以做的地方定义了一些函数

myFoo.setVar(variable);

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

4 个答案:

答案 0 :(得分:7)

您拥有的一个选项是使静态实例成为指针:

static foo *myFoo = NULL;

// Later...
myFoo = new foo(variable);

或者您可能希望使用默认构造函数并改为使用Init方法。

static foo myFoo;

// Later...
myFoo.Init( variable );

当您公开变量时,不要将其定义为static。删除static关键字并在标头声明中使用extern

答案 1 :(得分:2)

static foo myFoo;

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

尝试使用

myFoo设置为指针
myFoo = new foo(variable);

不会编译。 new foo(...)会返回foo*,而不是foo。如果您希望它是指针,则需要将静态变量声明为

static foo* myFoo;

如果你想让它成为一个对象,并希望将它设置为默认值之外的其他东西,你可以实现一个复制赋值运算符并执行类似这样的操作

foo newFoo(variable);
myFoo = newFoo;

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

答案 2 :(得分:0)

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

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;
}

答案 3 :(得分:0)

您指示foo对象无法正确实例化,直到主函数中途。这听起来好像你的主函数的前半部分会有一个处于不一致状态的对象。非常危险。 无论如何,有几种方法可以达到它: 1)如果要创建静态foo对象,可以使用构造函数的默认值:

class foo {
public:
    foo( type variable = default ) {
        ...
    }
...

您现在可以将foo对象声明为主要的全局对象 foo myFoo; 和myFoo的变量将初始化为“默认” 或者,没有默认值:

class foo {
public:
    foo( type variable ) {
        ...
    }
...

将你的foo对象声明为main中的全局对象 foo myFoo(default);

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

2)使用指针。在main.cpp中声明一个全局foo * myFoo并在使用之前测试指针是否为NULL。 现在你的构造函数不需要默认值,它仍然需要变量: foo::foo(type variable) { ... } 您可以使用:myFoo = new foo(user_input);

初始化myFoo对象

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

(顺便说一下:你确实意识到全局变形是不受欢迎的,因此应该避免)

祝你好运