2011-10-19 34 views
0

我已经编写了一个程序,该类有一个用cout和cins编写的构造函数和析构函数。使用模板的空对象或类/空类型

该类包含一个run()函数,我正在使用它作为我的菜单。从菜单中,我想让用户选择选项1.测试构造函数(从类创建一个实例)和2.测试析构函数(退出菜单并在main的结尾处破坏)。

这是我的困境。

在main()为了让我使用run()函数,我必须创建类的实例。但是,我正在使用模板。即。 Class<classType> classTypeRun

为了让我创建一个能够使用run()的实例,我必须指定一个classType,这将调用我不想要的构造函数。我只希望构造函数在用户从菜单中选择时运行。

什么是最有效的方法呢?
我应该为run()函数创建一个继承的类吗?

+0

所以这个'run'功能是'static'和独立的模板参数? –

+0

为什么'run()'成员函数?考虑到你提出的要求(你希望构造函数在用户选择(1)时运行,当用户选择(2)时运行析构函数,这对于模板类的成员函数来说是不可能的, – Chad

+0

K -ballo:是的,它是。 乍得:我发现了,是的,它是成员函数,严格来说是因为我设置为这样,但是,因为我添加了一个菜单,我只想显式调用构造函数/析构函数我在问最好,最快和最有效的方法来实现它。请注意,我绝不是在C/C++中进步的。 –

回答

1

run()免费的功能,如:

template <class T> 
    class MyT 
    { 
    public: 
    MyT(const T& v) : val_(v) {} 

    const T& get() const {return val_;} 
    private: 
    T val_; 
    }; 


    int run() 
    { 
    int opt; 
    cout << " 1) Create\n 2)Destroy\n"; 
    cin >> opt; 
    cin.ignore(); 
    return opt; 
    } 

    int main() 
    { 
    int opt = 0; 
    std::auto_ptr<MyT<int>> t; 

    do 
    { 
     // call the menu... 
     opt = run(); 

     // if the user selected option 1, and we haven't 
     // already constructed our object, do so now. 
     // (Calls MyT<int>()) 
     if(opt == 1 && !t.get()) 
      t.reset(new MyT<int>(10)); 

     // if the user selected option 2 and we have 
     // already constructed our object, delete it now 
     // (Calls ~MyT<int>()) 
     if(opt == 2 && t.get()) 
      t.reset(0); 
    } 
    while(2 != opt); 
    } 
+0

auto_ptr和reset元素有什么作用?这些对我来说是新的,现在我将读到它们。 –

+1

std :: auto_ptr是一个智能指针,它管理对象的生命周期( 'MyT '),我们已经动态分配。 – Chad

+0

非常好。我希望我早点知道auto_ptr及其成员函数!让我来实施这个,我会回报。 –