Droa Seniormester
19. maj 2016 - 18:06 Der er 8 kommentarer

class med uninitialized pointer variabel

Jeg prøver og sætte mig ind i hvad C++ er, og hvordan det fungere anderledes end C# som jeg ser som mit hovedsprog.

Jeg er desværre stødt ind i et problem, allerede i første class jeg er ved og lave, noget jeg simpelthen ikke helt kan se hvad jeg gør forkert.

Jeg har regnet ud det er fordi jeg ikke initializere min poiner variabel, men jeg ved ikke hvordan jeg gør det.

Console.cpp

#include "stdafx.h"
#include "Console.h"
#include <Windows.h>


HANDLE Console::_handle;
CONSOLE_SCREEN_BUFFER_INFO Console::*_pcsbInfo;

int Console::getBufferHeight() {
    getHandle();
    if (GetConsoleScreenBufferInfo(_handle, _pcsbInfo)) {
        return _pcsbInfo->dwSize.Y;
    }

    return 0;
};
int Console::getBufferWidth() {
    getHandle();
    if (GetConsoleScreenBufferInfo(_handle, _pcsbInfo)) {
        return _pcsbInfo->dwSize.X;
    }
    return 0;
};

void Console::getHandle() {
    if (_handle == nullptr) {
        _handle = GetStdHandle(STD_OUTPUT_HANDLE);
    }
};


Console.h

#include <windows.h>

#pragma once
class Console
{
private:
    static HANDLE _handle;
    static CONSOLE_SCREEN_BUFFER_INFO* _pcsbInfo;
    static void getHandle();
public:
    static int getBufferHeight();
    static int getBufferWidth();
};
arne_v Ekspert
19. maj 2016 - 18:32 #1
Den kode ser meget mystisk ud.

Hvad er pointen med alt det static?
Droa Seniormester
19. maj 2016 - 18:57 #2
jeg tænkte jeg bare havde brug for statiske funktioner, da der kun findes et consol vindue et hente data fra, hvad har jeg gjort forkert?
arne_v Ekspert
19. maj 2016 - 19:24 #3
Du har vel ikke gjordt noget forkert.

Men C++ tillader jo funktioner udenfor klasser (C style), saa hvis det er hvad du vil, saa har du vel ikke brug for en klasse.

Jeg mener ioevrigt godt at du kan oprette et ekstra console vindue.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms681944%28v=vs.85%29.aspx
arne_v Ekspert
19. maj 2016 - 19:30 #4
Hvis du crasher p.g.a. pointer saa skal du nok:

static CONSOLE_SCREEN_BUFFER_INFO* _pcsbInfo;
->
static CONSOLE_SCREEN_BUFFER_INFO _pcsbInfo;

if (GetConsoleScreenBufferInfo(_handle, _pcsbInfo)) {
->
if (GetConsoleScreenBufferInfo(_handle, &_pcsbInfo)) {

men jeg er ikke overbevist om at designet er godt.
arne_v Ekspert
20. maj 2016 - 03:56 #5
Noget C++ kode:


#include <iostream>

using namespace std;

#include <windows.h>

class Console
{
private:
    HANDLE handle;
    CONSOLE_SCREEN_BUFFER_INFO pcsbInfo;
    void getHandle();
public:
    Console() { handle = NULL; }
    int getBufferHeight();
    int getBufferWidth();
};

int Console::getBufferHeight()
{
    getHandle();
    if (GetConsoleScreenBufferInfo(handle, &pcsbInfo))
    {
        return pcsbInfo.dwSize.Y;
    }
    else
    {
        throw "GetConsoleScreenBufferInfo failed";
    }
}

int Console::getBufferWidth()
{
    getHandle();
    if (GetConsoleScreenBufferInfo(handle, &pcsbInfo))
    {
        return pcsbInfo.dwSize.X;
    }
    else
    {
        throw "GetConsoleScreenBufferInfo failed";
    }
}

void Console::getHandle() {
    if (handle == NULL) {
        handle = GetStdHandle(STD_OUTPUT_HANDLE);
    }
}

int main()
{
    Console *con = new Console();
    cout << con->getBufferWidth() << " x " << con->getBufferHeight() << endl;
    return 0;
}
Droa Seniormester
25. maj 2016 - 14:21 #6
så selvom man bruger en form for statisk måde at hente sit handle på, skal man stadig ikke bruge static? nu har du aldrig givet nogen dårlige svar, så jeg må bare acceptere at det er sådan man gør, og læse mere ind på hvad static bruges til.

tak for dit svar, ligger du lige et officielt svar?
arne_v Ekspert
25. maj 2016 - 17:21 #7
Der skal bruges static i nogle tilfaelde - men nok faerre end i C# og Java!

Fordi hvis det er all static i C++, saa vil man ofte lave det som rene C style functions.

Jeg kan godt lave ovenstaaende kode som C style functions, hvis du gerne vil set det.
arne_v Ekspert
25. maj 2016 - 17:22 #8
Og et svar.
Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links

Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





Premium
Nomineret til Årets CIO 2020: Alan Jensen og Salling Group har investeret milliarder af kroner i kæmpe omstilling "Det lønner sig rent faktisk sig"
Nomineret til Årets CIO 2020: På toppen af den kæmpe milliardtransformation, som Salling Group har kørt igennem i it-landskabet, høster koncernen nu frugterne. To helt konkrete eksempler viser, hvad Salling Group og CIO Alan Jensen i dag er i stand til.
Computerworld
Stein Bagger gør comeback i ny branche: "De lignede et mafiahold, førte sig frem som nyrige og plaprede løs om urealistiske drømme"
Stein Bagger har skiftet navn og fører sig nu frem i store biler i en helt ny branche, skriver en dansk avis.
CIO
Podcast: Her er seks gode råd om ledelse og digitalisering fra danske top-CIO'er
The Digital Edge: Vi har talt med 17 af Danmarks dygtigste digitale ledere - og samlet deres seks bedste råd om digitalisering og ledelse. Få alle rådene på 26 minutter i denne episode af podcasten The Digital Edge.
Job & Karriere
Se Waoos forklaring: Derfor har selskabet fyret topchef Jørgen Stensgaard med omgående virkning
Waaos bestyrelse opsiger fiberselskabets topchef, Jørgen Stensgaard, der fratræder med omgående virkning. Se hele forklaringen fra Waao her.
White paper
Sådan øger du medarbejdertilfredshed og produktivitet
En af de mest effektive måder at øge medarbejdernes produktivitet og tilfredshed med arbejdspladsen er ved at give frit valg mellem Windows eller Mac, når der skal vælges arbejdscomputer. Samtidig mindskes presset på supporten, mens sikkerhedsniveauet højnes. Med en client-as-a-service aftale kan du lade medarbejderne selv træffe valget, men uden at uden at det behøver at være udfordrende eller ressourcekrævende for virksomheden. Eksempelvis kan du lade partneren håndtere alt fra finansiering, leverance, klargøring og implementering til support og lifecycle-management. Læs mere i denne hvidbog.