Multiple Constructor


Multiple Constructor

A class may have multiple constructors that can be used to create an object. For instance, a book may be created using the default constructor (with no parameters), or a book may be created by passing the number of its pages as shown in the code below.
Una clase puede tener varios constructores que pueden ser usados para crear un objeto. Por ejemplo, un libro puede ser creado usando el constructor de defecto (sin ningún parámetro), o un libro puede ser creado pasando el número de sus páginas como se muestra el código de abajo.

Problem 1
Add a second constructor to the Book class in the Library project and test the code.
Agregue un segundo constructor a la clase Book en el proyecto de Library y pruebe el código.

Book.h
#pragma once
class Book
{
public:
     Book(void); // Default Constructor
     Book(int numbPages); // Second Constructor
     ~Book(void);
     void SetNumbPages(int numbPages);
     int GetNumbPages();
     __declspec( property( get=GetNumbPages, put=SetNumbPages ) ) int NumbPages;

     double price;
     int year;
     COLORREF color;
private:
     int numbPages;
};

Book.cpp
#include "StdAfx.h"
#include "Book.h"


Book::Book(void)
{
     this->numbPages = 0;
     this->price = 0.0;
     this->year = 0;
     this->color = RGB(0, 0, 0);
}

Book::Book(int numbPages)
{
     this->numbPages = numbPages;
     this->price = 0.0;
     this->year = 0;
     this->color = RGB(0, 0, 0);
}

Book::~Book(void)
{
}

void Book::SetNumbPages(int numbPages)
{
     if (numbPages <= 50) return;//throw L"A book must have at least 50 pages";
     if (numbPages >100) return; //throw L"A book must have at the most 100 pages";
     this->numbPages = numbPages;
}

int Book::GetNumbPages()
{
     return numbPages;
}

Library.cpp
...

void Library::Window_Open(Win::Event& e)
{
     Book bookA;
     bookA.NumbPages = 52;
     Book bookB(20);
     wstring text;
     Sys::Format(text, L"%d/%d", bookA.NumbPages, bookB.NumbPages);
     this->Text = text;
}

Problem 2
Test the following code. Suppose the Book class is the same as in the previous problem.
Pruebe el código siguiente. Suponga que la clase Book es la misma como en el problema previo.

Library.cpp
...

void Library::Window_Open(Win::Event& e)
{
     Book a, b, c(10);
     a.NumbPages = 60;
     b = c;
     b.NumbPages = 15;
     wstring text;
     Sys::Format(text, L"%d, %d, %d", a.NumbPages, b.NumbPages, c.NumbPages);
     this->Text = text;
}

Problem 3
Test the following code.
Pruebe el código siguiente.

Library.cpp
...
void Library::Window_Open(Win::Event& e)
{
     Book x[3], y(599);
     for(int i = 1; i<3; i++) x[i].NumbPages = i+80;
     wstring text;
     Sys::Format(text, L"%d, %d, %d, %d", x[0].NumbPages, x[1].NumbPages, x[2].NumbPages, y.NumbPages);
     this->Text = text;
}


Problem 4
Discuss the differences between the three implementations of the second constructor in the Book class.
Discuta las diferencias entre las tres implementaciones del segundo constructor en la clase Book.

Book.cpp
//_________________________ Option 1
Book::Book(int numbPages)
{
     this->numbPages = numbPages;
     this->price = 0.0;
     this->year = 0;
     this->color = RGB(0, 0, 0);
}


Book.cpp
//_________________________ Option 2
Book::Book(int numbPages)
{
     this->price = 0.0;
     this->year = 0;
     this->color = RGB(0, 0, 0);
     SetNumbPages(int numbPages);
}


Book.cpp
//_________________________ Option 3
Book::Book(int numbPages)
{
     this->price = 0.0;
     this->year = 0;
     this->color = RGB(0, 0, 0);
     NumbPages = numbPages;
}


