2

У меня есть проблема с присвоением междунар на объект, как это:Переход от ВНУТР к нескалярный назначения типа оператора - объекта Int

int main() { 
    Wurzel a; 
    Wurzel b=3; // error: conversion from 'int' to non-scalar type 'Wurzel' requested 

    return 0; 
} 

Мой класс с оператором присваивания:

class Wurzel{ 
private: 
    int wurzelexponent; 
    int wert; 

public: 

    Wurzel(){ 
     wurzelexponent=1; 
     wert=1; 
    } 

    Wurzel& operator =(const Wurzel &w) { 

     wurzelexponent = w.wurzelexponent; 

    } 
}; 

Я должен сделать это с помощью = Оператор

Где находится проблема?

ответ

4

Я должен сделать это с помощью оператора =

Нет, вы не можете. Потому что Wurzel b=3; не является назначением, это инициализация, copy initialization. Как сказано в сообщении об ошибке, для этого вам нужен converting constructor.

class Wurzel{ 
    ... 
public: 
    ... 
    Wurzel(int x) : wurzelexponent(x), wert(1) {} 
    Wurzel(int x, int y) : wurzelexponent(x), wert(y) {} 
    ... 
}; 

затем

Wurzel b = 3;  // Wurzel::Wurzel(int) will be called 
Wurzel b = {3, 2}; // Wurzel::Wurzel(int, int) will be called [1] 

Обратите внимание, что operator= используется только для назначения, такие как:

Wurzel b;  // default initialized 
b = something; // this is assignment, operator=() will be used 

[1] Преобразование конструктора с несколькими параметрами был введен из С ++ 11.

0

Вы пытаетесь определить int: Wurzel b=3;, но ваш оператор = перегружен только для const Wurzel &w. Его параметр равен Wurzel, а не int и int неявно конвертируется в Wurzel. Чтобы исправить ошибку, вы можете добавить другого оператора:

Wurzel& operator =(int i) 
{} 
+1

Нет, не '' оператор = а конструктор будет вызываться для 'Wurzel Ь = 3;'. – MikeCAT

0

Проблема в том, что необходимые функции не определены.

Одним из решений является перегрузка = Оператор принимает int.

Попробуйте это:

class Wurzel{ 
private: 
    int wurzelexponent; 
    int wert; 

public: 

    Wurzel(){ 
     wurzelexponent=1; 
     wert=1; 
    } 
    // this is constructor, not = operator 
    /* 
    Wurzel(int a) { 
     wurzelexponent = a; 
     wert = a; 
    } 
    */ 

    Wurzel& operator =(const Wurzel &w) { 

     wurzelexponent = w.wurzelexponent; 
     return *this; // you should return something 

    } 
    Wurzel& operator=(int a) { 
     // implement as you like 
     wurzelexponent = a; 
     return *this; 
    } 
}; 

int main() { 
    Wurzel a; 
    // this is not = operator but initializing 
    //Wurzel b=3; 

    Wurzel b; 
    b = 3; // this is = opetator, which you say you must use 

    return 0; 
} 
+0

Хорошо, но почему я не могу использовать 'Wurzel b = 3'? Я не могу назначить напрямую? Для вашего решения нужен мой оператор? 'Wurzel & operator = (const Wurzel & w)' – lukassz

+0

Вы можете * инициализировать * (путем вызова конструктора) напрямую, но не можете выполнить * присваивание * (используя оператор присваивания) напрямую. 'Wurzel b = 3;' может быть сделано путем определения правильного конструктора, но вы saiid вы должны использовать '=' operator, поэтому вы должны использовать его где-то - может быть, в определении конструктора? Ваш оператор не нужен в этой программе. – MikeCAT

+0

Определение конструктора? Что ты конкретно имеешь ввиду? Проблема в том, что в классе у меня есть две переменные, и тогда я должен как-то отличить их, если я инициирую их отдельно. – lukassz