Как инициализировать указатель класса B foo внутри класса A? Я новичок в 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;
}
c++
1
Srdjan M. 11 Апр 2019 в 05:54

2 ответа

Лучший ответ

Source.cpp нужен оператор #include "Header.h", а Header.h - защита заголовка.

Также вам нужно переместить реализацию конструктора B в заголовочный файл. См. Почему шаблоны могут быть реализованы только в заголовочном файле?.

Попробуй это:

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
Remy Lebeau 11 Апр 2019 в 03:11

Как инициализировать указатель класса B foo внутри класса A?

Опция 1

Построить B<Left> с предполагаемым значением.

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

Вариант 2

Добавьте конструктор A, который принимает int, который можно использовать для создания B<Left>.

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

Слово предостережения

Прежде чем вы слишком углубитесь в использование указателей на объекты в ваших классах, рассмотрите следующее:

  1. Что такое правило трех?
  2. https://en.cppreference.com/w/cpp/memory, особенно { {X0}} и unique_ptr.
0
R Sahu 11 Апр 2019 в 03:08