C ++: класс, который хранит объект с неизвестным типом в качестве переменной-члена - PullRequest
0 голосов
/ 19 октября 2019

Я новичок в C ++ и пытаюсь определить класс, который использует объект с неизвестным типом. Этот класс должен принять этот объект в качестве аргумента, а затем сохранить его как переменную-член.

Я знал, что мне нужно использовать шаблоны для такого рода проблем. Мне также удалось сделать шаблонную функцию, которая работает, но у меня проблемы с классом. Надеюсь, пример кода прояснит мою проблему.

Просто определите несколько базовых классов для целей тестирования:

#include <iostream>
using namespace std;

class Base
{
public:
    string m_s;

    Base(string s)
    {
        m_s = s;
    }

    void print()
    {
        cout << "Hello " + m_s << endl;
    }
};

class Base2
{
public:
    string m_s;

    Base2(string s)
    {
        m_s = s;
    }

    void print()
    {
        cout << "Hey " + m_s << endl;
    }
};

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

template <typename T>
class Derived
{
public:
    T m_c;

    Derived(T c)
    {
        T m_c = c;
    }

    void print()
    {
        m_c.print();
    }
};

Тестирование:

int main(int argc, char const *argv[])
{
    auto b1 = Base("b1");
    auto b2 = Base2("b2");

    // This will give compile error:
    // no matching function for call to ‘Base::Base()’ 
    auto d1 = Derived<Base>(b1);
    auto d2 = Derived<Base2>(b2);
    d1.print();
    d2.print();
}

С другой стороны, если я просто определяю шаблон функции, он работает без проблем.

template <typename T>
void print(T c)
{
    c.print();
}

int main(int argc, char const *argv[])
{
    auto b1 = Base("b1");
    auto b2 = Base2("b2");

    // This works!
    print(b1);
    print(b2);

} 

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 19 октября 2019

Ваши классы не имеют конструкторов по умолчанию, в этом случае попробуйте следующий код:

 Derived(T c) : m_c(c)
{

}

Или вы можете добавить Base2 () {} и Base () {} к соответствующим классам. Но в этом случае все члены этих классов будут вызывать конструкторы по умолчанию, и вы будете печатать значения по умолчанию.

Также я бы посоветовал вам прочитать правило трех. Это будетпозволит вам лучше понять проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...