Задать вопрос
Julila
@Julila
вечный студент / german version

В чем ошибка в операторе присвоения?

Подскажите, пожалуйста, в чем ошибка
MP3_Format& operator=(const char* c_string){
		   song = *c_string; 
		   return *this; 
	   }

A1.cpp:79:20: error: conversion from ‘const char [11]’ to non-scalar type ‘MP3_Format’ requested

MP3_Format mp3a = "Summertime";
  • Вопрос задан
  • 1506 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@Mercury13
Программист на «си с крестами» и не только
Здесь нужны две операции: «присвоить» (возможно, автоматически сгенерированная) и конструктор копирования.
class MP3_Format {
   MP3_Format(const char* c_string);
   MP3_Format& operator=(const MP3_Format&);   // велика вероятность, что компилятор её сгенерирует автоматически
};


Если пишете на C++11 — вместо операции «присвоить» нужна операция «присвоить из временного объекта». Опять-таки, годится автоматически сгенерированная.

Семантика языка C++ в этой строчке такова. Мы создаём временный объект MP3_Format("Summertime"), а затем переносим его в наш mp3a. Скорее всего, оптимизатор уберёт этот перенос и инициализирует mp3a на месте, но такова уж семантика…
Ответ написан
@koronabora
Человек
Нужно описание MP3_Format
Ответ написан
Комментировать
@Ariox41
В строке MP3_Format mp3a = "Summertime"; происходит инициализация, а не присваивание.
Код
MP3_Format mp3a{};
mp3a = "Summertime";
должен работать нормально.
Но лучше отдельно реализовать конструктор для const char* и оператор присваивания, как в ответе Mercury13
Ответ написан
Комментировать
Julila
@Julila Автор вопроса
вечный студент / german version
Константин Степанов
class Audioformat {
public:  
	//Audioformat(){mp3_counter++;};
   virtual  string titel() { return ""; }
   virtual  string info()  { return ""; }
  virtual ~Audioformat() {};
   
   
};

int mp3_counter = 0;

class MP3_Format : public Audioformat {
public:
	
	MP3_Format(){mp3_counter++;};
	MP3_Format(MP3_Format &cop){
		MP3_Format(cop.song);
		mp3_counter++;
		}
	
	MP3_Format(const char* c_string) {
		 
        song = (const char*) c_string;
				mp3_counter++;

	}

   
    MP3_Format(string _song): song(_song){
		mp3_counter++;
		 }
		
		 	 
   MP3_Format& operator=(const MP3_Format&){
	   cout<< "Im here" ; 
	   return *this ; 
   }
   
   
		 ~MP3_Format(){mp3_counter--;}
    string titel()      { return  song; }
    string info()    { return "MP3"; }

	 operator string() const { return song; }
	 operator string() { return song; }
	     friend bool operator==(const MP3_Format& lhs, const MP3_Format& rhs)
    { 
        return lhs.song == rhs.song;
    }
    friend bool operator!=(const MP3_Format& lhs, const MP3_Format& rhs)
    {
        return !operator==(lhs,rhs);
    }
       MP3_Format& operator=(const char* c_string){
		   song = *c_string; 
		   return *this; 
	   }
	 
	  
		 
private:
    string song;
};

Тест я не могу изменять
bool test_A1_e() {
#ifdef A1_e
	//MP3_Format mp3a("Summertime");
	MP3_Format mp3a = "Summertime";
	MP3_Format mp3b;
	mp3b = "Summertime";
	cout << mp3b.titel() << " mp3b.titel()"; 
	
	string ta = mp3a.titel();
	string tb = mp3b.titel();

	return (ta == "Summertime" &&
		tb == "Summertime" );
#else
	return false;
#endif
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы