2016-04-08 3 views
-3

У меня есть 2 вопроса для этой программы:Почему явный конструктор не называется здесь?

  1. Почему я не могу использовать комментируемую структуру, помеченную как ВОПРОС 1. Конструктор копирования вызываются вместо явного конструктора (насколько я могу судить, подпись не является двусмысленной для компилятора для вызова конструктора).

  2. Должен ли я использовать «delete [] p» для указателя, выделенного в ВОПРОС 2, или деструктор удалит его автоматически?

Я новичок в классах, и я пытаюсь получить его, так что спасибо заранее.

#include <iostream> 
using namespace std; 

#define DIM 2 

class Complex { 

    double re, im; 
    char *name; 

public: 

    Complex(double re = 1.0, double im = 1.0) { 

     Complex::name = new char[9]; 
     Complex::re = re; 
     Complex::im = im; 

    }//constructor 

    Complex(const Complex &aux) { 

     re = aux.re; 
     im = aux.im; 
     name = aux.name; 

    }//copy constructor 

    void setReal(double re); 
    void setImag(double im); 
    void setName(char name[9]); 
    double getReal(); 
    double getImag(); 
    char *getName(); 
    Complex sum(Complex); 
    Complex dif(Complex); 
    Complex multi(Complex); 
    Complex div(Complex); 

    ~Complex() { 

    }//destructor 

}; 

void main() { 

    Complex *p = new Complex[DIM]; //QUESTION 2   
            //Is the destructor called or do I have do use delete []p ? 
    char *name[DIM]; 

    for (int i = 0; i < DIM; i++) { 

    //data input  

    } 

    for (int i = 0; i < DIM; i++)  //freeing memory 

     delete name[i]; 

    //Complex sum(), dif(), prod(), div();    //QUESTION 1 
                 //why is this calling the copy constructor instead of the explicit 
                 //constructor with the deault parameters ? 
    Complex sum(*p), dif(*p), prod(*p), div(*p); //initialising with the first element using copy constructor  

    for (int i = 1; i < DIM; i++) { 

     sum=sum.sum(*(p+i));   
     dif = dif.dif(*(p + i)); 
     prod = prod.multi(*(p + i)); 
     div = div.div(*(p + i)); 

    } 

//some data output 

    //delete[]p; 

}//end main 
+2

Вы можете сузить код вниз немного? –

+0

Хорошо, всего одна секунда. –

+0

В любое время, когда вы используете 'new', должно быть соответствующее' delete'; иначе вы пропустите память. –

ответ

2

Грань:

Complex sum(), dif(), prod(), div(); 

не создает Complex переменные sum, dif, prod и div. Он фактически объявляет 4 функции, которые не принимают аргументов и возвращают Complex. Объявите это как так:

Complex sum, dif, prod, div; 

Который работает, как предполагалось

1

Для вашего второго вопроса, вы должны либо установить цикл, чтобы удалить name переменную-член каждого объекта или написать Разрушитель для своего класса и использовать delete []p.

+0

Как в: '~ Complex {delete [] p};' –

+0

Нет, деконструктор должен быть просто 'delete name; 'и в основном коде, когда вы хотите удалить массив своих объектов, просто введите' delete [] p; '. – mask

+1

@mask no, это должно быть 'delete [] name', потому что оно было назначено с помощью' new [] ' – vu1p3n0x

Смежные вопросы