Statiska medlemmar och metoder i C++

Här diskuteras programmering och utveckling
Användarvisningsbild
svartberg
Inlägg: 140
Blev medlem: 27 mar 2007, 00:07
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS
Ort: Västervik / Trollhättan

Statiska medlemmar och metoder i C++

Inlägg av svartberg »

Hejsan.
Är det någon som vet hur det fungerar med statiska medlemmar och funktioner när man jobbar med c++. Jag har gjort en klass där en av mina funktioner är static. Har lite funderingar som följer här nedan:

Först o främst vet jag inte ens vad static menas när en metod deklareras så i c++. I java innebär det att metoden är en klassmetod som kan anropas utan att ha en instans av klassen.

T.ex. i klassen JOptionPane

Kod: Markera allt

JOptionPane.showMessageDialog ();

Fungerar det på samma sätt i C++ ? Vad jag har kommit fram till i alla fall är att statiska funktioner endast kommer åt statiska variabler, d.v.s en o samma variabel som gäller för alla instanser av klassen.
Kan andra metoder från klassen som inte är statiska, arbeta med statiska variabler som exempelvis tilldela dom ett nytt värde?
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

SV: Statiska medlemmar och metoder i C++

Inlägg av per9000 »

svartberg skrev: Hejsan.
Är det någon som vet hur det fungerar med statiska medlemmar och funktioner när man jobbar med c++. Jag har gjort en klass där en av mina funktioner är static. Har lite funderingar som följer här nedan:

Först o främst vet jag inte ens vad static menas när en metod deklareras så i c++. I java innebär det att metoden är en klassmetod som kan anropas utan att ha en instans av klassen.

T.ex. i klassen JOptionPane

Kod: Markera allt

JOptionPane.showMessageDialog ();

Fungerar det på samma sätt i C++ ? Vad jag har kommit fram till i alla fall är att statiska funktioner endast kommer åt statiska variabler, d.v.s en o samma variabel som gäller för alla instanser av klassen.
Kan andra metoder från klassen som inte är statiska, arbeta med statiska variabler som exempelvis tilldela dom ett nytt värde?
Från http://en.wikipedia.org/wiki/Static_method :
"...As mentioned above, a method may be declared as static (or shared in Visual Basic and class in Object Pascal), meaning that it acts at the class level rather than at the instance level. A static method cannot refer to a specific instance of the class (i.e. it cannot refer to this, self, Me, etc.)..."

Det första jag kommer att tänka på är kanske Math.Sin(x) som bra exempel på statisk metod. Att det kommer använda till exempel Math.Pi är väl också ganska rätt fram.

Om du själv har en klass som har både statiska och icke-statiska funktioner och variabler känns det väl rätt fram att en icke-statisk metod måste kunna använda en statisk.

Jag är ingen hejare på C++, men jag har jobbat en del med C# och jag är ganska säker på att båda språken + Java + alla andra kör på samma sätt med statiska.

/Per
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
svartberg
Inlägg: 140
Blev medlem: 27 mar 2007, 00:07
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS
Ort: Västervik / Trollhättan

SV: Statiska medlemmar och metoder i C++

Inlägg av svartberg »

Det där du skrev med Math.Sin(x) var ett bra exempel. Du gör alltså ingen instans av klassen math (eller om det är en struct :) )

Hursomhelst har jag kommit fram till att static i c++ världen fungerar lite annorlunda mot java, och troligtvis C#, har inte jobbat något med C# men språket tycker jag har fler likheter med java än c++.

En static funktion i en c++ klass är samma sak som en static funktion i java och c#, funktionen används inte för en instans utan som en yttre funktion du kan använda utan att ha en instans av klassen.

Den lilla skillnaden är när det gäller static variabler. I java och C#, är en static variabel i en klass en gemensam klassvariabel för alla instanser av klassen. T.ex. skapar du 4 instanser av klassen Form / JFrame och har en static int count så håller denna variabel reda på hur många objekt du skapat av klassen. Och du kommer åt den på samma sätt som en vanlig instansvariabel.

I c++ dock, kan vanliga funktioner i klasser arbeta med static variabler (tror jag åtminstone 8) ). Men syntaxen ser lite skum ut tycker jag för att göra det.

Kod: Markera allt

// c++ kodexempel

//MyClass.h
class MyClass{

public:
  static int GetCount() { return count; }

private:
  static int count;
 };

 // MyClass.cpp
#include "MyClass.h"
int MyClass::count;
count = 0;

Detta tycker jag ser lite skumt ut om man jämför med java och C#. För det första tycker jag det låter konstigt att static variabeln som är private kan initieras på detta sätt. Sedan att man måste skriva int MyClass::count; för att få kompilatorn att förstå att denna variabel finns i klassen.
Antar att såna här saker har "förfinats" bort i högnivåspråk som java och C#. C++ är kanske maktfullt, men lite krångligt i många fall =)

Är inte så duktig på varken C# eller C++ så rätta mig gärna om jag har fel någonstans :)
Skriv svar

Återgå till "Programmering och webbdesign"