Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Непонятный вызов класса в C++ (http://forum.oszone.net/showthread.php?t=280010)

assch 29-03-2014 19:30 2330296

Непонятный вызов класса в C++
 
Вложений: 1
Когда изучал классы в C++ на уроках было показано два примера
как можно пользоватся классами в коде
Например на основе трёх файлов:

main.cpp

Код:

#include <iostream>
#include <string>
using namespace std;
#include "SharedConfig.h"
#include "SharedConfig.cpp"

int main()
{
// Первый способ с последующим вызовом через "."
CSharedConfig class1;

cout << "Service ";
cout << class1.GetAppVersion() <<endl;
cout << endl;

// Второй способ с последующим вызовом через "->"
CSharedConfig *class2 = new CSharedConfig;

cout << "Service ";
cout << class2->GetAppVersion() <<endl;
cout << endl;
delete class2;

system("pause");
return 0;
}

SharedConfig.h

Код:

#pragma once

class CSharedConfig
{
public:
string GetAppVersion();
};

SharedConfig.cpp

Код:

#include "SharedConfig.h"

string CSharedConfig::GetAppVersion()
{
return "0.1.5";
}

Всё работает исправно
А сейчас разбираю один код и мне попался непонятный метод вызова
функции через класс

Код:

#include <iostream>
#include <string>
using namespace std;
#include "SharedConfig.h"
#include "SharedConfig.cpp"

int main()
{
// Третий способ ???
cout << "Service ";
cout << CSharedConfig::Shared()->GetAppVersion() <<endl;
cout << endl;

system("pause");
return 0;
}

Как понять этот способ

Что для этого нужно прописать в файле - SharedConfig.h
то есть как нужно оформить написание класса

И что нужно прописать в файле - SharedConfig.cpp
то есть что нужно вписать помимо функции (функция та что и выше)

Попробую прикрепить функции разбираемого кода

assch 29-03-2014 22:58 2330374

На одном форуме подсказали одно решение для этой надстройки

CSharedConfig::Shared()->GetAppVersion()

Правда оно не совсем то что в разбираемых мною файлах
Но главное что работает

Код:

#include <iostream>
#include <string>
using namespace std;

class CSharedConfig
{
public:
static CSharedConfig* Shared()
{
return new CSharedConfig;
}

string GetAppVersion();
};
 
string CSharedConfig::GetAppVersion()
{
return "0.1.5";
}
 
int main()
{
cout << "Service ";
cout << CSharedConfig::Shared()->GetAppVersion() <<endl;
cout << endl;
system("pause");
return 0;
}

И ещё один способ подсказали объявление функции через класс

CSharedConfig::GetAppVersion()

Код:

#include <iostream>
#include <string>
using namespace std;

class CSharedConfig
{
public:
static string GetAppVersion();
};
 
string CSharedConfig::GetAppVersion()
{
return "0.1.5";
}
 
int main()
{
cout << "Service ";
cout << CSharedConfig::GetAppVersion() <<endl;
cout << endl;
system("pause");
}


deviance 30-03-2014 00:38 2330402

Попробую ответить на вопрос "Как понять этот способ?".
Класс CSharedConfig реализует один из шалонов проектирования ООП - он называется Одиночка.
Метод CSharedConfig::Shared() предоставляет доступ к экземпляру класса и гарантирует, что экземпляр будет только один.
Код:

CSharedConfig* CSharedConfig::Shared()
{
        if (m_Instance == 0)
                m_Instance = new CSharedConfig();
        return m_Instance;
}

Вы внесли ошибку своим изменением:
Код:

static CSharedConfig* Shared()
{
return new CSharedConfig;
}

Память будет "утекать" с каждым вызовом метода CSharedConfig::Shared(). Имейте в виду.


Время: 18:18.

Время: 18:18.
© OSzone.net 2001-