Tip
Any constructor must initialize all member variables. If multiple constructors are provided, some of these member variables must be set to values provided during construction of the object, the remaining variables must be initialized appropriately.
Cualquier constructor debe inicializar todas las variables miembro. Si múltiples constructores son proporcionados, algunas de estas variables deben ser fijadas en valores proporcionados durante la construcción del objeto, el resto de las variables deben ser inicializadas en forma apropiada.

Problem 5
Discuss what would happen if the constructors of a class were private.
Discuta que sucedería si los constructores de una clase fueran private.

Problem 6
Modify the ComplexNumb class so the Space program can produce the output shown.
Modifique la clase ComplexNumb de tal forma que el programa Space pueda producir la salida mostrada.

Space.cpp
...

void Space::Window_Open(Win::Event& e)
{
     ComplexNumb a;
     ComplexNumb b(10);
     ComplexNumb c(5, 4);
     tbxOutput.Text = a.GetText();
     tbxOutput.Text += L"\r\n";
     tbxOutput.Text += b.GetText();
     tbxOutput.Text += L"\r\n";
     tbxOutput.Text += c.GetText();
}

SpaceMultiple

Problem 7
Test the following program. Suppose the ComplexNumb class is the same as in the previous problem.
Pruebe el siguiente código. Suponga que la clase ComplexNumb es la misma como en el problema previo.

Space.cpp
...

void Space::Window_Open(Win::Event& e)
{
     ComplexNumb x(10), y(2, 3), z[2];
     z[0] = x.GetConjugate();
     z[1] = y.GetConjugate();
     z[0].imag = 18.2;
     tbxOutput.Text = x.GetText();
     tbxOutput.Text += L"\r\n";
     tbxOutput.Text += y.GetText();
     tbxOutput.Text += L"\r\n";
     tbxOutput.Text += z[0].GetText();
     tbxOutput.Text += L"\r\n";
     tbxOutput.Text += z[1].GetText();
}


Tip
Even though a class can have multiple constructors, this can have only one destructor. Thus, the destructor must be able to destroy the object no matter what constructor was used.
Aún cuando una clase puede tener múltiples constructores, ésta puede tener solamente un destructor. Así, el destructor debe poder destruir el objeto sin importar que constructor se usó.

Constructors with references

In some cases, a reference to an object is necessary to create another object. In these cases, the class constructor must take one reference to another object. The code below illustrates how to create a constructor that takes three references. In this case, the class takes: a double value, a button and a textbox; the member variables: _w, _button and _tbx will be initialized when creating the object. Inside MyClass _tbx can be used as any other textbox, and _button can be used as any other button.
En algunos casos, una referencia a un objeto es necesaria para crear otro objeto. En estos casos, el constructor de la clase debe tomar la referencia hacia otro objeto. El código de abajo ilustra cómo crear un constructor que toma dos referencias. En este caso, la clase toma un botón y una caja de texto, las variables miembro _button y _tbx serán inicializadas cuando se cree el objeto. Dentro de MyClass, _tbx puede ser usada como cualquier otra caja de texto, y _button puede ser usado como cualquier otro botón.

MyClass.h
class MyClass
{
public:
     MyClass(double& weight, Win::Button& button, Win::Textbox& tbx);
     ~MyClass();
private:
     Win::Button& _button;
     Win::Textbox& _tbx;
     double& w;
};

MyClass.cpp
#include "stdafx.h"
#include "MyClass.h"

MyClass::MyClass(double& weight, Win::Button& button, Win::Textbox& tbx) : w(weight), _button(button), _tbx(tbx)
{
}

MyClass::~MyClass()
{
}


Program.cpp
#include "MyClass.h"

void CreateHelp::Window_Open(Win::Event& e)
{
     MyClass mc(btCalculate, tbxOutput);
     ...
};

© Copyright 2000-2019 Wintempla selo. All Rights Reserved. Sep 05 2019. Home