bartello Ответов: 1

Нужно передать аргумент функции без временной переменной


Всем привет!
Мне нужно вызвать функцию таким образом:
nmsp.Operate( Nmsp::Derived{}.SetName( "New Name") );


Поэтому я не могу понять, как это реализовать.

Заранее благодарю вас за вашу помощь.

С. П.
если я использую unique_ptr я получаю ошибку:
Visual studio compiler: Error C2259 'Nmsp::Base': cannot instantiate abstract class


Что я уже пробовал:

#include <iostream>

namespace Nmsp
{
	class Base
	{
	public:
		virtual Base& SetName(const std::string& c) = 0;
		virtual ~Base() = default;
		virtual void Func(std::ostream& out) const = 0;

		double param = 1;
	};

	class Derived : public Base
	{
	public:
		Derived()
		{
			std::cout << "Derived Ctor" << ", name=" << name << std::endl;
		}

		Base& SetName(const std::string& c) override
		{
			name = c;
			param = 2;
			std::cout << "SetName" << ", New name=" << name << std::endl;
			std::cout << "SetName" << ", New param=" << param << std::endl;

			return *this;
		}
		void Func(std::ostream& out) const override
		{
			out << "Derived param = " << param << std::endl;
			out << "Derived caption = " << name << std::endl;
		}
		~Derived()
		{
			std::cout << "Derived Dtor" << ", name=" << name << std::endl;
		}
		std::string name = "Default Name";
	};

	class Holder //: public Base
	{
	public:
		~Holder()
		{
			if (basePtr)
				delete basePtr;
		}
		template <typename T>
		void Operate(T& bPtr)
		{
			basePtr = &bPtr;
			//basePtr = std::make_unique<T>(std::move(bPtr));
		}

		void Go(std::ostream& out)
		{
			basePtr->Func(out);
		}
	private:
		Base* basePtr = nullptr;
		// std::unique_ptr<Base> basePtr;
	};
}

int main()
{
	Nmsp::Holder nmsp;

	Nmsp::Base* pBase = new Nmsp::Derived;
	*pBase = Nmsp::Derived{}.SetName("New Name");
	nmsp.Operate( *pBase );

	std::cout << "before go" << std::endl;

	// Need to call the function Operate() in this way
	//nmsp.Operate( Nmsp::Derived{}.SetName( "New Name") );

	nmsp.Go( std::cout );

	return 0;
}

Richard MacCutchan

Ваш вопрос не совсем ясен. В чем же заключается реальная проблема?

bartello

Вот реальная проблема: если я использую комментируемую строку в функции main() вместо трех строк (где вызывается функция Operate ()) - код будет работать неправильно.

Richard MacCutchan

- код будет работать неправильно."
Что это значит?

1 Ответов

Рейтинг:
1

KarstenK

Именно это вы и осуществили. Может быть, вы можете удалить Nmsp, чтобы сделать жизнь проще или писать

using namespace Nmsp;
Функции работы должен производной ссылку на объект в качестве входных данных, поэтому аннулируется
void Operate(T *bPtr)
{
	// reactivated code (why did you use it?)
	basePtr = std::make_unique<T>(std::move(bPtr));
}
должен работать.


bartello

Карстенк, спасибо тебе за ответ, но я прокомментировал этот код, потому что он не работает!
Компилятор Visual studio: ошибка C2259 'Nmsp::Base': не удается создать экземпляр абстрактного класса