C ++初始化模板类的构造函数

时间:2019-04-11 02:54:55

标签: c++

如何在类A中初始化指针类B foo?我是C ++的新手。

Header.h

namespace Core
{
    enum type
    {
        Left, Right
    };

    template<type t>
    class B
    {
    public:
        B(int i);
    private:
        type dir;
        int b = 12;
    };

    class A
    {
    public:
        B<Left> *foo;
    };
}

Source.cpp

namespace Core
{
    template<type t>
    B<t>::B(int i)
    {
        dir = t;
        b = i;
    }
}

int main()
{
    Core::A *a = new Core::A;
    a->foo = new Core::B<Core::Left>(10);

    return 0;
}

2 个答案:

答案 0 :(得分:1)

Source.cpp需要一个#include "Header.h"语句,而Header.h需要一个标题保护。

此外,您需要将B的构造函数的实现移到头文件中。参见Why can templates only be implemented in the header file?

尝试一下:

Header.h:

#ifndef HeaderH
#define HeaderH

namespace Core
{
    enum type
    {
        Left, Right
    };

    template<type t>
    class B
    {
    public:
        B(int i);
    private:
        type dir;
        int b = 12;
    };

    class A
    {
    public:
        B<Left> *foo;
    };

    template<type t>
    B<t>::B(int i)
    {
        dir = t;
        b = i;
    }
}

#endif

Source.cpp

#include "Header.h"

int main()
{
    Core::A *a = new Core::A;
    a->foo = new Core::B<Core::Left>(10);
    //...
    delete a->foo;
    delete a;
    return 0;
}

我建议通过内联B的构造函数并为A提供一个初始化foo的构造函数来进一步:

Header.h:

#ifndef HeaderH
#define HeaderH

namespace Core
{
    enum type
    {
        Left, Right
    };

    template<type t>
    class B
    {
    public:
        B(int i)
        {
            dir = t;
            b = i;
        }

    private:
        type dir;
        int b = 12;
    };

    class A
    {
    public:
        B<Left> *foo;

        A(int i = 0)
            : foo(new B<Left>(i))
        {
        }

        ~A()
        {
            delete foo;
        }
    };
}

#endif

Source.cpp

#include "Header.h"

int main()
{
    Core::A *a = new Core::A(10);
    //... 
    delete a;
    return 0;
}

答案 1 :(得分:0)

  

如何在类A内初始化指针类B foo?

选项1

用一个假定值构造一个B<Left>

class A
{
   public:
    B<Left> *foo = new B<Left>(0);
};

选项2

添加A的构造函数,该构造函数接受可用于构造int的{​​{1}}。

B<Left>

警告语

在深入研究类中对象的指针之前,请考虑以下事项:

  1. What is The Rule of Three?
  2. https://en.cppreference.com/w/cpp/memory,特别是class A { public: A(int i) : foo(new B<Left>(i)) {} B<Left> *foo; }; shared_ptr