2016-09-17 8 views
-2

Я хочу присвоить один объект класса другому классу в C++.присваивать один объект класса другому объекту класса в C++

Ex: Существует один класс собак и другой класс Cat. Создайте один экземпляр каждого (d1 & c1). Не хотите использовать STL. Я хочу использовать это заявление в своем коде

d1 = c1;

Программа

class dog 
{ 
    char dc; 
    float df; 
    int di; 
public: 
    void setdata2(char c, float f, int i) 
    { dc = c; df = f; di = i; } 
    void showdata2() 
    { cout <<"char =" << dc <<", float =" << df <<", int =" << di <<endl; } 
}; 


class cat 
{ 
    float cf; 
    int ci; 
    char cc;  
public: 
    void setdata(float f, int i, char c) 
    { cf = f; ci = i; cc = c; } 
    void showdata() 
    { cout <<"float =" << cf <<", int =" << ci <<", char =" << cc <<endl; } 
}; 


int main() 
{ 
    dog d1, d2; 
    cat c1, c2; 

    d1.setdata2('A', 56.78, 30); 
    c1.setdata(12.34, 2, 3); 
    d1.showdata2(); 
    c1.showdata(); 

    d2 = c1;  // Question 1 

    dog d3(c1);  // Question 2 

    dog d4 = c1; // Question 3 

    return 0; 
} 

Пожалуйста, ответьте Вопрос 1/2/3 каждый отдельно.

ответ

1

Я хочу, чтобы назначить объект одного класса к другому объекту класса в C++.

Можно присвоить объект типа A на объект типа B, если A является implicitly convertible к B и B является assignable - или, если B есть оператор в overloaded присваивания, который принимает объекты типа A.

Существует два способа определить преобразование из настраиваемого типа A в несвязанный тип B. Вы можете либо определить conversion function для A, либо вы можете определить converting constructor для типа B.

1) Это назначение копии. Приведенное выше объяснение применимо. Либо определите cat::operator dog(), либо dog::dog(cat) или dog::operator=(cat).

2) Это direct initialization. Это не задание, о котором вы спрашивали. Определение неявного преобразования также работает для этого, но перегруженный оператор присваивания не будет. Однако перегруженный конструктор заменит третью альтернативу.

3) Несмотря на то, что это похоже на синтаксическое назначение, это фактически copy initialization. Те же правила применяются как 2).


PS. Обратите внимание, что вы определяете две переменные по имени d3. Это ошибка.

+0

Можете ли вы мне позвонить, в каком порядке компилятор ищет определение в вашем 1-м ответе. – Lavnesh

+0

не работает[email protected] user2079303 [Ссылка на код] (https://gist.github.com/anonymous/90d6928fdfdbc6287ee0e91b85dc94f2) – Lavnesh

2

Вы не можете назначать между собой два объекта разных классов, которые не связаны друг с другом, пока вы не перегрузите оператор "=" для них.

Вы можете прочитать о перегрузки операторов here