2013-11-26 36 views
1

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

static foo myFoo; 

作为主要功能之上的全局变量,然后将必要的数据从用户获取后(我们称之为“可变”),我​​可以打电话:

myFoo = new foo(variable); 

我却得到一个错误与此:

error: no matching function for call to ‘foo::foo()’

引用符合static foo myFoo;

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

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

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

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

以上的main(),然后定义了一些功能,我可以做

myFoo.setVar(variable); 

,当我需要。对我来说,这是非常丑陋的,并且需要包含函数setVar,除了避开这个问题之外,它没有明确的目的。思考?你有

+0

'myFoo =新富(可变)'你不能有' new'这里 –

+0

static foo myFoo;是对象和新foo(变量);是指针指向对象的指针吗? – Nik

+0

您的解决方案很好。但是,你的意思是'static foo * myFoo;',以便'myFoo = new foo(variable);'实际上可以工作。 – Peter

回答

6

一种选择是让你的静态实例指针:

static foo *myFoo = NULL; 

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

或者你可能想使用一个默认的构造函数,并做出Init方法来代替。

static foo myFoo; 

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

当你暴露一个变量,你不把它定义为static。删除static关键字,并在标头声明中使用extern

1
static foo myFoo; 

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

试图使用

myFoo = new foo(variable); 

不会编译设置myFoo到的指针。 new foo(...)返回foo*,而不是foo。如果你希望它是一个指针,你需要声明你的静态变量

static foo* myFoo; 

如果你希望它是一个对象,并希望将其设置为默认值以外的东西,你可以实现一个禁止复制赋值运算符和做这样的事情

foo newFoo(variable); 
myFoo = newFoo; 

,或者提供一个初始化函数的事实后改变建筑的值(喜欢在大多数情况下,拷贝赋值,因为这将是不易出错)。

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

您表示您Foo对象不能要正确实例化,直到主函数的一半。这听起来像是你的主函数的前半部分会有一个对象处于不一致的状态。非常危险。 无论如何,有一对夫妇的方式来得到它: 1)如果你想创建你可以使用默认值构造函数静态Foo对象:

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

您现在可以宣布你的Foo对象作为主要 foo myFoo; 和myFoo的变量将“默认” ,或者被初始化没有默认的全局:

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

声明你的Foo对象作为一个全球性的主要 foo myFoo(default);

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

2)使用指针。在main.cpp中声明全局foo * myFoo,并在使用它之前测试指针是否为NULL。通过使用 你初始化你myFoo对象: 现在你的构造并不需要一个默认值,但仍需要变量myFoo = new foo(user_input);

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

(顺便说一句:你知不知道当然,这是全局时,因此应避免皱眉道的)

好运