C++ наследование операторов - Вопросы по С+

Вопрос C++ наследование операторов

Регистрация
6 Ноя 2013
Сообщения
105
Репутация
0
Спасибо
0
Монет
0
#include<iostream>

using namespace std;

class animal

{

string name;

string color;

int age;

public:

virtual void speak() = 0;

animal()

{

name = "none";

color = "none";

age = 0;

}

void print()

{

cout << "name = " << name << endl;

cout << "color = " << color << endl;

cout << "age = " << age << endl;

}

void set_name(string a)

{

name = a;

}

void set_color(string a)

{

color = a;

}

void set_age(int a)

{

age = a;

}

void operator=(string name)

{

set_name(name);

}

};

class cat : public animal

{

public:

void speak() override

{

cout << "meow!" << endl;

}

cat():animal()

{



}

cat(string name):cat()

{

set_name(name);

}

cat(string name, string color):cat(name)

{

set_color(color);

}

cat(string name, string color, int age):cat(name, color)

{

set_age(age);

}

};

int main()

{

cat a;

a = ("Tom");

return 0;

}





Не наследуется оператор. в строке a = ("Tom"); компилятор пишет что нет подходящей функции, хотя она описана в родительском классе. если реализую оператор= в классе cat то все работает
 
Регистрация
25 Сен 2013
Сообщения
92
Репутация
0
Спасибо
0
Монет
0
#include <iostream>
#include <string>
using namespace std;

class animal
{
string name;
string color;
int age;
public:
virtual void speak() = 0;
animal()
: name("none"), color("none"), age(0)
{
}
void print()
{
cout << "name = " << name << endl;
cout << "color = " << color << endl;
cout << "age = " << age << endl;
}
void set_name(const string& a)
{
name = a;
}
void set_color(const string& a)
{
color = a;
}
void set_age(int a)
{
age = a;
}

animal& operator=(const string& name)
{
set_name(name);
return *this;
}
};

class cat : public animal
{
public:
using animal::eek:perator=;

void speak() override
{
cout << "meow!" << endl;
}
cat() : animal()
{
}
cat(const string& name) : cat()
{
set_name(name);
}
cat(const string& name, const string& color) : cat(name)
{
set_color(color);
}
cat(const string& name, const string& color, int age) : cat(name, color)
{
set_age(age);
}
};

int main()
{
cat a;
a = "Tom";
a.print();
return 0;
}
 
Регистрация
26 Дек 2013
Сообщения
85
Репутация
0
Спасибо
0
Монет
0
a = string("Tom"); И это ВСЁ, что надо поменять в твоём коде, чтобы он заработал.
Ты пытаешься присвоить не string, а *char. А операции присваивания для указателя на символ у тебя нет.
 
Регистрация
13 Дек 2013
Сообщения
82
Репутация
0
Спасибо
0
Монет
0
Ваша проблема связана с тем, как работает механизм наследования операторов в C++. Оператор присваивания (operator=) не наследуется автоматически, если он не является виртуальным. В вашем случае, вы определили оператор присваивания в базовом классе animal, но он не доступен для объектов класса cat, потому что компилятор не знает, что вы хотите использовать оператор присваивания из базового класса. #include <iostream>
using namespace std;

class animal {
string name;
string color;
int age;
public:
virtual void speak() = 0;

animal() {
name = "none";
color = "none";
age = 0;
}

void print() {
cout << "name = " << name << endl;
cout << "color = " << color << endl;
cout << "age = " << age << endl;
}

void set_name(string a) {
name = a;
}

void set_color(string a) {
color = a;
}

void set_age(int a) {
age = a;
}

// Оператор присваивания
void operator=(const string& name) {
set_name(name);
}
};

class cat : public animal {
public:
void speak() override {
cout << "meow!" << endl;
}

cat() : animal() {}

cat(string name) : cat() {
set_name(name);
}

cat(string name, string color) : cat(name) {
set_color(color);
}

cat(string name, string color, int age) : cat(name, color) {
set_age(age);
}

// Переопределение оператора присваивания
cat& operator=(const string& name) {
animal::eek:perator=(name); // Вызов оператора из базового класса
return *this; // Возвращаем текущий объект
}
};

int main() {
cat a;
a = "Tom"; // Теперь это будет работать
a.print(); // Вывод информации о коте
return 0;
}
 
Регистрация
6 Авг 2013
Сообщения
91
Репутация
1
Спасибо
2
Монет
0
Вот попробуй #include <iostream>
using namespace std;

class animal {
string name;
string color;
int age;
public:
virtual void speak() = 0;

animal() {
name = "none";
color = "none";
age = 0;
}

void print() {
cout << "name = " << name << endl;
cout << "color = " << color << endl;
cout << "age = " << age << endl;
}

void set_name(string a) {
name = a;
}

void set_color(string a) {
color = a;
}

void set_age(int a) {
age = a;
}

// Оператор присваивания для строки
void operator=(string name) {
set_name(name);
}
};

class cat : public animal {
public:
void speak() override {
cout << "meow!" << endl;
}

cat() : animal() {}

cat(string name) : cat() {
set_name(name);
}

cat(string name, string color) : cat(name) {
set_color(color);
}

cat(string name, string color, int age) : cat(name, color) {
set_age(age);
}

// Перегрузка оператора присваивания для объекта cat
cat& operator=(const cat& other) {
if (this != &other) { // Проверка на самоприсвоение
// Здесь можно добавить код для копирования свойств
// Например, если бы у вас были публичные методы доступа
// set_name(other.get_name());
// set_color(other.get_color());
// set_age(other.get_age());
}
return *this;
}
};

int main() {
cat a;
a = ("Tom"); // Использует оператор из animal
return 0;
}
 
Сверху Снизу