oop — ошибка c2664 в переполнении стека VS 2013

Итак, у меня есть класс под названием «музыка», и когда я пытаюсь скомпилировать код, он дает мне следующие ошибки:

Ошибка 13, ошибка C2664: ‘music :: music (const music) &) ‘: не может конвертировать
аргумент 2 от ‘const char [5]’ до ‘char’ c: \ users \ andrei
Бордеяну \ Документы \ Визуальная студия
2013 \ projects \ mediaplus \ mediaplus \ source.cpp 362 1 MediaPlus

14 IntelliSense: нет экземпляров конструктора «музыка :: музыка»
список аргументов
Типы аргументов: (const char [5], const char [5], const char [4], const char [12], int, const char [8], const char [5],
int) c: \ Users \ Андрея Бордеяну \ Documents \ Visual Studio
2013 \ Проекты \ MediaPlus \ MediaPlus \ Source.cpp 361 11 MediaPlus

Это класс:

// Music class.
class music {
char* song;
properties musicProperties;

public:
music() {
cout << "Apel constructor default muzica." << endl;
this->song = NULL;
}

music(char* songName, char name, char type, char path, float size, char artist, char title, int year) {
cout << "Apel constructor cu parametri muzica." << endl;
if (songName) {
this->song = new char[strlen(songName) + 1];
strcpy(this->song, songName);
musicProperties.setDataMusic(name, type, path, size, artist, title, year);
} else {
songName = NULL;
}
}

music operator=(const music &songName) {
cout << "Supraincarcare operator = pentru muzica." << endl;
this->song = new char[strlen(songName.song) + 1];
strcpy(this->song, songName.song);
}

music(const music &songName) {
cout << "Apel constructor de copiere muzica." << endl;
if (songName.song) {
this->song = new char[strlen(songName.song) + 1];
strcpy(this->song, songName.song);
} else {
song = NULL;
}
}

~music() {
cout << "Apel destructor muzica." << endl;
if (this->song) {
cout << "Apel destructor pentru: " << this->song << endl;
delete[] song;
}
}

friend char* getMusic(const music& m);
friend ostream& operator<<(ostream& out, music& m);
friend istream& operator>>(istream& in, music& m);
};

и это главное:

void main() {
music m1;
music m2("ceva", "ceva", "mp3", "c:\data\music", 38, "Rihanna", "Stay", 2013);
music m3 = m1;
}

Хорошо, попробовал ваши предложения и изменил на строку, и теперь мое приложение выглядит так:

#include <iostream>
#include <string>

using namespace std;

// Properties class.
class properties{
string name;
string type;
string path;
float size;

// For images.
int width;
int height;

// For music.
string artist;
string title;
int year;

public:
properties() {
cout << "Apel constructor default proprietati." << endl;
this->name = "";
this->type = "";
this->path = "";
this->size = 0;
this->width = 0;
this->height = 0;
this->artist = "";
this->title = "";
this->year = 0;
}

properties(string name, string type, string path, float size, int width, int height, string artist, string title, int year) {
cout << "Apel constructor cu parametrii proprietati." << endl;
this->name = name;
this->type = type;
this->path = path;
this->size = size;
this->width = width;
this->height = height;
this->artist = artist;
this->title = title;
this->year = year;
}

char getName() {
return this->name;
}

char getType() {
return this->type;
}

char getPath() {
return this->path;
}

float getSize() {
return this->size;
}

int getWidth() {
return this->width;
}

int getHeight() {
return this->height;
}

char getArtist() {
return this->artist;
}

char getTitle() {
return this->title;
}

int getYear() {
return this->year;
}

void setName(string name){
this->name = name;
}

void setPath(string path){
this->path = path;
}

void setType(string type){
this->type = type;
}

void setSize(float size){
this->size = size;
}

void setWidth(int width){
this->width = width;
}

void setHeight(int height){
this->height = height;
}

void setArtist(string artist){
this->artist = artist;
}

void setTitle(string title){
this->title = title;
}

void setYear(int year){
this->year = year;
}

void setDataGeneral(string name, string type, string path, float size){
cout << "Apel setter general properties." << endl;
setName(name);
setType(type);
setPath(path);
setSize(size);
}

void setDataMusic(string name, string type, string path, float size, string artist, string title, int year){
cout << "Apel setter music properties." << endl;
setName(name);
setType(type);
setPath(path);
setSize(size);
setArtist(artist);
setTitle(title);
setYear(year);
}

void setDataImages(string name, string type, string path, float size, int width, int height){
cout << "Apel setter image properties." << endl;
setName(name);
setType(type);
setPath(path);
setSize(size);
setWidth(width);
setHeight(height);
}

// Constructor de copiere.
properties(const properties& p){
cout << "Apel constructor copiere properties." << endl;
this->name = p.name;
this->type = p.type;
this->path = p.path;
this->size = p.size;
this->width = p.width;
this->height = p.height;
this->artist = p.artist;
this->title = p.title;
this->year = p.year;
}

~properties(){
cout << "Apel destructor properties." << endl;
};
};

