Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Primeros pasos en C++

Estas en el tema de Primeros pasos en C++ en el foro de C/C++ en Foros del Web. Buenas noches, yo hace rato que programo en C, y no usaba visual c++ hace rato. Necesitaria un ejemplo completo de una clase simple con ...
  #1 (permalink)  
Antiguo 02/12/2013, 19:48
 
Fecha de Ingreso: octubre-2009
Mensajes: 73
Antigüedad: 14 años, 6 meses
Puntos: 0
Primeros pasos en C++

Buenas noches,

yo hace rato que programo en C, y no usaba visual c++ hace rato. Necesitaria un ejemplo completo de una clase simple con su uso.

Tengo este ejemplo mio y cuando la instancio y genero el codigo de las funciones, tengo dudas (y errores) ya que no se si se usa :: o -> o . y el autocompletado de codigo no me genera los atributos... asi que no entiendo.

Yo tengo esto:

prueba.h

#pragma once
class prueba
{
public:

prueba(void)
{
edad=0;
}

void prueba::escribe()
{
edad=3;
}
~prueba(void)
{
}

private:
int edad;
};

Y por otro lado, el programa principal.. en el about es donde quiero poner cosas:

p1.cpp

// p1.cpp: define el punto de entrada de la aplicación.
//

#include "stdafx.h"
#include "p1.h"
#include "prueba.h"

#define MAX_LOADSTRING 100

// Variables globales:

HINSTANCE hInst; // Instancia actual
TCHAR szTitle[MAX_LOADSTRING]; // Texto de la barra de título
TCHAR szWindowClass[MAX_LOADSTRING]; // nombre de clase de la ventana principal

// Declaraciones de funciones adelantadas incluidas en este módulo de código:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: colocar código aquí.
MSG msg;
HACCEL hAccelTable;

// Inicializar cadenas globales
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_P1, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Realizar la inicialización de la aplicación:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_P1));

// Bucle principal de mensajes:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}



//
// FUNCIÓN: MyRegisterClass()
//
// PROPÓSITO: registrar la clase de ventana.
//
// COMENTARIOS:
//
// Esta función y su uso son sólo necesarios si desea que el código
// sea compatible con sistemas Win32 anteriores a la función
// 'RegisterClassEx' que se agregó a Windows 95. Es importante llamar a esta función
// para que la aplicación obtenga iconos pequeños bien formados
// asociados a ella.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_P1));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_P1);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);
}

//
// FUNCIÓN: InitInstance(HINSTANCE, int)
//
// PROPÓSITO: guardar el identificador de instancia y crear la ventana principal
//
// COMENTARIOS:
//
// En esta función, se guarda el identificador de instancia en una variable común y
// se crea y muestra la ventana principal del programa.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // Almacenar identificador de instancia en una variable global

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//
// FUNCIÓN: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PROPÓSITO: procesar mensajes de la ventana principal.
//
// WM_COMMAND : procesar el menú de aplicación
// WM_PAINT : pintar la ventana principal
// WM_DESTROY : enviar un mensaje de finalización y volver
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
prueba *p; ///////////////////////// ESTA BIEN DECLARADO????????????
PAINTSTRUCT ps;
HDC hdc;


switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Analizar las selecciones de menú:
switch (wmId)
{
case IDM_ABOUT:
p=new(prueba); // LO CREO ASI, ESTA BIEN???????????
p.escribe(); ///////////////////EL ERROR LO MARCA AQUIIIIII

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: agregar código de dibujo aquí...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Controlador de mensajes del cuadro Acerca de.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
  #2 (permalink)  
Antiguo 03/12/2013, 11:41
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Primeros pasos en C++

Antes de nada, tienes que indentar el codigo.

Ahora, el CALLBACK es una funcion que se ejecuta mas de una vez, pero me imagino que solo quieres una instancia de tu clase, luego o la declaras global o la declaras static. A parte está lo de si quieres la clase reservada de forma dinamica o estatica; dependiendo de lo que tengas querras una cosa u otra. Supongamos que la quieres dinamica tal como tienes en el ejemplo, la declaras como static y la generas en el case; esto implica otra cosa: en el mensaje WM_CREATE tienes que asignar nulo al puntero, y cuando quieras finalizar el uso de la clase debes liberarla con delete.

Por lo de :: o -> revisa tus apuntes, no tiene nada que ver una cosa con otra. El :: es el modificador para el nombre de un componente de una clase; el -> indica referencia de acceso dentro de un puntero. Si generas la clase dinamica tendras que usar la referencia, si no pues no hará falta:

Código C++:
Ver original
  1. //generacion dinamica
  2. MiClase *ptr_miclase;
  3. ptr_miclase = new MiClase();
  4. ptr_miclase->metodo();
  5. delete ptr_miclase;
  6.  
  7. //generacion estatica
  8. MiClase miclase;
  9. miclase.metodo();

Saludos
vosk

Última edición por vosk; 03/12/2013 a las 11:53

Etiquetas: funcion, int, nombre, pasos, primeros, programa, string, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:30.