Ваш предоставленный пример кода на самом деле не использует <tchar.h>
(ваш тип символа должен быть _TCHAR
в этом случае), а скорее базовые c C (не C ++) функции обработки строк .
Идея заменить это на std::string
очень правильная идея, и вы можете sh выбросить учебник, который вы используете для попытки научить вас по-другому.
Код, который вы пытались создать, имеет несколько проблем. Прежде всего, поле члена _type
теперь является std::string
, которое не может быть неявно преобразовано в char*
, поэтому ваше определение функции type
не будет компилироваться. Так как вы все равно изменяете пример, вы можете просто вернуть ссылку const
вашему члену:
class Product {
protected:
std::string _type;
Product() = default;
Product(Product const&) = default;
Product& operator=(Product const&) = default;
Product(Product &&) = default;
Product& operator=(Product &&) = default;
Product(std::string _type) : _type(std::move(_type)) { }
public:
std::string const& getType() { return _type; }
};
Обратите внимание, что я также удалил ошибочный конструктор Coffee()
(я предполагаю, что вы намеревались написать Product
здесь).
Письмо Product() = default;´, we instruct C++ to automatically generate an empty constructor. You may have noticed that this constructor is now
защищено - we do not want the user of your class to be able to create a
Товар` напрямую. (Это может быть неправильно, в зависимости от вашего приложения.)
Я сделал то же самое для операторов копирования и перемещения, чтобы предотвратить разрезание объектов , к чему многие стремящиеся программисты на C ++ которые сначала опускают свои пальцы в спотыкание о наследовании.
Наконец, есть конструктор Product(std::string)
, который инициализирует член _type
.
На следующем шаге вы можете получить из Product
:
class ConcreteProduct : public Product {
public:
ConcreteProduct() : Product("ConcreteProduct") { }
ConcreteProduct(ConcreteProduct const&) = default;
ConcreteProduct& operator=(ConcreteProduct const&) = default;
ConcreteProduct(ConcreteProduct &&) = default;
ConcreteProduct& operator=(ConcreteProduct &&) = default;
};
Обратите внимание, что теперь мы делаем конструкторы копирования и перемещения общедоступными c и можем использовать синтаксис конструктора для непосредственной инициализации базы Product
.
Полный пример