// Music class.
class music {
char* song;
properties musicProperties;

public:
music() {
cout << "Apel constructor default muzica." << endl;
this->song = NULL;
}

music(char* songName, string name, string type, string path, float size, string artist, string title, int year) {
cout << "Apel constructor cu parametri muzica." << endl;
if (songName) {
this->song = new char[strlen(songName) + 1];
strcpy(this->song, songName);
musicProperties.setDataMusic(name, type, path, size, artist, title, year);
} else {
songName = NULL;
}
}

music operator=(const music &songName) {
cout << "Supraincarcare operator = pentru muzica." << endl;
this->song = new char[strlen(songName.song) + 1];
strcpy(this->song, songName.song);
}

music(const music &songName) {
cout << "Apel constructor de copiere muzica." << endl;
if (songName.song) {
this->song = new char[strlen(songName.song) + 1];
strcpy(this->song, songName.song);
} else {
song = NULL;
}
}

~music() {
cout << "Apel destructor muzica." << endl;
if (this->song) {
cout << "Apel destructor pentru: " << this->song << endl;
delete[] song;
}
}

friend char* getMusic( music& m); //const
friend ostream& operator<<(ostream& out, music& m);
friend istream& operator>>(istream& in, music& m);
};

// Movies class.
class movies {
char* movie;
properties moviesProperties;

public:
movies() {
cout << "Apel constructor default filme." << endl;
movie = NULL;
}

movies(char* movieTitle, string name, string type, string path, float size) {
cout << "Apel constructor cu parametri filme." << endl;
if (movieTitle) {
this->movie = new char[strlen(movieTitle) + 1];
strcpy(this->movie, movieTitle);
moviesProperties.setDataGeneral(name, type, path, size);
} else {
movie = NULL;
}
}

movies operator=(const movies &movieTitle) {
cout << "Supraincarcare operator = pentru filme." << endl;
this->movie = new char[strlen(movieTitle.movie) + 1];
strcpy(this->movie, movieTitle.movie);
}

movies(const movies &movieTitle) {
cout << "Apel constructor de copiere filme." << endl;
if (movieTitle.movie) {
this->movie = new char[strlen(movieTitle.movie) + 1];
strcpy(this->movie, movieTitle.movie);
} else {
movie = NULL;
}
}

~movies() {
cout << "Apel destructor filme." << endl;
if (this->movie) {
cout << "Apel destructor pentru: " << this->movie << endl;
delete[] movie;
}
}

friend char* getMovies(const movies& m);
friend ostream& operator<<(ostream& out, movies& m);
friend istream& operator>>(istream& in, movies& m);
};

// Images class.
class images {
char* image;
properties imagesProperties;

public:
images() {
cout << "Apel constructor default imagini." << endl;
image = NULL;
}

images(char* imageName, string name, string type, string path, float size, int width, int height) {
cout << "Apel constructor cu parametri imagini." << endl;
if (imageName) {
this->image = new char[strlen(imageName) + 1];
strcpy(this->image, imageName);
imagesProperties.setDataImages(name, type, path, size, width, height);
} else {
image = NULL;
}
}

images operator=(const images &imageName) {
cout << "Supraincarcare operator = pentru imagini." << endl;
this->image = new char[strlen(imageName.image) + 1];
strcpy(this->image, imageName.image);
}

images(const images &imageName) {
cout << "Apel constructor de copiere muzica." << endl;
if (imageName.image) {
this->image = new char[strlen(imageName.image) + 1];
strcpy(this->image, imageName.image);
}
else {
image = NULL;
}
}

~images() {
cout << "Apel destructor muzica." << endl;
if (this->image) {
cout << "Apel destructor pentru: " << this->image << endl;
delete[] image;
}
}

friend char* getImages(const images& i);
friend ostream& operator<<(ostream& out, images& i);
friend istream& operator>>(istream& in, images& i);
};

char* getMovies(const movies& m) {
if (m.movie)
return m.movie;
else
return NULL;
}

char* getImages(const images& i) {
if (i.image)
return i.image;
else
return NULL;
}

char* getMusic(music& songName) { //const
if (songName.song)
return songName.song;
else
return NULL;
}

ostream& operator<<(ostream& out, music& s) {
out << "Melodia este: " << s.song << endl;
return out;
}

istream& operator>>(istream& in, music& s) {
char buffer[20];
cout << "Melodia: ";
in >> buffer;
s.song = new char[strlen(buffer) + 1];
strcpy(s.song, buffer);
return in;
}

void main() {
music m1;
music m2("ceva", "ceva", "mp3", "c:\data\music", 38, "Rihanna", "Stay", 2013);
music m3 = m1;
//cout << getMusic(m2) << endl;
//cout << m2;
//cin >> m2;
//cout << m2;
}

и это дает мне следующие ошибки:

Ошибка 1 ошибка C2440: «возврат»: невозможно преобразовать из «std :: string» в
‘char’ c: \ users \ andrei bordeianu \ Documents \ visual studio
2013 \ projects \ mediaplus \ mediaplus \ source.cpp 50 1 MediaPlus

так далее…

Что я могу сделать, чтобы решить эту проблему? Спасибо!

-2

Решение

Тебе стоит попробовать

music(char* songName, char* name, char* type, char* path, float size, char* artist, char* title, int year);

поскольку char — это одиночный символ, а не указатель на строку C. Еще лучше, вы должны использовать современный класс строк вместо старых указателей.

1

Другие решения

Вы пытаетесь передать строковые типы («ceva», «mp3» и т. Д.) В параметры char. Чтобы решить эту проблему, измените параметры вашего конструктора с char в string,

0

В подписи функция принимает символ за имя, но вы отправляете символ *.
music(char* songName, char name, char type, char path, float size, char artist, char title, int year)

Я думаю, что это должно быть:
music(char* songName, char* name, char* type, char* path, float size, char* artist, char* title, int year)

0

Вы получили свой ответ, используйте строковые типы или указатели.

Что касается того, почему это происходит: вы передаете символы в виде значений, что означает, что они получают свой новый экземпляр массива char, это конфликтует с экземпляром const аргумента. Вот почему первый аргумент (который был явным указателем) не вызвал ошибку.

0