从作为类

时间:2016-09-22 19:20:30

标签: c++ templates

这就是我的代码。它有点简化。我试图/想知道我能做什么是消除了属性类构造函数中对参数的需要。即调用no arg构造函数,仍然能够使用struct value1项变量填充classes项变量,而不将它们作为构造函数体的一部分添加。

#include <iostream>

using namespace std;

struct value1
{
    const int item;
    value1( int n ) : item(n) { }
};

struct value2 : public value1
{
    value2() : value1(55) { };
};

template <class T>
class property
{
public:
    property(T stuff);
    void print();
private:
    int item;
};

template <class T>
property<T>::property(T stuff) : item(stuff.item) { }

template <class T>
void property<T>::print()
{
    cout << item << endl;
}

int main()
{
    property<value2> *y = new property<value2>(value2());

    y->print();

    return 0;
}

2 个答案:

答案 0 :(得分:1)

  

调用no arg构造函数,仍然能够使用struct value1项变量填充classes项变量,而不将它们作为构造函数体的一部分添加

听起来你只想要一个工厂方法:

template <class T>
class property {
public:
    property();
    void print();

    static property<T> create(T stuff) {
        property<T> p;
        p.item = stuff.item;
        return p;
    }

private:
    int item;
};

您可以按照以下方式调用它:

auto p = property<value2>::create(value2());

即使我不确定我是否完全满足您的要求 让我知道,如果我不理解这个问题,我会删除答案。

答案 1 :(得分:0)

您可以使用功能对象来实现。 请在下面找到代码:

struct value1
{
    const int item;
    value1( int n ) : item(n) { }
};

struct value2 : public value1
{
    value2() : value1(55) { };
};

template <class T>
class property
{
public:
    property();
    void operator() (T i)
    {
        item = i.item;
    }
    void print();
private:
    int item;
};

template <class T>
property<T>::property()  { }

template <class T>
void property<T>::print()
{
    cout << item << endl;
}

int main()
{
    property<value2> *y = new property<value2>();
    (*y)(value2());
    y->print();
   return 0;
}