Avatar billede 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();
};
Avatar billede arne_v Ekspert
19. maj 2016 - 18:32 #1
Den kode ser meget mystisk ud.

Hvad er pointen med alt det static?
Avatar billede 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?
Avatar billede 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
Avatar billede 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.
Avatar billede 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;
}
Avatar billede 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?
Avatar billede 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.
Avatar billede arne_v Ekspert
25. maj 2016 - 17:22 #8
Og et svar.
Avatar billede 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. Der sættes "nofollow" på alle links.

Loading billede 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