Var类中的成员

时间:2016-02-25 04:23:07

标签: c++ templates

我会尝试用一个例子更清楚地解释它。我有一个Square,我希望能够用可变维度(例如

)初始化它

(宽度,长度)=(int,int)或(double,int)或(double,double)等。

我知道如果我希望我的方块有整数边,我会将其声明为int widthint height但是如何声明它以便它可以采用多种形式?

例如:

header.h

    class Square 
    {
        public:
            // Constructor : Initialise dimensions
            Square();

            // Set dimensions
            template< typename T1, typename T2>
            setDim(T1 x, T2 y);

        private:
            // Is this right ????
            template <typename T> T width;
            template <typename T> T height;
    };

此外,如果我创建广场,我将如何将变量初始化为0。

e.g:

src.cpp

Square::Square()
{
    // Would this be correct ???
    width = 0;
    height = 0;
}

1 个答案:

答案 0 :(得分:1)

这是可行的,如果我正确理解问题,你需要两种不同的宽度和高度类型(并注意这是一个矩形,而不是方形,从技术上讲)。

#include <iostream>

template <typename W, typename H>
class Rect {
    W width;
    H height;
public:
    Rect(const W w, const H h): width(w), height(h) {}
    Rect(): width(0), height(0) {}
    W get_width() { return width; }
    H get_height() { return height; }
};

template <typename W, typename H>
void show_rect(Rect<W, H> r)
{
    std::cout << r.get_width()
              << "x"
              << r.get_height()
              << "="
              << r.get_width() * r.get_height()
              << std::endl;
}

int main()
{
    show_rect(Rect<int, int>{});
    show_rect(Rect<double, long>{0.3, 8});
}

您可以看到如何重载构造函数以使用默认值进行初始化。您还可以看到如何编写一个函数,该函数将该类的对象作为参数。

有了这个,我得到:

$ make rect
g++ -std=c++14 -pedantic -Wall -O2    rect.cpp   -o rect
$ ./rect
0x0=0
0.3x8=2.4

但我真的不确定这样做的智慧。我相信有人会在评论中解释:)